MINA核心结构和处理消息的逻辑流程

x33g5p2x  于2022-03-01 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(319)

1.MINA 核心结构

IoService

最底层的是IOService,负责具体的IO相关工作。这一层的典型代表有IOSocketAcceptor和IOSocketChannel,分别对应TCP协议下的服务端和客户端的IOService。IOService的意义在于隐藏底层IO的细节,对上提供统一的基于事件的异步IO接口。每当有数据到达时,IOService会先调用底层IO接口读取数据,封装成IoBuffer,之后以事件的形式通知上层代码,从而将Java NIO的同步IO接口转化成了异步IO。所以从图上看,进来的low-level IO经过IOService层后变成IO Event。

具体的代码可以参考org.apache.mina.core.polling.AbstractPollingIoProcessor的私有内部类Processor。

IoFilterChain

Mina的设计理念之一就是业务代码和数据包处理代码分离,业务代码只专注于业务逻辑,其他的逻辑如:数据包的解析,封装,过滤等则交由IoFilterChain来处理。IoFilterChain可以看成是Mina处理流程的扩展点。这样的划分使得结构更加清晰,代码分工更明确。开发者通过往Chain中添加IoFilter,来增强处理流程,而不会影响后面的业务逻辑代码。

IoHandler

IoHandler是实现业务逻辑的地方,需要有开发者自己来实现这个接口。IoHandler可以看成是Mina处理流程的终点,每个IoService都需要指定一个IoHandler。

IoSession

IoSession是对底层连接的封装,一个IoSession对应于一个底层的IO连接(在Mina中UDP也被抽象成了连接)。通过IoSession,可以获取当前连接相关的上下文信息,以及向远程peer发送数据。发送数据其实也是个异步的过程。发送的操作首先会逆向穿过IoFilterChain,到达IoService。但IoService上并不会直接调用底层IO接口来将数据发送出去,而是会将该次调用封装成一个WriteRequest,放入session的writeRequestQueue中,最后由IoProcessor线程统一调度flush出去。所以发送操作并不会引起上层调用线程的阻塞。

2.MINA处理消息的逻辑流程

第1种:

  • IOAcceptor 监听网络数据包传入的连接;
  • 为每个新的连接(Connection)创建一个session,同一个端口+ip的后续请求将通过session进行处理;
  • 同一个session收到的所有数据,通过过滤链进行过滤.通过PacketEncoder/Decoder进行有效的编码,解码处理(负责把底层传输的对象拼装为更高一层的对象方便后续的处理,最后传输的数据被交给IOHandler);
  • 最后根据自己的业务需求完成Handler的业务逻辑处理.

第2种:

通过SocketAcceptor 同客户端建立连接;

连接建立之后 I/O的读写交给了I/O Processor线程,I/O Processor是多线程的;

通过I/O Processor 读取的数据经过IoFilterChain里所有配置的IoFilter, IoFilter 进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议;

最后 IoFilter 将数据交给 Handler 进行业务处理,完成了整个读取的过程;

写入过程也是类似,只是刚好倒过来,通过IoSession.write 写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过 I/O Processor 将数据写出到 socket 通道。

相关文章