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 通道。