Netty

Netty 是基于 Java NIO 的异步事件驱动网络应用框架,广泛用于高性能协议服务器与客户端开发,是 Dubbo、gRPC、RocketMQ 等中间件的底层通信层。

核心架构

客户端请求
    │
    ▼
[Boss EventLoopGroup]  ── 接受连接(通常 1 个线程)
    │
    ▼
[Worker EventLoopGroup] ── 处理读写(默认 CPU×2 个线程)
    │
    ▼
[ChannelPipeline] ── Decoder → BusinessHandler → Encoder

NIO 三大组件

组件说明
Channel通道,代表一个网络连接(NioSocketChannel 等)
Buffer缓冲区,数据读写载体(Netty 使用 ByteBuf
Selector多路复用器,监听多个 Channel 事件(底层 epoll/kqueue)

Reactor 线程模型

Netty 默认使用主从多线程 Reactor 模型

EventLoopGroup bossGroup   = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(); // 默认 CPU*2
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
 .channel(NioServerSocketChannel.class)
 .childHandler(new ChannelInitializer<SocketChannel>() {
     @Override
     protected void initChannel(SocketChannel ch) {
         ch.pipeline()
           .addLast(new LengthFieldBasedFrameDecoder(65535, 0, 4, 0, 4))
           .addLast(new MyServerHandler());
     }
 });
ChannelFuture f = b.bind(8080).sync();

ChannelPipeline 责任链

每个 Channel 都有一个 Pipeline,由多个 ChannelHandler 组成双向链表:

入站 →  [Head] → [Decoder] → [BusinessHandler] → [Tail]
出站 ←  [Head] ← [Encoder] ←                  ← [Tail]
  • ChannelInboundHandler:处理入站事件(数据读取、连接建立等)
  • ChannelOutboundHandler:处理出站操作(写数据、连接关闭等)

ByteBuf 对比 ByteBuffer

特性ByteBufJava ByteBuffer
读写索引分离(readerIndex / writerIndex)需手动 flip()
零拷贝支持(slice / composite)不支持
内存池支持(PooledByteBufAllocator)不支持
自动扩容支持不支持
ByteBuf buf = ctx.alloc().buffer(256);
buf.writeInt(bodyLength);
buf.writeBytes(bodyBytes);
ctx.writeAndFlush(buf);

拆包与粘包

TCP 是流式协议,消息边界需手动处理:

解决方案Netty 实现
固定长度FixedLengthFrameDecoder
分隔符DelimiterBasedFrameDecoder
长度字段(最常用)LengthFieldBasedFrameDecoder
自定义协议继承 ByteToMessageDecoder

零拷贝

Netty 零拷贝包含两个层面:

  • OS 层FileChannel.transferTo() 让文件直接从磁盘到网卡,绕过用户态
  • Netty 层
    • CompositeByteBuf:逻辑合并多个 ByteBuf,不复制内存
    • slice():切分 ByteBuf,共享底层字节数组
    • Unpooled.wrappedBuffer(byte[]):byte[] 直接包装成 ByteBuf

心跳机制

// 读空闲 5s 触发 IdleStateEvent
pipeline.addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));
pipeline.addLast(new ChannelInboundHandlerAdapter() {
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
        if (evt instanceof IdleStateEvent e && e.state() == IdleState.READER_IDLE) {
            ctx.close(); // 超时断开
        }
    }
});

常见应用场景

  • RPC 框架通信层:Dubbo、gRPC-Java 底层
  • IM 即时通讯:WebSocket 长连接
  • 游戏服务器:高并发低延迟 TCP
  • HTTP/2 服务器:Reactor Netty(Spring WebFlux 底层)
  • 代理 & 网关:四层 / 七层代理

相关链接