Netty线程模型概述
在Netty编程模型入门案例中客户端和服务端通信底层如何实现的呢?先看客户端和服务端的类图:
两类图大致一样,区别在于ServerBootstrap与EventLoopGroup是组合关系,而Bootstrap与EventLoopGroup之间没有直接的关系。实际在操作过程中也是ServerBootstrap和Bootstrap进行具体操作,详细线程模型如下图:
Group<1------------------*>EventLoop<1------------------1>Selector
NioEventLoop 表示一个不断循环的执行事件处理的线程,每个 NioEventLoop 都包含一个Selector,用于监听注册在其上的 Socket 网络连接(Channel)。
服务端:
Netty 抽象出两组线程池:BossGroup 和 WorkerGroup,也可以叫做BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每个线程池中都有NioEventLoop 线程。
BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。BossGroup 和 WorkerGroup 的类型都是NioEventLoopGroup。如group方法说明:
bossgroup作为父线程负责与客户端的连接,当有客户端请求时子线程childgroup负责具体的业务逻辑处理。
每个 BossNioEventLoop 中循环执行以下三个步骤:
1、select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
2、 processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上
3、runAllTasks:再去以此循环处理任务队列中的其他任务
每个 WorkerNioEventLoop 中循环执行以下三个步骤:
1、select:轮训注册在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事件)
2、processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件
3、runAllTasks:再去以此循环处理任务队列中的其他任务
在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了Channel,即通过 Pipeline 可以获取到对应的 Channel,Pipeline 中维护了很多的处理器(拦截处理器、过滤处理器、自定义处理器等)。
可以看出这是一个责任链模式的处理过程,具体可参考下图:
并且InboundHandler是按照Pipleline的加载顺序的顺序执行, OutboundHandler是按照Pipeline的加载顺序逆序执行。Handler的实现类图如下: