
Netty 核心概念详解一、Reactor 线程模型1.1 什么是 Reactor 模型1.2 Netty 中的 Reactor 实现1.3 单 Reactor 单线程模型1.4 单 Reactor 多线程模型1.5 主从 Reactor 多线程模型(Netty 默认)二、ChannelPipeline(管道)2.1 什么是 ChannelPipeline2.2 Pipeline 结构2.3 Handler 类型2.4 实际 Pipeline 配置2.5 数据在 Pipeline 中的流动三、ByteBuf(字节缓冲区)3.1 什么是 ByteBuf3.2 ByteBuf 内存布局3.3 常用操作3.4 内存分配策略四、Netty 处理请求的生命周期4.1 完整流程图4.2 关键事件五、零拷贝原理5.1 什么是零拷贝5.2 传统拷贝 vs 零拷贝传统拷贝(4 次拷贝 + 4 次上下文切换)零拷贝(2 次拷贝 + 2 次上下文切换)5.3 Netty 中的零拷贝实现5.3.1 CompositeByteBuf(复合缓冲区)5.3.2 ByteBuf.slice()(切片)5.3.3 FileRegion(文件区域)5.4 零拷贝的优势六、总结记忆口诀:6.1 核心概念速查6.2 学习路径建议6.3 常见问题一、Reactor 线程模型1.1 什么是 Reactor 模型Reactor 模型是一种事件驱动的并发处理模型,核心思想是:一个或多个事件处理器(Reactor)负责监听和处理多个连接的事件。1.2 Netty 中的 Reactor 实现Netty 使用NioEventLoopGroup来实现 Reactor 模型:┌─────────────────────────────────────────────────────────┐ │ BossGroup (Reactor) │ │ ┌─────────────┐ │ │ │ EventLoop │ 负责:接受客户端连接 │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────┘ │ ▼ 连接建立后移交 ┌─────────────────────────────────────────────────────────┐ │ WorkerGroup (Reactor) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ EventLoop │ │ EventLoop │ │ EventLoop │ │ │ │ (线程1) │ │ (线程2) │ │ (线程3) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ 负责:读写数据、业务处理 │ └─────────────────────────────────────────────────────────┘1.3 单 Reactor 单线程模型┌─────────────┐ │ EventLoop │ ← 一个线程处理所有连接 │ (单线程) │ 接受连接 + 读写数据 └─────────────┘缺点:所有连接共享一个线程,某个连接处理慢会影响其他连接。1.4 单 Reactor 多线程模型┌─────────────┐ │ EventLoop │ ← 一个线程只负责接受连接 │ (单线程) │ └─────────────┘ │ ▼ 连接建立后移交 ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ EventLoop │ │ EventLoop │ │ EventLoop │ │ (线程1) │ │ (线程2) │ │ (线程3) │ └─────────────┘ └─────────────┘ └─────────────┘ 负责读写数据优点:接受连接和读写数据分离,互不干扰。1.5 主从 Reactor 多线程模型(Netty 默认)┌─────────────────────────────────────────────────────────┐ │ BossGroup (主 Reactor) │ │ ┌─────────────┐ │ │ │ EventLoop │ 负责:接受客户端连接 │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────┘ │ ▼ 连接建立后移交 ┌─────────────────────────────────────────────────────────┐ │ WorkerGroup (从 Reactor) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ EventLoop │ │ EventLoop │ │ EventLoop │ │ │ │ (线程1) │ │ (线程2) │ │ (线程3) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ 负责:读写数据、业务处理 │ └─────────────────────────────────────────────────────────┘Netty 代码对应:EventLoopGroupbossGroup=newNioEventLoopGroup(1);// 主 ReactorEventLoopGroupworkerGroup=newNioEventLoopGroup();// 从 Reactor(默认 CPU 核数 * 2)二、ChannelPipeline(管道)2.1 什么是 ChannelPipelineChannelPipeline 是 Netty 中处理网络 I/O 操作的链式结构,由多个 Handler 组成。数据在管道中双向流动:下行(Inbound):从网络 → 应用层(读数据)上行(Outbound):从应用层 → 网络(写数据)2.2 Pipeline 结构┌─────────────────────────────────────────────────────────┐ │ ChannelPipeline │ │ │ │ [Head] → [LoggingHandler] → [FrameDecoder] → │ │ [ProtocolDecoder] → [BusinessHandler] → [Tail] │ │ │ │ 数据流向: │ │ 下行(读):Head → Tail(从左到右) │ │ 上行(写):Tail → Head(从右到左) │ └─────────────────────────────────────────────────────────┘2.3 Handler 类型类型说明常用接口ChannelHandler基础接口ChannelHandlerChannelInboundHandler处理下行事件(读)ChannelInboundHandlerAdapterChannelOutboundHandler处理上行事件(写)ChannelOutboundHandlerAdapterChannelDuplexHandler同时处理双向事件ChannelDuplexHandler2.4 实际 Pipeline 配置ch.pipeline().addLast