mina基础知识整理
一、 简介:
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操作的压力。
最新文章
- Apache问题处理服务器访问不了
- 参加了iDOF2016会议,发表演讲“油田SOA与云平台的系统思考与实践”
- WOW.js – 在页面滚动时展现动感的元素动画效果
- Beta版本冲刺———第三天
- Windows7、8无法访问其他计算机共享盘
- 性能测试-ORACLE性能监控
- XMLHttpRequest函数
- 解决ext时间插件在谷歌下变宽的BUG
- root-systerm-bin是什么program
- Ubuntu 12.04 分区方案(仅供参考)
- 使用nexus创建maven私有仓库
- 利用switch case 来运行咱们结婚吧
- N沟道和P沟道MOS FET开关电路
- boost uuid 学习笔记
- CocosBuilder 多分辨率基础
- oracle与sqlserver利用函数生成年月日加流水号
- 计算机网络之远程终端协议TELNET
- Android Studio 2.3 instant run与miui冲突问题的解决
- Ubuntu18.04 VMtools的安装与卸载
- 前后台分离开发时遇到循环引用问题";$ref";
热门文章
- SharePoint Framework 配置你的SharePoint客户端web部件开发环境
- MySQL:安装mysqld系统及基础应用
- $_SERVER['URI']
- Delphi 10.3实现Android App的动态权限申请
- CentOS部署PHP环境
- express安装中出现无此命令
- iOS原生项目集成React Native模块
- 【Maven】Project configuration is not up-to-date with pom.xml错误解决方法
- Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ
- arm svc