dubbo-remoting 模块提供了多种客户端和服务端通信功能。
- 最底层部分即为 Remoting 层
- 包括 Exchange、Transport和Serialize 三层。本文主要描述 Exchange 和 Transport 两层。
Dubbo 整体架构设计图
- Dubbo直接集成已有的第三方网络库,如Netty、Mina、Grizzly 等 NIO 框架。
- dubbo-remoting-zookeeper使用 Apache Curator 实现了与 Zookeeper 的交互。
dubbo-remoting-api 模块
是其他 dubbo-remoting-* 模块的顶层抽象,其他 dubbo-remoting 子模块都是依赖第三方 NIO 库实现 dubbo-remoting-api 模块。
buffer 包
定义了缓冲区相关的接口、抽象类以及实现类。在各个 NIO 框架中都有自己的缓冲区实现。但这里的 buffer 包在更高层面,抽象了各个 NIO 框架的缓冲区,同时也提供了一些基础实现。
exchange 包
抽象了 Request 和 Response,并为其添加很多特性。这是整个远程调用核心部分。
transport 包
抽象网络传输层,但只负责抽象单向消息传输,即请求消息由 Client 端发出,Server 端接收;响应消息由 Server 端发出,Client端接收。有很多网络库可以实现网络传输,如Netty, transport 包是在网络库上层的一层抽象。
传输层核心接口
“端点(Endpoint)”,可通过一个 ip 和 port 唯一确定一个端点,两端点间会创建 TCP 连接,双向传输数据。Dubbo 将 Endpoint 之间的 TCP 连接抽象为(Channel)通道,将发起请求的 Endpoint 抽象为Client,接收请求的 Endpoint 抽象为Server。
Endpoint 接口
etXXX() 用于获得 Endpoint 本身的一些属性,如Endpoint 的本地地址、关联的 URL 信息以及底层 Channel 关联的 ChannelHandler。
send() 负责数据发送
close() 及 startClose() 用于关闭底层 Channel
isClosed() 方法用于检测底层 Channel 是否已关闭
Channel
对 Endpoint 双方连接的抽象,就像传输管道。消息发送端往 Channel 写入消息,接收端从 Channel 读取消息。
- 接口的定义
继承 Endpoint 接口,也具备开关状态以及发送数据能力
可在 Channel 上附加 KV 属性 - ChannelHandler
注册在 Channel 上的消息处理器,接口的定义
@SPI
注解表明该接口是一个扩展点。
有一类特殊的 ChannelHandler 专门负责实现编解码功能,从而实现字节数据与有意义的消息之间的转换,或是消息之间的相互转换
该接口也是一个扩展接口,encode()、decode() 被 @Adaptive 注解修饰,也就会生成适配器类,其中会根据 URL 中的 codec 值确定具体的扩展实现类。
DecodeResult 这个枚举是在处理 TCP 传输时粘包和拆包使用的,例如,当前能读取到的数据不足以构成一个消息时,就会使用 NEED_MORE_INPUT 枚举。