Skip to content

Netty 与 Reactor 模型

Netty 是一个高性能网络应用框架,但如果不了解 Reactor 模型,很多人只会“照着 demo 写”。

为什么不用一连接一线程

早期阻塞 IO 的常见思路是:

  1. 来一个连接。
  2. 分配一个线程。
  3. 线程阻塞等待读写。

连接少时没问题,连接一多就会很吃资源。

Netty 更偏向事件驱动

核心思想是:

  1. 少量线程。
  2. 监听大量连接事件。
  3. 谁就绪就处理谁。

Reactor 模型怎么理解

可以把 Reactor 理解成“事件调度中心”。

它负责:

  1. 监听网络事件。
  2. 把事件分发给对应处理器。

简化流程图

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: 触发读取事件

适合博客项目的哪些场景

  1. 即时通知。
  2. WebSocket 长连接。
  3. 实时聊天。
  4. 实时日志推送。
  5. 高性能网关或代理层。

本章小结

理解 Netty 的第一步不是先背 API,而是先明白:

  1. 它建立在 NIO 之上。
  2. 它通过 Reactor 模型提高并发处理能力。
  3. 它把网络编程里的复杂问题做了高级封装。

代码 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 模型的常见落地。