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的实现类图如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?