Netty
主要基于主从Reactor
多线程模型。BossGroup
线程维护Selector
只关注Accept
事件。当接收到Accept
事件,获取到对应的SocketChannel
,封装成NioSocketChannel
并注册到Worker
线程(事件循环),并进行维护。当Worker
线程监听到Selector
中通道发生自己感兴趣的事件后,就进行处理(Handler
),注意Handler
必须是添加到通道中的。
Netty
工作原理:
Netty
抽象出两组线程池BossGroup
专门负责接收客户端的连接,WorkderGroup
专门负责网络的读写。BossGroup
和WorkerGroup
类型都是NioEventLoopGroup
NioeventLoopGroup
相当于一个事件循环组。这个组中含有多个事件循环,每一个事件循环是NioEventLoop
NioEventLoop
表示一个不断循环的执行处理任务的线程,,每个NioEventLoop
都有一个Selector
,用于监听绑定在其上的Socket
的网络通讯。NioEventLoopGroup
可以有多个线程,即可以含有多个NioEventLoop
- 每个
Boss NioEventLoop
循环执行的步骤:
- 轮询处理
Accept
事件 - 处理
Accept
事件,与Client
建立连接,生成NioSocketChannel
,并将其注册到某个Worker NioEventLoop
上的Selector
- 处理任务队列的任务,即
runAllTask
- 每个
Worker NioEventLoop
循环执行的步骤:
- 轮询
Reead
、Write
事件 - 处理
I/O
事件,即Reead
、Write
事件,在对应NioSocketChannel
处理 - 处理任务队列的任务,即
RunAllTask
- 每个
Worker NioEventLoop
处理业务时,会使用Pipelien
(管道),Pipeline
中包含了Channel
,即通过Pipeline
可以获取到对应的通道,Channel
管道中维护了很多的处理器