Netty
1、概述
2、线程模型
3、核心组件
3.1 Channel
3.2 ChannelHandler和ChannelPipeline
3.3 EventLoop和EventLoopGroup
3.4 Future和Promise
4、创建过程
4.1 服务端创建过程
4.2 客户端创建过程
5、TCP粘包和拆包
6、序列化与反序列化
-
+
游客
注册
登录
Channel
## 1 功能说明 1. Channel**是 Netty 网络操作抽象类**,**聚合了一组功能**,包括但不限于**网络的读**、**写**,**客户端发起连接**,**主动关闭连接**,**链路关闭**,**获取通信双方的网络地址**等。 2. 他**也包含了 Netty 框架相关的一些功能**,包括**获取该 Channel 的 EventLoop**,**获取缓冲分配器 ByteBufAllocator 和 ChannelPipeline**等。 ### 1.1 工作原理 #### 1.1.1 为什么不使用 JDK NIO 原生的 Channel 1. JDK 的 `SocketChannel` 和 `ServerSocketChannel`**没有统一的 Channel 接口供业务开发者使用**,**对于用户而言**,**没有统一的操作视图**,**使用起来并不方便**。 2. JDK 的 `SocketChannel` 和 `ServerSocketChannel` 的主要职责是**网络 I/O 操作**,由于他们**是 SPI 类接口**,**由具体的虚拟机厂家来提供**,所以**通过继承 SPI 功能类来扩展其功能的难度很大**,**直接实现 `SocketChannel` 和 `ServerSocketChannel` 抽象类**,**工作量和重新开发一个新的 Channel 功能类是差不多的**。 > 什么是 SPI,他和 API 有什么区别? > > 1. **SPI**: > 1. SPI 全称为**Service Provider Interface**,是**Java 提供的一套用来被第三方实现或者扩展的接口**,他**可以用来启用框架扩展和替换组件**,主要作用就是**为这些被扩展的 API 寻找服务实现**。 > 2. SPI 是**调用方来制定接口规范**,**提供给外部来实现**,**调用方在调用时选择自己需要的外部实现**。 > 3. 从使用人员上来说,SPI**被框架扩展人员使用**。 > 2. **API**: > 1. API 全称**Application Programming Interface**,大多数情况下都是**实现方制定接口并完成对接口的实现**,**调用方仅仅依赖接口调用**,且**无权选择不同实现**。 > 2. 从使用人员上来说,API 直接**被应用开发人员使用**。 > 3. **Netty 的 Channel 需要能够跟 Netty 的整体框架融合在一起**,例如 I/O 模型、基于 ChannelPipeline 的定制模型、以及基于原数据描述配置化的 TCP 参数等,这些**JDK 的 `SocketChannel` 和 `ServerSocketChannel` 都没有提供**,**需要重新封装**。 4. **自定义的 Channel**,**功能实现更加灵活**。 #### 1.1.2 设计理念 1. **在 Channel 接口层**,**采用 Facade 模式进行统一封装**,**将网络 I/O 操作**、**网络 I/O 相关联的其他操作封装起来**,**统一对外提供**。 2. **Channel 接口的定义尽量大而全**,**为 `SocketChannel` 和 `ServerSocketChannel` 提供统一的视图**,**由不同子类实现不同的功能**,**公共功能在抽象父类中实现**,**最大程度地实现功能和接口的重用**。 3. **具体实现采用聚合而非包含的方式**,**将相关的功能类聚合在 Channel 中**,**由 Channel 统一负责分配和调度**,**功能实现更加灵活**。 #### 1.1.3 生命周期 1. Channel 接口中**定义了一组和 `ChannelInboundHandler` 密切相关的简单但功能强大的状态模型**: 1. `ChannelUnregistered`:Channel**已经被创建**,但**还未注册到 EventLoop**。 2. `ChannelRegistered`:Channel**已经被注册到了 EventLoop**。 3. `ChannelActive`:Channel**处于活动状态**(已经连接到他的远程节点),**现在可以接收和发送数据了**。 4. `ChannelInactive`:Channel**没有连接到远程节点**。 2. Channel 的生命周期如下图所示,**当这些状态发生变化时**,**就会生成对应的事件**,**这些事件将会被转发给 ChannelPipeline 中的 ChannelHandler**,然后**对他们做出响应**。 ![](/media/202108/2021-08-24_172420_964676.png) ## 参考文献 1. 《Netty 权威指南 第 2 版》 2. [Java SPI 详解](https://www.cnblogs.com/jy107600/p/11464985.html)。 3. 《Netty 实战》
ricear
2021年8月25日 10:42
©
BY-NC-ND(4.0)
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码