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 主要做:

  1. 轮询 accept 事件。
  2. 接收客户端连接。
  3. 把连接注册到 WorkerGroup 的 NioEventLoop。
  4. 执行任务队列里的任务。

WorkerGroup 的 NioEventLoop 主要做:

  1. 轮询 read/write 事件。
  2. 在对应 Channel 上处理网络读写。
  3. 执行 Pipeline 中的 Handler。
  4. 执行任务队列里的任务。

一个 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 入门可以抓住几个核心对象:

  1. BossGroup 接收连接。
  2. WorkerGroup 处理读写。
  3. NioEventLoop 负责事件循环。
  4. Channel 表示连接。
  5. Pipeline 组织 Handler 链。
  6. Handler 编写业务逻辑。
  7. ChannelFuture 表示异步操作结果。

理解这些组件之后,再写聊天室、RPC、网关和自定义协议时,就有了清晰的骨架。