在 Apache Dubbo 中,协议封装(Protocol)是其核心模块之一,它定义了服务导出、引用和调用的统一接口,并通过 SPI 机制支持多种协议的动态加载。
Dubbo 的协议设计具有良好的抽象性与扩展性,使得开发者可以灵活地选择或自定义协议,比如:
- 默认协议:
dubbo(基于 Netty 的二进制协议) - 其他内置协议:
rmi,http,hessian,rest,webservice,thrift,gRPC - 用户可扩展协议:自定义实现
Protocol接口并通过 SPI 注册
一、Dubbo 协议的核心接口:Protocol
@SPI("dubbo")
public interface Protocol {
int getDefaultPort();
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
void destroy();
}
方法说明:
| 方法 | 描述 |
|---|---|
getDefaultPort() | 获取该协议的默认端口号 |
export() | 暴露服务(服务提供者调用) |
refer() | 引用服务(服务消费者调用) |
destroy() | 销毁协议资源 |
二、协议封装的核心流程图
+---------------------+
| Consumer |
+----------+----------+
|
v
+------------------+
| Protocol.refer() |
| (生成 Invoker) |
+--------+---------+
|
v
+--------------+
| 网络通信层 |
| (Netty / HTTP) |
+--------+-------+
|
v
+------------------+ +------------------+
| Protocol.export()|<------| Provider |
| (启动 Server) | +------------------+
+------------------+
三、协议封装的典型实现类
1. DubboProtocol(默认协议)
- 基于 Netty 实现
- 使用 二进制协议
- 支持长连接、多路复用
- 高性能,适合大规模分布式系统
核心逻辑:
public class DubboProtocol extends AbstractProtocol {
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
openServer(invoker.getUrl()); // 启动 Netty Server
return new DubboExporter<>(invoker, key, exporterMap);
}
private void openServer(URL url) {
String key = url.getAddress();
ExchangeServer server = serverMap.get(key);
if (server == null) {
server = Exchangers.bind(url, requestHandler); // 绑定请求处理器
serverMap.put(key, server);
}
}
}
2. HttpProtocol
- 基于 HTTP 协议
- 适合跨语言调用
- 可与 RESTful 集成
- 性能略低于 Dubbo 协议
3. RestProtocol
- 支持 JAX-RS 规范
- 可暴露为标准的 REST 接口
- 适合前后端分离架构
4. TripleProtocol(Dubbo 3.x 新增)
- 基于 gRPC 协议构建
- 兼容 gRPC 协议
- 支持双向流、异步调用
- 是未来主流协议
四、协议封装的 SPI 注册机制
Dubbo 所有协议都通过 SPI 机制注册,在 META-INF/dubbo/org.apache.dubbo.rpc.Protocol 文件中定义如下:
dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
rmi=org.apache.dubbo.rpc.protocol.rmi.RmiProtocol
http=org.apache.dubbo.rpc.protocol.http.HttpProtocol
rest=org.apache.dubbo.rpc.protocol.rest.RestProtocol
...
使用时可以通过配置文件指定协议:
<dubbo:protocol name="dubbo" port="20880"/>
或者多个协议并存:
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:protocol name="http" port="8080"/>
五、协议封装的关键组件
1. Invoker:远程调用的抽象
- 表示一个远程方法调用
- 被
Protocol.export()和Protocol.refer()使用 - 分为
本地调用和远程调用
public interface Invoker<T> extends Node {
Class<T> getInterface();
Result invoke(Invocation invocation) throws RpcException;
}
2. Exporter:服务导出器
- 用于保存已导出的服务
- 在服务销毁时调用
unexport()
public interface Exporter<T> {
Invoker<T> getInvoker();
void unexport();
}
3. ExchangeHandler:请求处理逻辑
private ExchangeHandler requestHandler = new ExchangeHandlerAdapter() {
public Object reply(ExchangeChannel channel, Object message) {
return handler.reply(channel, message); // 调用实际业务逻辑
}
};
六、协议封装的网络通信层
Dubbo 的协议封装依赖底层通信框架,主要使用的是:
1. NettyClient / NettyServer(默认)
- 基于 Netty 实现高性能 TCP 通信
- 支持长连接、心跳、断线重连等特性
2. HttpClient / HttpServer(HTTP 协议)
- 基于 JDK 或 Apache HttpClient 实现
- 支持标准 HTTP 请求/响应模型
七、协议封装的扩展方式
1. 自定义协议
可以自定义一个协议,只需:
步骤:
- 实现
Protocol接口 - 实现
Invoker和Exporter - 在
META-INF/dubbo/org.apache.dubbo.rpc.Protocol中注册
示例代码:
public class MyCustomProtocol implements Protocol {
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
System.out.println("MyCustomProtocol exporting...");
return new MyCustomExporter<>(invoker);
}
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
System.out.println("MyCustomProtocol referencing...");
return new MyCustomInvoker<>();
}
public void destroy() {}
}
配置文件:
mycustom=com.example.MyCustomProtocol
然后在 XML 或注解中使用:
<dubbo:protocol name="mycustom" port="3000"/>
八、协议封装的性能优化策略
| 优化点 | 说明 |
|---|---|
| 多路复用 | 一个连接复用多次调用,减少连接开销 |
| 异步调用 | 支持 Future/Promise 模式提升并发性能 |
| 序列化优化 | 默认使用 Hessian,也可切换 Protobuf、JSON |
| 线程池隔离 | IO 线程与业务线程分离,避免阻塞 |
| 连接池管理 | 客户端维护连接池,提高调用效率 |
九、Dubbo 3.x 协议演进:Triple 协议
Dubbo 3.x 引入了 Triple 协议,它是 Dubbo 的新一代协议,具备以下优势:
| 特性 | Triple 协议 |
|---|---|
| 基于 | gRPC |
| 传输层 | HTTP/2 |
| 支持 | 同步、异步、流式调用 |
| 跨语言 | 完全兼容 gRPC |
| 服务治理 | 支持负载均衡、限流、熔断 |
Triple 协议将成为 Dubbo 主推的协议,尤其适用于云原生、Mesh 架构。
十、总结
| 协议类型 | 通信方式 | 是否支持流式 | 是否兼容 gRPC | 性能 | 场景 |
|---|---|---|---|---|---|
| Dubbo(默认) | TCP | ❌ | ❌ | ⭐⭐⭐⭐ | 内部微服务调用 |
| HTTP | HTTP | ❌ | ✅ | ⭐⭐ | RESTful 接口 |
| REST | HTTP | ❌ | ✅ | ⭐⭐ | 前后端交互 |
| RMI | RMI | ❌ | ❌ | ⭐⭐ | Java 内部通信 |
| Thrift | TCP | ❌ | ✅ | ⭐⭐⭐ | 多语言 RPC |
| Triple(推荐) | HTTP/2 | ✅ | ✅ | ⭐⭐⭐⭐⭐ | 云原生、Mesh |
435

被折叠的 条评论
为什么被折叠?



