一、      简介:

Apache Mina Server 是一个网络通信应用框架,Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步 IO 默认使用的是 JAVA NIO 作为底层支持)操作的编程模型。

二、      使用示例:

三、      体系结构:

1.      IoService:

负责具体的IO相关工作。IOService的意义在于隐藏底层IO的细节,对上提供统一的基于事件的异步IO接口。每当有数据到达时,IOService会先调用底层IO接口读取数据,封装成IoBuffer,之后以事件的形式通知上层代码;从图上看,进来的low-level IO经过IOService层后变成IO Event。

在服务端的接口是IoAcceptor,具体实现类是NioSocketAcceptor,对应客户端的接口是IoConnector,实现类是NioSocketConnector;

2.      IoFilterChain:

Mina的设计理念之一就是业务代码和数据包处理代码分离,业务代码只专注于业务逻辑,其他的逻辑如:数据包的解析,封装,过滤等则交由IoFilterChain来处理。开发者通过往Chain中添加IoFilter,来增强处理流程,而不会影响后面的业务逻辑代码。

3.      IoHandler:

实现业务逻辑的地方,需要有开发者自己来实现这个接口;对于Server端和Client端来说都是IoHandler接口的实现类;在Mina中提供了IoHandler的实现类IoHandlerAdapter,业务逻辑代码类只需要继承这个类即可;

4.      IoSession:

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

四、      工作流程:

在服务器端,bind一个端口后,会创建一个Acceptor线程来负责监听工作。这个线程的工作只有一个,调用Java NIO接口在该端口上select connect事件,获取新建的连接后,封装成IoSession,交由后面的Processor线程处理。在客户端,也有一个类似的,叫Connector的线程与之相对应。

Processor线程主要负责具体的IO读写操作和执行后面的IoFilterChain和IoHandler逻辑。Processor线程的数量N默认是CPU数量+1(可以通过配置参数来控制其数量)。前面进来的IoSession会被分配到这N个Processor线程中。默认的策略是session id绝对值对N取模来分配。每个Porcessor线程中都维护着一个selector,对它维护的IoSession集合进行select,然后对select的结果进行遍历,逐一处理,读取数据,以事件的形式通知后面IoFilterChain;以及对写请求队列的flush操作;

通过将session均分到多个Processor线程里进行处理,可以充分利用多核的处理能力,减轻select操作的压力。

最新文章

  1. Apache问题处理服务器访问不了
  2. 参加了iDOF2016会议,发表演讲“油田SOA与云平台的系统思考与实践”
  3. WOW.js – 在页面滚动时展现动感的元素动画效果
  4. Beta版本冲刺———第三天
  5. Windows7、8无法访问其他计算机共享盘
  6. 性能测试-ORACLE性能监控
  7. XMLHttpRequest函数
  8. 解决ext时间插件在谷歌下变宽的BUG
  9. root-systerm-bin是什么program
  10. Ubuntu 12.04 分区方案(仅供参考)
  11. 使用nexus创建maven私有仓库
  12. 利用switch case 来运行咱们结婚吧
  13. N沟道和P沟道MOS FET开关电路
  14. boost uuid 学习笔记
  15. CocosBuilder 多分辨率基础
  16. oracle与sqlserver利用函数生成年月日加流水号
  17. 计算机网络之远程终端协议TELNET
  18. Android Studio 2.3 instant run与miui冲突问题的解决
  19. Ubuntu18.04 VMtools的安装与卸载
  20. 前后台分离开发时遇到循环引用问题"$ref"

热门文章

  1. SharePoint Framework 配置你的SharePoint客户端web部件开发环境
  2. MySQL:安装mysqld系统及基础应用
  3. $_SERVER['URI']
  4. Delphi 10.3实现Android App的动态权限申请
  5. CentOS部署PHP环境
  6. express安装中出现无此命令
  7. iOS原生项目集成React Native模块
  8. 【Maven】Project configuration is not up-to-date with pom.xml错误解决方法
  9. Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ
  10. arm svc