2026年7月11日 · 4 分钟阅读
Netty 入门:线程模型、核心 API 与 Pipeline 机制
梳理 Netty 的定位、Reactor 线程模型、BossGroup 和 WorkerGroup、NioEventLoop、ServerBootstrap、ChannelHandler、Pipeline 和 ChannelFuture。
Netty 是一个基于 NIO 的 Java 网络应用框架。它把原生 NIO 里复杂的 Selector、Channel、Buffer、线程调度、编解码和事件分发封装起来,让开发者更专注于协议和业务处理。
很多中间件和 RPC 框架都使用 Netty,比如 Dubbo、RocketMQ、gRPC Java 的部分网络层实现等。
为什么需要 Netty
原生 NIO 能支撑高并发连接,但直接使用成本很高。
你需要自己处理:
- Selector 轮询。
- Channel 注册。
- 读写事件分发。
- 半包和粘包。
- 编码和解码。
- 连接关闭。
- 异常处理。
- 线程模型。
Netty 的价值,就是把这些通用网络编程问题抽象成稳定模型。
Netty 线程模型
Netty 基于 Reactor 模式。典型服务端会有两组线程:
- BossGroup。
- WorkerGroup。
BossGroup 负责接收客户端连接,WorkerGroup 负责处理连接上的读写事件和业务 Handler。
Client
-> BossGroup accept
-> WorkerGroup read/write
-> ChannelPipeline
-> ChannelHandler
BossGroup 和 WorkerGroup
BossGroup 的 NioEventLoop 主要做:
- 轮询 accept 事件。
- 接收客户端连接。
- 把连接注册到 WorkerGroup 的 NioEventLoop。
- 执行任务队列里的任务。
WorkerGroup 的 NioEventLoop 主要做:
- 轮询 read/write 事件。
- 在对应 Channel 上处理网络读写。
- 执行 Pipeline 中的 Handler。
- 执行任务队列里的任务。
一个 NioEventLoop 可以管理多个 Channel,但一个 Channel 通常只绑定到一个 NioEventLoop。
ServerBootstrap 和 Bootstrap
Netty 用 Bootstrap 负责启动配置。
| 类 | 用途 |
|---|---|
ServerBootstrap | 服务端启动器 |
Bootstrap | 客户端启动器 |
服务端通常会配置:
- BossGroup。
- WorkerGroup。
- Channel 类型。
- ChannelOption。
- ChildHandler。
- 绑定端口。
Channel
Channel 表示一个网络连接或 IO 通道。
在 Netty 里,Channel 是读写数据、获取连接状态、绑定 Pipeline 的核心对象。
常见操作包括:
write()。flush()。writeAndFlush()。close().pipeline().
Channel 不是直接处理业务逻辑,业务逻辑通常写在 Handler 里。
ChannelHandler
ChannelHandler 是事件处理器。我们通过实现或继承 Handler 来处理连接、读、写、异常等事件。
常见基类:
ChannelInboundHandlerAdapter。SimpleChannelInboundHandler<T>。ChannelOutboundHandlerAdapter。
Inbound 处理入站事件,比如连接建立、读取数据;Outbound 处理出站事件,比如写数据、刷新、关闭。
ChannelPipeline
Pipeline 是 Handler 链。
一个 Channel 对应一个 Pipeline,Pipeline 里可以添加多个 Handler。数据和事件会沿着 Pipeline 传播。
Channel -> Handler1 -> Handler2 -> Handler3
Pipeline 的好处是职责拆分。比如:
- 第一个 Handler 做解码。
- 第二个 Handler 做业务校验。
- 第三个 Handler 做业务处理。
- 最后一个 Handler 做编码。
ChannelHandlerContext
ChannelHandlerContext 是 Handler 的上下文对象。它把 Handler、Pipeline、Channel 关联起来。
通过 Context 可以:
- 向后传播事件。
- 写回响应。
- 获取当前 Channel。
- 获取 Pipeline。
- 关闭连接。
Handler 本身只关心业务,Context 负责和 Netty 运行环境交互。
ChannelOption
ChannelOption 用来配置 Socket 参数。
常见配置:
| 参数 | 说明 |
|---|---|
SO_BACKLOG | 服务端等待连接队列大小 |
SO_KEEPALIVE | 是否开启 TCP KeepAlive |
TCP_NODELAY | 是否禁用 Nagle 算法 |
SO_SNDBUF | 发送缓冲区大小 |
SO_RCVBUF | 接收缓冲区大小 |
这些参数会影响连接行为和性能,需要结合业务场景设置。
ChannelFuture
Netty 中很多 IO 操作都是异步的。调用写入、连接、绑定方法后,通常会返回 ChannelFuture。
ChannelFuture 表示异步操作的结果。
常见用法:
ChannelFuture future = bootstrap.bind(9000).sync();
future.channel().closeFuture().sync();
也可以添加监听器,在操作完成后执行回调。
编码和解码
网络传输的是字节,业务处理通常需要对象。因此必须有编码和解码。
出站:对象 -> 字节
入站:字节 -> 对象
Netty 自带很多编解码器,也可以结合 Protobuf、JSON、自定义二进制协议实现业务协议。
小结
Netty 入门可以抓住几个核心对象:
- BossGroup 接收连接。
- WorkerGroup 处理读写。
- NioEventLoop 负责事件循环。
- Channel 表示连接。
- Pipeline 组织 Handler 链。
- Handler 编写业务逻辑。
- ChannelFuture 表示异步操作结果。
理解这些组件之后,再写聊天室、RPC、网关和自定义协议时,就有了清晰的骨架。