上一篇【第03篇】手把手搭建Netty开发环境——5分钟从零到HelloWorld
下一篇【第05篇】Netty线程模型深度解析——Reactor三种模式你真的搞懂了吗


摘要

Netty的架构设计被誉为"Java网络编程的教科书"——它把复杂的Reactor模式封装成了几个简单的组件,让开发者5分钟就能写出高性能NIO服务器。

但"简单"的背后是精妙的设计:Bootstrap负责启动引导、Channel代表一个网络连接、Pipeline是责任链模式的经典实现、Handler让业务逻辑插拔式扩展。本文用大量ASCII架构图,把这些核心组件的关系和数据流讲得明明白白,让您一次看懂Netty的架构设计精髓。


一、Netty整体架构——三层设计哲学

Netty采用了清晰的三层架构设计,每一层职责单一,界限分明。

【Netty整体架构图】

┌─────────────────────────────────────────────────────────────┐
│                      业务逻辑层                              │
│  (您的代码:ChannelHandler)                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐           │
│  │ 鉴权Handler│  │ 业务Handler│  │ 日志Handler│ ...     │
│  └──────────┘  └──────────┘  └──────────┘           │
├─────────────────────────────────────────────────────────────┤
│                      协议/编解码层                          │
│  (Netty内置 + 自定义)                                   │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐ │
│  │HttpServerCodec│  │WebSocket协议 │  │Protobuf编解码│ ...    │
│  └──────────────┘  └──────────────┘  └──────────────┘ │
├─────────────────────────────────────────────────────────────┤
│                      传输层(核心)                         │
│  ┌──────────────────────────────────────────────────────┐  │
│  │          NioEventLoopGroup(线程组)               │  │
│  │  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐   │  │
│  │  │Event │  │Event │  │Event │  │Event │ ... │   │  │
│  │  │Loop 0│  │Loop 1│  │Loop 2│  │Loop 3│   │   │  │
│  │  └──┬───┘  └──┬───┘  └──┬───┘  └──┬───┘   │  │
│  │     └──────────────┴──────────────┴────────────┘   │  │
│  │              每个EventLoop绑定一个线程                   │  │
│  └──────────────────────────────────────────────────────┘  │
│  ┌──────────────┐  ┌──────────────┐                    │
│  │   Channel     │  │   Channel     │  ...(每个连接    │
│  │ (NioSocket   │  │ (NioSocket   │       一个Channel)│
│  │  Channel)    │  │  Channel)    │                    │
│  └──────────────┘  └──────────────┘                    │
└─────────────────────────────────────────────────────────────┘

各层职责详解

层次 核心组件 职责
传输层 EventLoopGroup、Channel、Unsafe 处理底层IO操作(accept/read/write),管理连接生命周期
协议/编解码层 Codec(ByteToMessageDecoder等) 将字节流解析为消息对象(或反向),处理TCP粘包/拆包
业务逻辑层 ChannelHandler 实现具体业务逻辑(鉴权、限流、消息处理等)

设计精髓:这种分层设计让Netty具有极强的扩展性——想支持新协议?加个Codec。想改业务逻辑?换个Handler。传输层完全不用动。


二、六大核心组件——Netty的"六大金刚"

Netty有六大核心组件,理解它们就理解了Netty的半壁江山。

【Netty六大核心组件关系图】

        ┌───────────────┐
        │  Bootstrap    │  (启动引导器)
        │  ServerBootstrap│
        └───────┬───────┘
                │ 配置
                v
        ┌───────────────┐        ┌──────────────────┐
        │  EventLoopGroup │        │    Channel         │
        │  (线程组)      │───────>│  (网络连接)       │
        │  BossGroup      │        │  NioServerSocket  │
        │  WorkerGroup    │        │  Channel           │
        └───────┬───────┘        │  NioSocketChannel  │
                │ 每个EventLoop  └──────────┬───────────┘
                │ 绑定一批Channel            │ 每个Channel有
                v                          v
        ┌───────────────┐        ┌──────────────────┐
        │  EventLoop      │        │  ChannelPipeline  │
        │  (事件循环)    │        │  (责任链)         │
        │  一个线程       │        │  HeadContext       │
        │  一个Selector   │        │  ├── Handler 1    │
        └───────┬───────┘        │  ├── Handler 2    │
                │ 处理IO事件        │  ├── ...          │
                v                  │  └── TailContext   │
        ┌───────────────┐        └──────────────────┘
        │  ChannelFuture │
        │  (异步结果)   │
        └───────────────┘

2.1 Bootstrap/ServerBootstrap——启动引导器

Bootstrap是Netty的启动引导器,负责组装所有组件并启动服务。

两个核心引导器

  • Bootstrap:客户端引导器
  • ServerBootstrap:服务端引导器(多了Boss线程组)
// ServerBootstrap的典型配置(回顾一下)
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)        // 设置线程组
 .channel(NioServerSocketChannel.class) // 设置Channel类型
 .childHandler(new ChannelInitializer<SocketChannel>() {
     @Override
     protected void initChannel(SocketChannel ch) {
         // 配置Pipeline
         ch.pipeline().addLast(new StringDecoder());
         ch.pipeline().addLast(new StringEncoder());
         ch.pipeline().addLast(new EchoServerHandler());
     }
 });

2.2 EventLoopGroup/EventLoop——Netty的"心脏"

EventLoopGroup是线程组,EventLoop是线程组中的单个线程。

【EventLoopGroup与Channel的关系】

                BossGroup(接收连接)
                     │
            ┌────────┴────────┐
            │                  │
      NioEventLoop      NioEventLoop
      (Boss线程0)      (Boss线程1)
            │                  │
            v                  v
     接收新连接          接收新连接
     分配给Worker       分配给Worker
                     │
            ┌────────┴────────┐
            │                  │
      NioEventLoop      NioEventLoop      NioEventLoop
      (Worker线程0)    (Worker线程1)    (Worker线程2)
            │                  │                  │
      ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐
      │   Channel   │   │   Channel   │   │   Channel   │
      │  (连接1)   │   │  (连接2)   │   │  (连接3)   │
      │  (连接4)   │   │  (连接5)   │   │  (连接6)   │
      └────────────┘   └────────────┘   └────────────┘

关键设计:一个Channel在其生命周期内只绑定一个EventLoop(线程),这意味着Channel上的所有IO操作都在同一个线程中执行,完全避免了多线程并发问题

2.3 Channel——网络连接的抽象

Channel是Netty对网络连接的抽象,无论是什么协议(TCP/UDP/HTTP),都用Channel来表示。

常用Channel类型

Channel类型 用途
NioServerSocketChannel 服务端,监听端口,接收新连接
NioSocketChannel 客户端/服务端连接,读写数据
NioDatagramChannel UDP通道
EpollServerSocketChannel Linux Epoll服务端Channel(性能更好)

2.4 ChannelPipeline——责任链模式的经典实现

Pipeline是Netty处理IO事件的责任链,每个Channel都有自己的Pipeline。

【Pipeline结构图解】

HeadContext <──> Handler1 <──> Handler2 <──> ... <──> TailContext
    │                                                        │
    └────────────────────────────────────────────────────────┘
              (双向链表,支持动态增删Handler)

事件传播方向

  • Inbound事件(入站,数据从网卡→应用程序):从Head向Tail传播
    • channelRegistered()channelActive()channelRead() → …
  • Outbound事件(出站,数据从应用程序→网卡):从Tail向Head传播
    • bind()connect()write()flush() → …

2.5 ChannelHandler——业务逻辑的插拔式扩展

Handler是Netty扩展业务逻辑的核心机制,通过Pipeline插拔式组合。

两大分支

  • ChannelInboundHandler:处理入站事件(数据到来、连接建立等)
  • ChannelOutboundHandler:处理出站事件(数据写出、连接关闭等)
// 典型的Pipeline配置
pipeline.addLast("decoder", new StringDecoder());   // Inbound
pipeline.addLast("encoder", new StringEncoder());   // Outbound
pipeline.addLast("auth", new AuthHandler());        // Inbound
pipeline.addLast("business", new BusinessHandler()); // Inbound

2.6 ChannelFuture——异步操作的结果

Netty的所有IO操作都是异步的,ChannelFuture用来获取异步操作的结果。

// 异步绑定端口
ChannelFuture f = serverBootstrap.bind(8080);
f.addListener((ChannelFutureListener) future -> {
    if (future.isSuccess()) {
        System.out.println("端口绑定成功!");
    } else {
        System.err.println("端口绑定失败:" + future.cause());
    }
});

三、服务端启动流程——从bind()到接受第一个连接

理解架构的最好方式是跟踪一次完整的启动流程。

【Netty服务端启动流程时序图】

应用程序          ServerBootstrap      NioServerSocketChannel     EventLoop
    │                   │                        │                    │
    │  bind(8080)      │                        │                    │
    │──────────────────>│                        │                    │
    │                   │  initAndRegister()     │                    │
    │                   │───────────────────────>│                    │
    │                   │                        │ 构造方法              │
    │                   │                        │ 创建Pipeline         │
    │                   │                        │───────────────────────>│
    │                   │                        │ 注册到EventLoop       │
    │                   │                        │  (register)          │
    │                   │<────────────────────────│                    │
    │                   │  doBind()              │                    │
    │                   │───────────────────────>│                    │
    │                   │                        │  javaChannel.bind()  │
    │                   │                        │  (绑定端口)           │
    │                   │<────────────────────────│                    │
    │  ChannelFuture    │                        │                    │
    │<──────────────────│                        │                    │
    │                   │                        │                    │
    │          (此时服务端开始监听8080端口)                 │
    │                   │                        │                    │
    │                   │                        │ 注册OP_ACCEPT事件    │
    │                   │                        │───────────────────────>│
    │                   │                        │                    │
    │                   │                        │           (EventLoop开始轮询selector)

四、请求处理流程——数据是怎么从网卡流到您的代码的?

当客户端发送一条消息时,数据在Netty中的流转路径如下:

【Netty请求处理数据流】

客户端发送"Hello"
        │
        v
  ┌─────────────┐
  │  网卡        │
  │  (操作系统)   │
  └──────┬──────┘
         │ 数据到达(网卡中断)
         v
  ┌─────────────┐
  │  EventLoop   │
  │  (select())  │   <── 检测到OP_READ事件就绪
  └──────┬──────┘
         │  调用unsafe.read()
         v
  ┌─────────────┐
  │ByteBuf分配   │   <── 从内存池分配一块缓冲区
  │(PooledByteBuf)│
  └──────┬──────┘
         │  jdkChannel.read(byteBuf)
         v
  ┌─────────────┐
  │  数据读到    │
  │  ByteBuf     │
  └──────┬──────┘
         │  pipeline.fireChannelRead(byteBuf)
         v
  ┌─────────────────────────────────────────────┐
  │           ChannelPipeline                     │
  │  HeadContext                               │
  │    │                                        │
  │    v  (Inbound事件,Head→Tail)            │
  │  StringDecoder  (解码ByteBuf→String)      │
  │    │                                        │
  │    v                                        │
  │  StringEncoder  (注意:Encoder是Outbound,  │
  │    │           这里不会被执行)                │
  │    v                                        │
  │  EchoServerHandler                         │
  │    │  channelRead(ctx, "Hello")            │
  │    │  ctx.writeAndFlush("Echo: Hello")     │
  │    v                                        │
  │  StringEncoder  (Outbound事件,Tail→Head) │
  │    │  encode("Echo: Hello" → ByteBuf)     │
  │    v                                        │
  │  StringDecoder  (Inbound,这里不会执行)   │
  │    │                                        │
  │    v                                        │
  │  TailContext ──> HeadContext               │
  │    │                                        │
  │    v  unsafe.writeAndFlush()                │
  └─────────────────────────────────────────────┘
         │
         v
  ┌─────────────┐
  │  EventLoop   │
  │  write()到   │
  │  Socket      │
  └──────┬──────┘
         │
         v
  ┌─────────────┐
  │  网卡        │
  │  (操作系统)   │
  └──────┬──────┘
         │
         v
      客户端收到"Echo: Hello"

五、Netty与Reactor模式的关系

Netty的架构设计完全基于Reactor模式。理解Reactor模式,就理解了Netty的线程模型。

【Reactor模式三种变体】

1. 单线程Reactor(Netty不支持,太弱)
   ┌─────────────────────┐
   │     Reactor线程       │
   │  (accept + read +  │
   │   write + 业务)    │
   └─────────────────────┘
   问题:业务处理慢会卡住所有连接

2. 多线程Reactor(Netty部分支持)
   ┌─────────────────────┐     ┌─────────────────────┐
   │     Reactor线程       │     │   业务线程池          │
   │  (accept + read +  │────>│  (处理慢业务逻辑)   │
   │   write)            │     └─────────────────────┘
   └─────────────────────┘
   改进:业务逻辑交给线程池处理

3. 主从Reactor(✅ Netty的默认模式!)
   ┌─────────────────────┐
   │  BossGroup(主Reactor)                           │
   │  ┌──────────┐  ┌──────────┐                   │
   │  │EventLoop  │  │EventLoop  │  (接收新连接)    │
   │  └────┬─────┘  └────┬─────┘                   │
   └───────┼──────────────┼──────────────────────────┘
           │              │
           v              v
   ┌──────────────────────────────────────────────────┐
   │  WorkerGroup(从Reactor)                         │
   │  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
   │  │EventLoop  │  │EventLoop  │  │EventLoop  │  │
   │  │(处理IO   │  │(处理IO   │  │(处理IO   │  │
   │  │ 读写)    │  │ 读写)    │  │ 读写)    │  │
   │  └──────────┘  └──────────┘  └──────────┘  │
   └──────────────────────────────────────────────────┘

Netty的精妙之处:BossGroup只负责接收新连接(accept),然后把连接分配给WorkerGroup;WorkerGroup负责处理所有连接的IO读写。这种分工让Netty轻松应对十万级并发连接。


总结

  1. Netty三层架构:传输层(EventLoop/Channel)→ 协议层(Codec)→ 业务逻辑层(Handler)
  2. 六大核心组件:Bootstrap(启动引导)、EventLoopGroup(线程组)、Channel(连接)、Pipeline(责任链)、Handler(业务逻辑)、Future(异步结果)
  3. Pipeline的事件传播:Inbound事件Head→Tail,Outbound事件Tail→Head
  4. Reactor模式:Netty默认使用主从Reactor模式,BossGroup接收连接,WorkerGroup处理IO
  5. 下一步:深入理解Netty的线程模型(第005篇),这是Netty高性能的核心秘密

上一篇【第03篇】手把手搭建Netty开发环境——5分钟从零到HelloWorld
下一篇【第05篇】Netty线程模型深度解析——Reactor三种模式你真的搞懂了吗


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。