Netty 架构图概览
核心组件详解
1. 应用层(Application Layer)
-
ChannelHandler
-
职责:处理入站(
Inbound
)和出站(Outbound
)事件(如数据解码、业务逻辑)。 -
链式调用:通过
ChannelPipeline
将多个 Handler 串联,形成处理链。 -
示例:
StringDecoder
(解码)、LoggingHandler
(日志记录)。
-
-
ChannelPipeline
-
结构:双向链表,包含多个
ChannelHandlerContext
,每个节点对应一个 Handler。 -
事件传播:通过
fireChannelRead()
或write()
方法触发事件在链中的传递。
-
2. 事件循环层(EventLoop Layer)
-
EventLoop
-
线程模型:每个
EventLoop
绑定一个线程,处理多个 Channel 的 I/O 事件和异步任务。 -
核心任务:
-
通过
Selector
监听 Channel 的就绪事件(如OP_READ
、OP_WRITE
)。 -
执行提交到任务队列的异步操作(如
channel.write()
)。
-
-
优化:避免线程切换,保证同一 Channel 的事件由同一线程处理(无锁化设计)。
-
-
EventLoopGroup
-
角色:管理一组
EventLoop
,通常分为BossGroup
(处理连接)和WorkerGroup
(处理 I/O)。 -
线程分配:默认线程数为 CPU 核心数 × 2,可通过构造函数指定。
-
3. 传输层(Transport Layer)
-
Channel
-
抽象:表示一个网络连接(如
NioSocketChannel
、EpollSocketChannel
)。 -
功能:封装底层 Socket 操作(如
bind()
、connect()
、read()
、write()
)。 -
实现差异:
-
NIO:基于 JDK 的
Selector
,跨平台但性能略低。 -
Epoll:仅限 Linux,使用
epoll
系统调用,性能更高。
-
-
-
ChannelFactory
-
作用:根据配置创建不同类型的 Channel(如
NioServerSocketChannel.class
)。 -
扩展性:支持自定义传输实现(如 UDP、Unix Domain Socket)。
-
Netty 数据流处理流程
-
客户端连接建立
-
BossGroup
的EventLoop
处理OP_ACCEPT
事件,创建SocketChannel
。 -
将
SocketChannel
注册到WorkerGroup
的某个EventLoop
。
-
-
数据读取(Read)
-
EventLoop
监听到OP_READ
事件,触发ChannelPipeline
的InboundHandler
链:-
解码(如
ByteToMessageDecoder
)→ 业务处理 → 结果响应。
-
-
-
数据写出(Write)
-
调用
channel.write()
提交数据到OutboundHandler
链:-
编码(如
MessageToByteEncoder
)→ 通过Channel
写入 Socket 缓冲区。
-
-
-
异步任务处理
-
通过
eventLoop.execute()
提交任务到EventLoop
的任务队列,由绑定线程执行。
-
Netty 线程模型示意图
关键设计思想
-
Reactor 模式:主从多线程模型,分离连接建立与 I/O 处理。
-
无锁化串行设计:同一 Channel 的所有事件由同一线程处理,避免并发问题。
-
零拷贝优化:通过
FileRegion
和CompositeByteBuf
减少内存复制。 -
内存池化:使用
PooledByteBufAllocator
重用 ByteBuf,降低 GC 压力。
总结
Netty 的架构通过分层设计和高效线程模型,实现了高吞吐、低延迟的网络通信。理解其 EventLoop 调度机制、Pipeline 处理链 和 内存管理优化 是掌握 Netty 的核心。实际开发中需根据业务场景选择合适的传输方式和线程配置。