〇、前言
网络编程的基本线程模型,详见:Netty学习(二):线程模型
一、工作原理简图
Netty主要基于主从 Reactors 多线程模型(如下图) 做了一定的改进,其中主从Reactor 多线程模型有多个Reactor。
BossGroup 线程维护Selector ,只关注Accecpt
当接收到Accept事件,获取到对应的SocketChannel,封装成NIOScoketChannel并注册到Worker线程(事件循环),并进行维护
当Worker线程监听到selector中通道发生自己感兴趣的事件后,就由handle进行处理,注意handler已经加入到通道
二、工作原理详图
Netty抽象出两组线程池BossGroup专门负责接收客户端的连接,WorkerGroup专门负责网络的读写
BossGroup和 WorkerGroup类型都是NioEventLoopGroup
NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是NioEventLoop
NioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop 都有一个selector ,用于监听绑定在其上的socket 的网络通讯
NioEventLoopGroup可以有多个线程,即可以含有多个NioEventLoop
每个 Boss NioEventLoop循环执行的步骤有3步
轮询accept事件
处理accept事件,与client建立连接
生成 NioScocketChannel,并将其注册到某个worker NIOEventLoop 上的 selector
处理任务队列的任务,即runAllTasks
每个Worker NIOEventLoop 循环执行的步骤
轮询read, write事件
处理i/o事件,即 read , write事件,在对应NioScocketChannel
处理处理任务队列的任务,即runAllTasks
每个Worker NIOEventLoop处理业务时,会使用pipeline(管道), pipeline 中包含了channel,即通过pipeline可以获取到对应通道,管道中维护了很多的处理器