前言
之前摸清了 Reactor 线程模型及其演变,最近看了下相关文章和代码,也熟悉了netty的工作模型,记录之。
netty工作模型
- Netty 抽象出两组线程池:BossGroup、WorkerGroup。 BossGroup专门负责接受客户端的连接,相当于 mainReactor;WorkerGroup专门负责网络的读写,相当于subReactor。
- BossGroup、WorkerGroup 类型都是 NioEventLoopGroup.
- NioEventLoopGroup 即事件循环组,里面含有多个事件循环(NioEventLoop),即 一个 NioEventLoopGroup 对应多个 NioEventLoop
- NioEventLoop 表示一个不断循环的执行处理任务的线程,每个 NioEventLoop 都有一个 selector ,用于监听绑定在其上的 socket 的网络通信。
- 每个 boss 的 NioEventLoopGroup 循环执行的步骤:
- 轮询 accept 事件
- 处理 accept 事件,与 client 建立连接,生产 NioSocketChannel,并将其注册到某个 woker 的 NioEventLoop 上的 selector
- 处理任务队列,即 runAllTasks
每个 worker 的 NioEventLoopGroup 循环执行的步骤:
- 轮询 read,write 事件
- 处理I/O事件,即 read,write 事件,在对应的 NioSocketChannel 处理。
- 处理任务队列,即 runAllTasks
每个 worker 的 NioEventLoopGroup 处理业务时,会使用 ChannelPipeline ,即通道。ChannelPipeline 中包含了 channel , ChannelPipeline 中也有各种处理器(编码、解码、业务处理…)
后记
之后准备用netty写一个IM项目练练手,代码会比较简单,非常适合熟悉netty。