Triple 协议

    Triple 协议是 Dubbo3 的主力协议,完整兼容 gRPC over HTTP/2,并在协议层面扩展了负载均衡和流量控制相关机制。本文档旨在指导用户正确的使用 Triple 协议。

    在开始前,需要决定服务使用的序列化方式,如果为新服务,推荐使用 protobuf 作为默认序列化,在性能和跨语言上的效果都会更好。如果是原有服务想进行协议升级,Triple 协议也已经支持其他序列化方式,如 Hessian / JSON 等

    1. 编写 IDL 文件

    2. 添加编译 protobuf 的 extension 和 plugin (以 maven 为例)

      1. <extension>
      2. <groupId>kr.motd.maven</groupId>
      3. <artifactId>os-maven-plugin</artifactId>
      4. <version>1.6.1</version>
      5. </extension>
      6. </extensions>
      7. <plugins>
      8. <plugin>
      9. <groupId>org.xolstice.maven.plugins</groupId>
      10. <artifactId>protobuf-maven-plugin</artifactId>
      11. <version>0.6.1</version>
      12. <configuration>
      13. <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}</protocArtifact>
      14. <pluginId>triple-java</pluginId>
      15. <outputDirectory>build/generated/source/proto/main/java</outputDirectory>
      16. </configuration>
      17. <executions>
      18. <execution>
      19. <goals>
      20. <goal>compile</goal>
      21. <goal>test-compile</goal>
      22. </goals>
      23. </execution>
      24. </executions>
      25. </plugin>
      26. </plugins>
    3. 构建/ 编译生成 protobuf Message 类

      1. $ mvn clean install
    1. 创建 Provider

      1. public static void main(String[] args) throws InterruptedException {
      2. ServiceConfig<IGreeter> service = new ServiceConfig<>();
      3. service.setInterface(IGreeter.class);
      4. service.setRef(new IGreeter1Impl());
      5. service.setProtocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051));
      6. service.setApplication(new ApplicationConfig("demo-provider"));
      7. service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
      8. service.export();
      9. new CountDownLatch(1).await();
      10. }
    2. 创建 Consumer

      1. public static void main(String[] args) throws IOException {
      2. ReferenceConfig<IGreeter> ref = new ReferenceConfig<>();
      3. ref.setInterface(IGreeter.class);
      4. ref.setCheck(false);
      5. ref.setInterface(IGreeter.class);
      6. ref.setCheck(false);
      7. ref.setProtocol(CommonConstants.TRIPLE);
      8. ref.setLazy(true);
      9. ref.setTimeout(100000);
      10. ref.setApplication(new ApplicationConfig("demo-consumer"));
      11. ref.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
      12. final IGreeter iGreeter = ref.get();
      13. System.out.println("dubbo ref started");
      14. try {
      15. final HelloReply reply = iGreeter.sayHello(HelloRequest.newBuilder()
      16. .setName("name")
      17. .build());
      18. TimeUnit.SECONDS.sleep(1);
      19. System.out.println("Reply:" + reply);
      20. } catch (Throwable t) {
      21. t.printStackTrace();
      22. }
      23. System.in.read();
      24. }
    3. 运行 Provider 和 Consumer ,可以看到请求正常返回了

    1. 编写 Java 接口

      1. public class IStreamGreeterImpl implements IStreamGreeter {
      2. @Override
      3. public StreamObserver<HelloRequest> sayHello(StreamObserver<HelloReply> replyObserver) {
      4. return new StreamObserver<HelloRequest>() {
      5. @Override
      6. System.out.println("onNext receive request name:" + helloRequest.getName());
      7. replyList.add(HelloReply.newBuilder()
      8. .setMessage("receive name:" + helloRequest.getName())
      9. .build());
      10. }
      11. @Override
      12. public void onError(Throwable cause) {
      13. System.out.println("onError");
      14. replyObserver.onError(cause);
      15. }
      16. @Override
      17. public void onCompleted() {
      18. System.out.println("onComplete receive request size:" + replyList.size());
      19. for (HelloReply reply : replyList) {
      20. replyObserver.onNext(reply);
      21. }
      22. replyObserver.onCompleted();
      23. }
      24. };
      25. }
      26. }
    2. 创建 Provider

      1. public class StreamProvider {
      2. public static void main(String[] args) throws InterruptedException {
      3. ServiceConfig<IStreamGreeter> service = new ServiceConfig<>();
      4. service.setInterface(IStreamGreeter.class);
      5. service.setRef(new IStreamGreeterImpl());
      6. service.setProtocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051));
      7. service.setApplication(new ApplicationConfig("stream-provider"));
      8. service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
      9. service.export();
      10. System.out.println("dubbo service started");
      11. new CountDownLatch(1).await();
      12. }
      13. }
    3. 创建 Consumer

    4. 运行 Provider 和 Consumer ,可以看到请求正常返回了

    省略上文中的 1-3 步,指定 Provider 和 Consumer 使用的协议即可完成协议升级。