【034】Dubbo3从0到1系列之dubbo-remoting模块
文章目录
- 一、概述
- 1.1 dubbo-remoting模块在哪里?
- 1.2 dubbo网络库
- 1.3 各个子模块介绍
- 二、dubbo-remoting模块
- 2.1 dubbo-remoting-api
- 2.2 dubbo-remoting-api功能详解
有前边的博客当中,怩对Dubbo注册中心相关实现做了详细的介绍, 下边开始介绍
dubbo-remoting模块
该模块提供了多种客户端和服务端通信的功能.
一、概述
1.1 dubbo-remoting模块在哪里?

在上图红框部分即为: remoting层,其中包含了:
- Exchage
- Transport
- erialize
1.2 dubbo网络库
Dubbo 并没有自己实现一套完整的网络库,而是使用现有的、相对成熟的第三方网络库,例如,Netty、Mina 或是 Grizzly 等 NIO 框架。我们可以根据自己的实际场景和需求修改配置,选择底层使用的 NIO 框架。

dubbo-remoting-netty4 子模块使用 Netty4 实现 Dubbo 的远程通信.
1.3 各个子模块介绍
-
dubbo-remoting-api
- 这是Dubbo远程通信层的核心API模块,定义了基础的接口和抽象。
- 定义基本概念如 Channel、Client、RemotingServer、Codec 等
- 提供交换层抽象如 Request、Response、ExchangeChannel、ExchangeClient、ExchangeServer
- 包含缓冲区管理工具(ChannelBuffer 及相关类)
- 定义协议检测和线路协议抽象(ProtocolDetector、WireProtocol)
- 包含整个远程通信系统中使用的通用异常和常量
-
dubbo-remoting-netty 和 dubbo-remoting-netty4
- 这两个模块基于不同版本的Netty提供了远程传输层的实现:
- dubbo-remoting-netty:基于较旧的 Netty 3.x 版本
- dubbo-remoting-netty4:基于更现代且性能更好的 Netty 4.x 版本
- 都实现了 Client、RemotingServer、Channel 等核心接口
- 包含特定于Netty的编解码器和消息处理器
- 通过Netty的事件循环模型提供连接管理和事件处理
-
dubbo-remoting-http12
- 此模块为Dubbo服务提供HTTP/1.x和HTTP/2协议支持:
- 支持HTTP/1.1和HTTP/2协议
- 实现基于HTTP的请求/响应处理机制
- 包含各种HTTP相关组件如头部、Cookie、方法、状态码等
- 提供HTTP传输的消息序列化/反序列化能力
- 基于Netty实现HTTP处理
-
dubbo-remoting-http3
- 此模块添加了HTTP/3协议支持:
- 基于QUIC协议构建,以提高性能
- 使用Netty的HTTP/3实现
- 提供HTTP/3的传输监听器和SSL上下文配置
- 相比HTTP/2具有更低延迟和更好的连接效率
-
dubbo-remoting-websocket
- 为Dubbo添加WebSocket协议支持:
- 构建在http12模块之上
- 提供实时双向通信能力
- 实现WebSocket帧编解码和升级机制
- 允许通过持久连接进行数据流传输
-
dubbo-remoting-zookeeper-curator5
- 提供与Apache ZooKeeper集成的服务发现和协调功能:
- 使用Apache Curator 5.x作为ZooKeeper客户端库
- 实现与ZooKeeper集群的连接管理
- 提供子节点和数据变化的监听机制
- 处理ZooKeeper会话状态管理和事件通知
二、dubbo-remoting模块
2.1 dubbo-remoting-api
这里需要注意的是, 在dubbo中的dubbo-remoting-api模块是其它dubbo-remoting-*模块的【抽象】, 其它dubbo-remotiong子模块都是依赖第三方nio库,实现
dubbo-remoting-api模块的.
dubbo-remoting-api 中对整个 Remoting 层的抽象,dubbo-remoting-api 结构如下所示:

一般情况下,我们会将功能类似或是相关联的类放到一个包中,所以我们需要先来了解 dubbo-remoting-api 模块中各个包的功能。
2.2 dubbo-remoting-api功能详解
✅ 1. Buffer 包 (org.apache.dubbo.remoting.buffer)
Buffer 包提供跨不同网络框架的字节缓冲区操作抽象:
- ChannelBuffer: 主要接口,类似于 Netty 的 ByteBuf,用于字节缓冲区操作
- AbstractChannelBuffer: 抽象基类,提供常见功能实现
- HeapChannelBuffer 和 ByteBufferBackedChannelBuffer: 分别针对堆内存和直接内存的具体实现
- 工厂类如 ChannelBufferFactory, HeapChannelBufferFactory, DirectChannelBufferFactory 用于创建适当的缓冲区实例
- 流包装器如 ChannelBufferInputStream 和 ChannelBufferOutputStream 用于与 Java I/O API 集成
这个包使得 Dubbo 能够在不依赖特定网络框架的情况下工作。
✅ 2. Exchange 包 (org.apache.dubbo.remoting.exchange)
Exchange 包处理高级的请求-响应通信模式:
核心组件:
- Request 和 Response: 表示带有唯一 ID 用于关联的 RPC 请求和响应
- ExchangeChannel, ExchangeClient, ExchangeServer: 在基础 channel/client/server 基础上扩展了请求-响应语义
- ExchangeHandler: 处理 exchange 层事件和消息的接口
- Exchanger: 用于交换实现的 SPI 扩展点
关键特性:
- 通过 CompletableFuture 支持异步通信
- 心跳机制通过 HeartBeatRequest 和 HeartBeatResponse 实现
- 默认实现 HeaderExchangeChannel 管理请求-响应关联
- DefaultFuture 跟踪待处理请求并处理超时
支持子包:
- codec: 处理请求和响应的序列化/反序列化
- support: 提供实用类和基础实现
✅ 3. Transport 包 (org.apache.dubbo.remoting.transport)
Transport 包包含基础传输层抽象:
核心接口:
- Channel: 表示两个端点之间的通信通道
- Client 和 RemotingServer: 客户端和服务器端点抽象
- ChannelHandler: 处理通道生命周期事件和消息处理
- Codec 和 Codec2: 定义消息如何编码/解码以进行传输
- Transporter: 创建传输实现的 SPI
- Dispatcher: 决定事件如何分发到线程池
抽象实现:
- AbstractChannel, AbstractClient, AbstractServer: 减少实现复杂性的基类
- AbstractEndpoint: 端点的通用功能
- 各种 dispatcher 实现用于不同的线程模型
✅ 4. 重要接口
核心通信接口:
Channel:
- 表示单个通信通道
- 提供发送消息、获取远程地址、检查连接状态的方法
- 支持添加属性的扩展点
Client:
- 继承 Channel 和 Resetable 接口
- 添加重连功能
- 管理连接生命周期
RemotingServer:
- 管理多个通道
- 提供服务器端功能如绑定端口
- 支持重置配置参数
编解码接口
Codec 和 Codec2:
- 定义对象如何序列化以进行传输
- Codec2 是更新版本,设计更好
- 由传输实现用于编码/解码消息
处理器接口
ChannelHandler:
- 生命周期回调:connected, disconnected, sent, received, caught
- 由高层组件实现以处理消息
- 形成 Dubbo 事件驱动架构的基础
扩展点
- Transporter: 创建客户端/服务器实现
- Exchanger: 创建交换层客户端/服务器
- Dispatcher: 决定事件处理的线程模型
所有这些都遵循 Dubbo 的 SPI (Service Provider Interface) 模式以实现可扩展性
这些核心组件协同工作,提供了一个灵活、可扩展的远程通信框架,可以支持各种协议和传输机制,同时保持一致的 API。

