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
| 特性 | ByteBuf | Java 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 底层)
- 代理 & 网关:四层 / 七层代理
相关链接
- 网络框架 ← 返回网络框架目录