基于NIO实现的netty框架, 前面讲了NIO的Selector, ServerSocketChannel, SocketChannel, ByteBuffer, 本章节升华以netty框架实现的client-server间的交互。
netty的优点:
零拷贝, 可拓展事件模型, 支持TCP, UDP, HTTP, WebSocket等协议, 支持安全传输, 压缩, 大文件传输, 编解码等!
1. 设计优雅, 提供阻塞和非阻塞的socket, 提供灵活可拓展的事件模型, 提供高度可定制的线程模型。
2. 具有更高的性能和更大的吞吐量, 使用零拷贝最小化了内存消耗
3. 提供安全传输特性
4. 支持多种主流协议, 预置多种编码功能, 支持用户开发私有协议
一. 线程模型1. 传统阻塞IO模型
2. Reactor模型:有三种典型的实现
单Reactor 单线程
单Reactor 多线程
主从Reactor 多线程
Reactor模式指当有多个请求来到服务端时, 由一个主线程进行IO复用监听, 收到事件后, 派发(dispatcher)给相应的处理线程(进程)。
解析主从Reactor模式:
由主线程通过selector监听客服端l连接请求, 分发给Acceptor处理连接请求。
Acceptor处理完之后与客服端建立socket连接, 由MainReactor交由SubReactor处理以后的IO事件
SubReactor将连接加入到自己的连接队列进行监听, 并创建handler对事件进行处理。
当连接上发生事件时, 就会调用对应的handler处理。
Handler通过read从连接上读取请求数据, 将请求数据分发给worker线程进行业务处理。
worker线程会分配真正独立的线程处理真正的业务, 并将数据返回给handler, handler通过send返回给客服端。
二. netty主要是基于主从Reactor的改进简单版的模型
1. BoosGroup 维护Selector, ServerSocketChannel 注册到这个Selector中, 只关注连接事件
2. 当接受到连接请求后, 由accpet()方法获取SocketChannel , 并封装成NIO... 注册到WorkGroup的Selector中,之后专门用来处理IO事件。 当然每个线程对应一个Selector, 可以有多个Selector.
3. workGroup监听到感兴趣的事件就交给Handle处理。
进 阶模型:
1. BoosGroup中可以有多个Selector, 每个都可以接收连接请求并处理,WorkGroup也是一样
2. 每个BoosGroup中的线程循环执行三个步骤:
A. 轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
B. 处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到 WorkerGroup 中某个线程上的 Selector 上
C. 再去以此循环处理任务队列中的下一个事件 3. 每个WorkGroup执行一下三个步骤: A. 轮训注册在其上的 NioSocketChannel 的 read/write 事件( OP_READ/OP_WRITE 事 件) B. 在对应的 NioSocketChannel 上处理 read/write 事件 C. 再去以此循环处理任务队列中的下一个事件 详细版模型:就是把多个Selecot事件循环, 放到一个NioEventLoopGroup, 相当于事件循环组, 每个事件循环相当于一个NioEventLoop, 对应一条线程。每个NioEventLoopGroup可以有多个线程。
每个BossNioEventLoop中循环三个步骤:
step1. select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)step2. processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上
step3.runAllTasks:再去以此循环处理任务队列中的其他任务
每个WorkerNioEventLoop中循环三个步骤:
step1. select :轮训注册在其上的 NioSocketChannel 的 read/write 事件 OP_READ/OP_WRITE 事件) step2: processSelectedKeys :在对应的 NioSocketChannel 上处理 read/write 事件 step3: runAllTasks :再去以此循环处理任务队列中的其他任务 在以上两个 processSelectedKeys 步骤中,会使用 Pipeline (管道), Pipeline 中引用了 Channel ,即通过 Pipeline 可以获取到对应的 Channel , Pipeline 中维护了很多的处理器 (拦截处理器、过滤处理器、自定义处理器等)。


