Netty
Netty整体结构

Core核心层:提供底层网络通信的通用抽象和实现,包括可拓展的事件模型、通用的通信API、支持零拷贝的ByteBuf等
Protocol Support协议支持层:覆盖了主流协议的编解码实现,如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等,自持自定义应用层协议。
Transport Service传输服务层:提供了网络传输能力的定义和实现方法,支持Socket、HTTP隧道、虚拟机管道等传输方式,Netty的模块设计具备较高的通用性和可拓展性。
Netty逻辑处理架构

网络通信层
网络通信层的职责是执行网络I/O的操作,支持多种网络协议和I/O模型的的链接操作,包括下列三个组件(BootStrap、ServerBootStrap、Channel)。
BootStrap与ServerBootStrap
BootStrap主要负责整个Netty的启动、初始化、服务器连接等过程。

- BootStrap:可用于连接远端服务器,只绑定一个EventLoopGroup(Boss)
- ServerBootStrap:用于服务端启动绑定本地端口,绑定两个
EventLoopGroup(Worker)
每个服务器中都有一个Boss,会有一群做事情的Worker
Boss会不同地接收新的连接,将连接分配给一个个Worker处理连接。
Channel
channel是网络通信地载体,提供了基本的API用于网络I/O操作,如 register、bind、connect、read、write、flush等,netty自己实现的channel是以JDK NIO channel为基础的。


总结:
BootStrap与ServerBootStrap分别负责客户端和服务端地启动;Channel是网络通信地载体,提供了与底层Socket交互地能力。
事件调度层:
channel 生命周期内有多种状态,每种状态有相应的事件,如上图,那么这些是如何处理的呢?那么就要靠我们的事件调度层了。
事件调度层的职责:通过Reactor线程模型对各类事件进行聚合处理;通过Selector主循环线程集成多种事件(IO事件、信号事件、定时事件)。实际的业务处理逻辑交由服务编排层的handle完成。
事件调度层核心主键包括:EventLoopGroup和EventLoop。
EventLoopGroup和EventLoop
EventLoopGroup和EventLoop与channel关系如下:

1、EventLoopGroup本质是一个线程池,主要负责接受IO请求并分配线程执行处理请求。
2、EventLoop同一时间会与一个线程进行绑定,每个EventLoop会处理多个channel
3、每新建一个channel,会选择一个EventLoop进行绑定,每个channel的生命周期内,都可以对EventLoop进行多次绑定与解绑。

EventLoopGroup是Netty Reactor线程模型的具体实现方式。Netty 通过创建不同的EventLoopGroup的参数配置实现三种Reactor的线程模型:

服务编排层:
服务编排层:负责组装各类服务,用以实现网络事件的动态编排和有序传播。主要组件:
ChannelPipeLine、ChannelHandler、ChannelHandlerContext。
ChannelPipeLine负责组织各种ChannelHandler,实际数据的编解码以及加工处理操作由ChannelHandler完成。ChannelPipeLine可以理解为ChannelHandler的实例列表,内部通过双向链表将不同的ChannelHandler链接在一起。当IO读写事件触发时,ChannelPipeLine依次调用ChannelHandler对channel的数据进行拦截和处理。
ChannelPipeLine是线程安全的,因为每一个新的channel会对应绑定一个新的ChannelPipeLine。一个ChannelPipeLine会关联一个EventLoop,一个EventLoop仅会绑定一个线程。
ChannelPipeLine包含Inbound Handler和OutBound Handler两种处理器(入栈和出栈)。

客户端和服务端都有各自的ChannelPipeLine,

ChannelPipeLine、ChannelHandler、ChannelHandlerContext之间的关系

那么每个ChannelHandler绑定ChannelHandlerContext的作用是什么呢?
1、保存ChannelHandler上下文,通过ChannelHandlerContext可以知道ChannelHandler与ChannelPipeLine的关联关系
2、实现ChannelHandler之间的交互
3、包含ChannelHandler生命周期的所有事件,如:connect、bind、read、flush、write、close等
如果每个ChannelHandler都有一些通用的逻辑需要实现,没有ChannelHandlerContext这层模型抽象,那么就会有很多相同代码需要写
组件关系梳理

服务端启动时,有Boss EventLoopGroup和Worker EventLoopGroup两个组件,其中Boss 负责监听网络链接事件,当有新的网络链接事件到达时,将新的channel注册到Worker EventLoopGroup,EventLoopGroup会分配一个EventLoop该channel的读写事件,每个EventLoop都是单线程的,通过selector进行事件循环,当客户端发起读写事件时,服务端EventLoop会进行数据的读取,然后通过ChannelPipeLine触发各种监听器进行数据的加工处理。
源码包
- Core核心层:


- Protocol Support协议支持层:


- Transport Service传输服务层:
