Netty 与 Reactor 模型
Netty 是一个高性能网络应用框架,但如果不了解 Reactor 模型,很多人只会“照着 demo 写”。
为什么不用一连接一线程
早期阻塞 IO 的常见思路是:
- 来一个连接。
- 分配一个线程。
- 线程阻塞等待读写。
连接少时没问题,连接一多就会很吃资源。
Netty 更偏向事件驱动
核心思想是:
- 少量线程。
- 监听大量连接事件。
- 谁就绪就处理谁。
Reactor 模型怎么理解
可以把 Reactor 理解成“事件调度中心”。
它负责:
- 监听网络事件。
- 把事件分发给对应处理器。
简化流程图
mermaid
flowchart TD
A[客户端连接或发数据] --> B[Selector 发现事件]
B --> C[Reactor 线程分发事件]
C --> D[建立连接和读写数据]
D --> E[业务处理器继续处理]Netty 为什么常提 Boss 和 Worker
BossGroup
主要负责接收连接。
WorkerGroup
主要负责处理读写事件。
一次连接建立的大致流程
mermaid
sequenceDiagram
participant Client as 客户端
participant Boss as BossGroup
participant Worker as WorkerGroup
participant Pipeline as ChannelPipeline
Client->>Boss: 发起连接
Boss->>Boss: 接收连接事件
Boss->>Worker: 注册 SocketChannel
Worker->>Pipeline: 绑定处理链
Client->>Worker: 发送数据
Worker->>Pipeline: 触发读取事件适合博客项目的哪些场景
- 即时通知。
- WebSocket 长连接。
- 实时聊天。
- 实时日志推送。
- 高性能网关或代理层。
本章小结
理解 Netty 的第一步不是先背 API,而是先明白:
- 它建立在 NIO 之上。
- 它通过 Reactor 模型提高并发处理能力。
- 它把网络编程里的复杂问题做了高级封装。
代码 Demo:Boss 和 Worker
java
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new BizHandler());
}
});
bootstrap.bind(8080).sync();bossGroup 负责接收连接,workerGroup 负责已连接 Channel 的读写事件。这个结构就是 Netty 中 Reactor 模型的常见落地。
