基于 TCP 的 RPC 通信协议 - dubbo

演示了如何开发基于 dubbo 协议通信的服务。

本示例演示了如何开发基于 dubbo 协议通信的服务,可在此查看 本示例的完整代码

注意

为了保证老版本兼容性,Dubbo 3.3.0 及之前版本的默认协议都是 dubbo。但如果您是新用户,正在考虑使用 Dubbo 构建一套全新的微服务系统,我们推荐您在应用中明确配置使用 triple 协议。

运行示例

你可以跟随以下步骤,尝试运行本文档对应的示例源码。

首先,可通过以下命令下载示例源码

  1. git clone --depth=1 https://github.com/apache/dubbo-samples.git

进入示例源码目录:

  1. cd dubbo-samples/2-advanced/dubbo-samples-dubbo

使用 maven 打包示例:

  1. mvn clean install -DskipTests

启动提供者

运行以下命令启动提供者:

  1. java -jar ./dubbo-samples-dubbo-provider/target/dubbo-samples-dubbo-provider-1.0-SNAPSHOT.jar

启动消费者

运行以下命令:

  1. java -jar ./dubbo-samples-dubbo-consumer/target/dubbo-samples-dubbo-consumer-1.0-SNAPSHOT.jar

源码讲解

定义服务

首先是服务定义,使用 dubbo 协议时,我们首选需要通过 Java Interface 定义 Dubbo 服务。

  1. public interface DemoService {
  2. String sayHello(String name);
  3. }

服务提供者

其次,对于提供者一侧而言,需要提供服务的具体实现。

  1. @DubboService
  2. public class DemoServiceImpl implements DemoService {
  3. @Override
  4. public String sayHello(String name) {
  5. return "Hello " + name;
  6. }
  7. }

配置使用 dubbo 协议:

  1. dubbo:
  2. protocol:
  3. name: dubbo
  4. port: 20880

服务消费者

配置服务引用,如下所示:

  1. @Component
  2. public class Task implements CommandLineRunner {
  3. @DubboReference(url = "dubbo://127.0.0.1:20880/org.apache.dubbo.protocol.dubbo.demo.DemoService")
  4. private DemoService demoService;
  5. }

接下来,就可以发起对远程服务的 RPC 调用了:

  1. demoService.sayHello("world");

更多协议配置

序列化

消费者与提供者之间的调用使用 dubbo 协议,方法参数默认数据编码格式(即序列化)是 hessian2,同时你也可以设置使用其他任意序列化协议,序列化不影响 dubbo 协议的正常工作(只会对编码性能有一些影响)。

  1. dubbo:
  2. protocol:
  3. name: dubbo
  4. port: 20880
  5. serialization: fastjson2

注意

自 3.2.0 版本开始,Dubbo 增加了 序列化协议的自动协商机制,如果满足条件 两端都为 Dubbo3 特定版本 + 存在 fastjson2 相关依赖 + 配置了 prefer-serialization=fastjson2,则框架会自动优先尝试使用 fastjson2 序列化协议,如有任一一端由于各种原因不支持,则继续使用默认的 hessian2 序列化。

由于 Dubbo2 默认序列化协议是 hessian2,对于部分有拦截rpc调用payload的场景,比如sidecar等对链路payload有拦截与解析,在升级过程中需留意兼容性问题。

共享连接

对 dubbo 协议实现来说,消费端机器A与提供者机器B之间默认是使用的同一个链接,即不论在 A 与 B 之间有多少服务调用,默认都始终使用同一个 tcp 连接。当然,Dubbo 框架提供了方法可以让您调整 A 与 B 之间的 tcp 连接数。

此外,dubbo 协议还支持配置如 payload 限制、序列化、连接数、连接超时时间、心跳等,具体请参见【参考手册 - dubbo协议】

最后修改 September 17, 2024: fix doc (8b1dd8c278b)