​笔记原文:02 | 纵览全局:把握 Netty 整体架构脉络​

一、Netty 整体结构

Netty 结构一共分为三个模块

02 | 纵览全局:把握 Netty 整体架构脉络_编解码


下面做简要介绍,不理解没关系,先有个印象

1.1. Core 核心层

Core 核心层提供高效网络通信的能力。

包括可扩展的事件模型、通用的通信 API、支持零拷贝的 ByteBuf 等

1.2. Protocol Support 协议支持层

协议支持层覆盖了主流协议的编解码实现,此外 Netty 还支持自定义应用层协议。

Netty 丰富的协议支持降低了用户的开发成本,基于 Netty 我们可以快速开发 HTTP、WebSocket 等服务

1.3. Transport Service 传输服务层

传输服务层提供了网络传输能力。

用户可以更聚焦在业务逻辑实现上,而不必关心底层数据传输的细节。

二、Netty 逻辑架构

02 | 纵览全局:把握 Netty 整体架构脉络_服务端_02

2.1、网络通信层

网络通信层的职责是执行网络 I/O 的操作

网络通信层的核心组件包含BootStrap、ServerBootStrap、Channel 三个组件。

(1)、BootStrap & ServerBootStrap

Bootstrap 是“引导”的意思,引导器共分为两种类型

1、用于客户端引导的 Bootstrap;

2、用于服务端引导的 ServerBootStrap;

“引导器” 主要负责整个 Netty 程序的启动、初始化、服务器连接等过程,它相当于一条主线,串联了 Netty 的其他核心组件

两者非常重要的区别在于:

Bootstrap 可用于连接远端服务器,只绑定一个 EventLoopGroup。

ServerBootStrap 则用于服务端启动绑定本地端口,会绑定两个 EventLoopGroup,它俩分别称为 Boss 和 Worker。

Boss 和 Worker 可以理解为“老板”和“员工”的关系,Boss 会不停地接收新的连接,然后将连接分配给一个个 Worker 处理连接。

(2)、Channel

Channel 的字面意思是“通道”,它是网络通信的载体,提供了网络 I/O 操作的API。

Netty 自己实现的 Channel 是以 JDK NIO Channel 为基础的,相比较于NIO的Channel,Netty 的 Channel 提供了更高层次的抽象,同时屏蔽了底层 Socket 的复杂性。

总结:
BootStrap 和 ServerBootStrap 分别负责客户端和服务端的启动,它们是非常强大的辅助工具类;
Channel 是网络通信的载体,提供了与底层 Socket 交互的能力。

2.2、事件调度层

事件调度层通过 Reactor 线程模型,对各类事件进行聚合处理,通过 Selector 主循环线程集成多种事件( I/O 事件、信号事件、定时事件等),实际的业务处理逻辑是交给 “服务编排层” 中相关的 Handler 完成。

事件调度层的核心组件包括 EventLoopGroup、EventLoop。

(1)、EventLoopGroup

EventLoopGroup 本质是一个线程池,主要负责接收 I/O 请求,并分配线程执行处理请求。

02 | 纵览全局:把握 Netty 整体架构脉络_服务端_03

(2)、EventLoop

EventLoop 用于处理 Channel 生命周期内的所有 I/O 事件,如 accept、connect、read、write 等 I/O 事件。

EventLoop 同一时间会与一个线程绑定,每个 EventLoop 负责处理多个 Channel。

每新建一个 Channel,EventLoopGroup 会选择一个 EventLoop 与其绑定。该 Channel 在生命周期内都可以对 EventLoop 进行多次绑定和解绑。

2.3、服务编排层

服务编排层 负责组装各类服务,它是 Netty 的核心处理链,用以实现网络事件的动态编排有序传播

服务编排层的核心组件包括:

​1、ChannelPipeline;2、ChannelHandler;3、ChannelHandlerContext;​

(1)、ChannelPipeline

ChannelPipeline 负责组装各种 ChannelHandler

实际数据的编解码以及加工处理操作由 ChannelHandler 完成.

ChannelPipeline 可以理解为ChannelHandler 的实例列表——内部通过双向链表将不同的 ChannelHandler 链接在一起

ChannelPipeline 是线程安全的,因为每一个新的 Channel 都会绑定一个新的 ChannelPipeline。一个 ChannelPipeline 关联一个 EventLoop,一个 EventLoop 仅会绑定一个线程。

一一对应: Channel ↔ ChannelPipeline ↔ EventLoop ↔ Thread

客户端和服务端一次完整的请求应答过程可以分为三个步骤:客户端出站(请求数据)、服务端入站(解析数据并执行业务逻辑)、服务端出站(响应结果)。

02 | 纵览全局:把握 Netty 整体架构脉络_网络通信_04

(2)、ChannelHandler

数据的编解码工作以及其他转换工作实际都是通过 ChannelHandler 处理的

02 | 纵览全局:把握 Netty 整体架构脉络_网络通信_05

(3)、ChannelHandlerContext

ChannelHandlerContext 持有多个 ChannelHandler对象。

通过 ChannelHandlerContext 我们可以知道 ChannelPipeline 和 ChannelHandler 的关联关系

ChannelHandlerContext 可以实现 ChannelHandler 之间的交互,ChannelHandlerContext 包含了 ChannelHandler 生命周期的所有事件

Netty 的架构分层设计得非常合理,屏蔽了底层 NIO 以及框架层的实现细节,对于业务开发者来说,只需要关注业务逻辑的编排和实现即可。

2.4、组件关系梳理

02 | 纵览全局:把握 Netty 整体架构脉络_编解码_06

三、Netty 源码结构

3.1、Core 核心层模块

(1)、netty-common模块

netty-common模块是 Netty 的核心基础包,提供了丰富的工具类,其他模块都需要依赖它。

常用的包括通用工具类和自定义并发包。

(2)、netty-buffer 模块

netty-buffer 模块中Netty自己实现了的一个更加完备的ByteBuf 工具类,它是网络通信中的数据载体。

3.2、Protocol Support 协议支持层模块

(1)、netty-codec模块

主要负责编解码工作,通过编解码实现原始字节数据与业务实体对象之间的相互转化

(2)、netty-handler模块

主要负责数据处理工作。

3.3、Transport Service 传输服务层模块

(1)、netty-transport 模块

Netty 提供数据处理和传输的核心模块。

该模块提供了很多非常重要的接口,如 Bootstrap、Channel、ChannelHandler、EventLoop、EventLoopGroup、ChannelPipeline 等,可以说是 Netty 提供数据处理和传输的核心模块。