前言
Dubbo3.0推出了一个新的协议Triple,我们今天简单看看它的用法。
Triple总览
官方说明:看这里 ,总结为以下几点:
- 打通 gRPC 生态。
- 网关友好。(dubbo协议 只能 HTTP 转 泛化Dubbo 调用后端服务,现在可以接入Ingress方案)
- 异步和流式支持。(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。