Dubbo3.0 Triple协议

前言

Dubbo3.0推出了一个新的协议Triple,我们今天简单看看它的用法。

Triple总览

官方说明:看这里 ,总结为以下几点:

  1. 打通 gRPC 生态。
  2. 网关友好。(dubbo协议 只能 HTTP 转 泛化Dubbo 调用后端服务,现在可以接入Ingress方案)
  3. 异步和流式支持。(dubbo协议 多用于响应式的场景,不适合传大规模的数据。3.0增加流式场景,支持大规模数据的传输)

快速搭建

环境准备

  • 操作系统:Windowns
  • JDK版本:1.8
  • 编辑工具:IntelliJ IDEA Community Edition 2021.1.2 x64
  • Zookeeper:3.5.6(3.4或3.5以上的版本都行)

创建项目

项目有三个模块,分别是api、consumer、provider。proto文件都放在api中,consumer放消费端的代码,provider放服务提供者的代码。

api

依赖

<dependencies>
    <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo</artifactId>
      <version>3.0.9</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-all</artifactId>
      <version>1.44.1</version>
    </dependency>
</dependencies>

proto插件

这里也是定义在pom中

<build>
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.6.1</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>0.6.1</version>
        <configuration>
          <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
          </protocArtifact>
          <pluginId>grpc-java</pluginId>
          <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
          </pluginArtifact>
          <protocPlugins>
            <protocPlugin>
              <id>dubbo</id>
              <groupId>org.apache.dubbo</groupId>
              <artifactId>dubbo-compiler</artifactId>
              <version>0.0.4.1</version>
              <mainClass>org.apache.dubbo.gen.tri.Dubbo3TripleGenerator</mainClass>
            </protocPlugin>
          </protocPlugins>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>test-compile</goal>
              <goal>compile-custom</goal>
              <goal>test-compile-custom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin.version}</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

proto文件

地址:看这里

proto文件和grpc的定义方式是一样的,这里就不多讲。

consumer

地址:看这里

这个和grpc的用法类似,但不同的是grpc在创建客户端的时候要指定ManagedChannel相关的配置,而这里是通过dubbo直接使用ReferenceConfig#get()即可拿到代理类

provider

地址:看这里

这个地方也是和grpc类似,但不同的是需要将实现类,通过ServiceConfig#setRef()来设置请求处理类。

写在最后

从java角度来说我更倾向于使用dubbo协议,triple协议让我使用起来没有那么方便。

从java使用者的视角来看确实是这样,所以如果系统没有多语言相互调用的场景下,使用dubbo协议确实会更方便。当然,如果是网关类型的系统,使用triple协议也是很有必要的。因为目前很多网关都是嵌入到k8s生态中的,使用triple可以令网关的方案选型更加灵活。还有就是triple的流式通讯,非常适合现在的短视频时代的视频数据传输,如果有这方面的需求也可以使用triple。