通信协议

配置通信协议

Dubbo-go 框架内置提供了两款协议:triple、dubbo,除此之外,框架还提供了多种协议扩展接入方式。

  • triple,基于 HTTP/1、HTTP/2 的高性能通信协议,100% 兼容 gRPC,支持 Unary、Streming 等通信模式;支持发布 REST 风格的 HTTP 服务。
  • dubbo,基于 TCP 的高性能私有通信协议,缺点是通用性较差,更适合在 Dubbo SDK 间使用;
  • 任意协议扩展,通过扩展 protocol 可以之前任意 RPC 协议,官方生态库提供 JsonRPC、thrift 等支持。

本篇文档中,我们将介绍关于 triple 协议的使用方式、如何实现与已有 dubbo2 系统的互相调用、扩展更多协议支持等。更多原理性介绍请参考 协议规范 或者 dubbo java 中相关描述文档

triple 协议

triple 协议支持使用 protobuf 和 non-protobuf 两种开发模式,我们 推荐使用 protobuf 模式开发服务

目前我们大部分示例都是使用这个模式开发,可查看 快速开始 学习完整开发示例,以下是基本步骤:

  1. 先使用 protobuf 定义服务
  1. syntax = "proto3";
  2. package greet;
  3. option go_package = "github.com/apache/dubbo-go-samples/helloworld/proto;greet";
  4. message GreetRequest {
  5. string name = 1;
  6. }
  7. message GreetResponse {
  8. string greeting = 1;
  9. }
  10. service GreetService {
  11. rpc Greet(GreetRequest) returns (GreetResponse) {}
  12. }
  1. 安装 protoc 插件,编译生成代码:
  1. protoc --go_out=. --go_opt=paths=source_relative \
  2. --go-triple_out=. --go-triple_opt=paths=source_relative \
  3. proto/greet.proto
  1. server 端发布服务
  1. srv, err := server.NewServer(
  2. server.WithServerProtocol(
  3. protocol.WithPort(20000),
  4. protocol.WithTriple(),
  5. ),
  6. )
  7. greet.RegisterGreetServiceHandler(srv, &GreetTripleServer{})
  1. client 端调用服务
  1. cli, err := client.NewClient(
  2. client.WithClientURL("127.0.0.1:20000"),
  3. )
  4. svc, err := greet.NewGreetService(cli)
  5. resp, err := svc.Greet(context.Background(), &greet.GreetRequest{Name: "hello world"})

dubbo-java 体系互调

如果 java 和 go 都使用 triple+protobuf 模式,很明显他们是可以直接互调通信的。

但问题是很多 java 用户是使用的 triple non-protobuf 模式,还有一些老版本用户是使用的 dubbo tcp 协议。对于这部分业务,我们要可以使用 dubbo-go 框架的以下编码模式实现协议互调:

  1. 定义服务

直接使用 struct 定义服务:

  1. type GreetProvider struct {
  2. }
  3. func (*GreetProvider) SayHello(req string, req1 string, req2 string) (string, error) {
  4. return req + req1 + req2, nil
  5. }
  1. server 发布服务

指定要发布的协议,可以是 dubbo、triple 或其他协议,请注意 WithInterface("GreetProvider") 要保持和 dubbo-java 侧的服务名一致(如保持 java 全路径名):

  1. ins, err := dubbo.NewInstance(
  2. dubbo.WithName("dubbo_server"),
  3. dubbo.WithProtocol(
  4. protocol.WithTriple(),
  5. protocol.WithPort(20001)),
  6. )
  7. srvDubbo, err := ins.NewServer()
  8. if err != nil {
  9. panic(err)
  10. }
  11. if err = srvDubbo.Register(&GreetProvider{}, nil, server.WithInterface("GreetProvider")); err != nil {
  12. panic(err)
  13. }
  14. if err = srvDubbo.Serve(); err != nil {
  15. logger.Error(err)
  16. }
  1. client 调用服务

指定要调用的协议,可以是 dubbo、triple 或其他协议,请注意 WithInterface("GreetProvider") 要保持和 dubbo-java 侧的服务名一致(如保持 java 全路径名):

  1. cliDubbo, _ := client.NewClient(
  2. client.WithClientProtocolTriple(),
  3. client.WithClientSerialization(constant.Hessian2Serialization),
  4. )
  5. connDubbo, _ := cliDubbo.Dial("GreetProvider")
  6. ipanic(err)
  7. }
  8. var respDubbo string
  9. if err = connDubbo.CallUnary(context.Background(), []interface{}{"hello", "new", "dubbo"}, &respDubbo, "SayHello"); err != nil {
  10. logger.Errorf("GreetProvider.Greet err: %s", err)
  11. return
  12. }

协议扩展

Dubbo 框架支持协议扩展,目前官方生态支持的协议包括:

  • triple
  • dubbo
  • jsonrpc

在一些场景下,你可以在一个应用内同时发布多个协议的服务,或者同时以不同的协议调用服务,这里有一个 多协议发布的使用示例 供参考。

最后修改 September 13, 2024: Refactor website structure (#2860) (1a4b998f54b)