一、Netty的整体结构和源码结构


1. Core层
提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API和支持零拷贝的ByteBuf等。
common模块是Netty的核心基础包,提供丰富的工具类,其他模块都需要依赖该模块。常用的包括:通用工具类和自定义并发包
通用工具类:包括定时器工具TimerTask、时间轮HashWheelTimer等
自定义并发包:增强的FastThreadLocal等
buffer模块中,Netty自己实现的了一个更为完备的ByteBuf工具类,用作网络通信的数据载体,该类是对Java ByteBuffer的完美替代品,解决了ByteBuffer长度固定造成的内存浪费,更安全地更改了Buffer的容量。同时Netty对ByteBuf进行了很多优化,包括缓存池化、减少数据拷贝的CompositeByteBuf 等
resolver模块,提供一些有关基础设施的解析工具,包括IP Address、Hostname、DNS 等。
2. Protocal Support协议支持层
包含主流协议的编码实现,如Http、SSL、Protobuf、压缩、大文件传输、二进制等主流协议,同时支持自定义应用协议。
codec模块主要负责编解码工作,通过编解码实现原始字节数据与业务实体对象之间的相互转化。该模块包含开箱即用的编码器,包括:HTTP、HTTP2、Redis、XML等。同时该模块提供抽象编码类:ByteToMessageDecoder和ByteToMessageEncoder,通过继承这两个类可以自定义编解码器。
handler模块主要负责数据处理工作,本质上是handler的集合。该模块提供了开箱即用的ChannelHandler实现类,如:日志、IP过滤等,可以自行在pipeline中加入相应的ChannelHandler。
3. Transport Service传输服务层
提供网络传输能力的定义和实现方法,支持Socket、Http隧道、虚拟机管道等传输方式。
transport模块是Netty提供数据处理和传输的核心模块。该模块包含很多重要的接口:BootStrap、Channel、ChannelHandler、EventLoop、ChannelPipeLine等。
二、Netty的逻辑架构
Netty的逻辑架构可以分为网络通信层、事件调度层和服务编排层,每一层包含不同的核心组件,各层之间的关系如图:
1. 网络通信层
用于执行网络I/O操作,支持多种网络协议和I/O模型的连接操作。当网络数据读到内核缓冲区之后,会触发各种网络事件,这些事件灰分发给事件调度层处理。
BootStrap和BootServerStrap组件

BootStrap是整个Netty的入口,串联了Netty所有核心组件的初始化工作。
Channel组件

网络通信的载体,提供基本的API用于网络I/O操作,包括:register、bind、connect、read、write、flush等,
以JDK Channel为基础,进行了更高层次的抽象,屏蔽了底层的Socket。
channel的生命周期包含不同的状态,每个状态会绑定相应的事件回调,对应的事件由事件调度层进行处理。
2. 事件调度层
通过Reactor线程模型对各类事件进行聚合处理,通过Selector主循环线程集成多种事件,实际的业务处理逻辑交由服务编排层的Handler完成
EventLoopGroup和EventLoop组件
EventLoopGroup、EventLoop、Channel 的几点关系:
- EventLoopGroup本质是一个线程池,包含一个或多个EventLoop。EventLoop用于处理Channel声明周期内的所有I/O事件,如accept、connect、read、write等
- EventLoop同一时间会与一个线程绑定,每个EventLoop负责处理多个Channel
- 每新建一个Channel,EventLoopGroup会选择一个EventLoop与其绑定,该Channel在生命周期内可以对EventLoop进行多次绑定和解绑
EventLoopGroup的实现类是NioEventLoopGroup,NioEventLoopGroup也是Netty中最被推荐的线程模型。NioEventLoopGroup继承自MultithreadEventLoopGroup,基于NIO模型开发
EventLoop是Netty Reactor线程模型的实际实现方法,通过不同的参数配置,可以支持三种Reactor线程模型
- 单线程模型:EventLoopGroup 只包含一个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
- 多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
- 注册多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 是主 Reactor,Worker 是从 Reactor,它们分别使用不同的 EventLoopGroup,主 Reactor 负责新的网络连接 Channel 创建,然后把 Channel 注册到从 Reactor。
服务编排层
负责组装各类服务,是Netty的核心处理链,用以实现网络时间的动态编排和有序传播
ChannelPipeLine组件
负责编排组装各种ChannelHandler,通过双向链表将不同的ChannelHandler连接在一起。当I/O读写时间触发时,一次调用ChannelHandler列表对Channel的数据进行拦截和处理。
每一个新的Channel对应绑定一个新的ChannelPipeLine,因此ChannelPipeLine是线程安全的。一个ChannelPipeLine关联一个EventLoop,一个EventLoop绑定一个线程。
ChannelPipeline 中包含入站 ChannelInboundHandler 和出站 ChannelOutboundHandler 两种处理器。数据入站会有一系列ChannelInboundHandler 处理,再以相反的ChannelOutboundHandler 处理完后完成出站。
ChannelHandler和ChannelHandlerContext
ChannelHandler用于实际的业务处理逻辑,包括数据的编解码和其他转换工作,开发者只需要关心ChannelHandler的逻辑即可。
ChannelHandlerContext 用于保存 ChannelHandler 上下文,包含了 ChannelHandler 生命周期的所有事件,如 connect、bind、read、flush、write、close 等,可以实现ChannelHandler之间的交互。
每创建一个Channel就会绑定一个新的ChannelPipeLine,ChannelPipeLine每加入一个ChannelHandler都会绑定一个ChannelHandlerContext。
组件关系梳理
- 服务端启动初始化时有 Boss EventLoopGroup 和 Worker EventLoopGroup 两个组件,其中 Boss 负责监听网络连接事件。当有新的网络连接事件到达时,则将 Channel 注册到 Worker EventLoopGroup。
Worker EventLoopGroup 会被分配一个 EventLoop 负责处理该 Channel 的读写事件。每个 EventLoop 都是单线程的,通过 Selector 进行事件循环。 - 当客户端发起 I/O 读写事件时,服务端 EventLoop 会进行数据的读取,然后通过 Pipeline 触发各种监听器进行数据的加工处理。
- 客户端数据会被传递到 ChannelPipeline 的第一个 ChannelInboundHandler 中,数据处理完成后,将加工完成的数据传递给下一个 ChannelInboundHandler。
- 当数据写回客户端时,会将处理结果在 ChannelPipeline 的 ChannelOutboundHandler 中传播,最后到达客户端。
以上便是 Netty 各个组件的整体交互流程,你只需要对每个组件的工作职责有所了解,心中可以串成一条流水线即可,具体每个组件的实现原理后续课程我们会深入介绍。