非protoubf模式协议互通(适用于老版本 dubbo java 应用)

如果您是 dubbo java 的老用户,可能您的 dubbo java 应用并没有使用 protobuf(直接使用 java interface 定义服务),这个时候您需要使用以下方式开发 dubbo go-client,来调用老版本的 dubbo 服务。

注意

在阅读本文档之前,请记住我们推荐使用 protobuf+triple 的模式编写 java 和 go 语言互通的服务。本文仅当您已经有老版本 dubbo java 应用的情况下适用,否则的话请参考上一篇文档,使用 protobuf+triple 开发服务。

可在此查看本文档 完整示例源码

go-client 调用 java-server

但如果您是 dubbo java 的老用户,可能您的 dubbo java 应用并没有使用 protobuf(直接使用 java interface 定义服务),这个时候您需要使用以下方式开发 dubbo go-client,来调用老版本的 dubbo 服务。

以下方案同时支持 triple(non-protobuf) 和 dubbo 协议,你只需要调整协议配置 client.WithClientProtocolTriple() 即可。

假设我们当前的 java 服务定义如下:

  1. package org.apache.dubbo.samples.api;
  2. public interface GreetingsService {
  3. String sayHi(String name);
  4. }

我们需要这么编写 go-client,以实现服务调用:

  1. // 生成共享 client,指定
  2. cliDubbo, _ := client.NewClient(
  3. client.WithClientProtocolDubbo(),
  4. client.WithClientSerialization(constant.Hessian2Serialization),
  5. )
  6. // 生成服务代理,这里指定 java 服务全路径名
  7. connDubbo, _ := cliDubbo.Dial("org.apache.dubbo.samples.api.GreetingsService", client.WithURL("tri://localhost:50052"))
  8. var respDubbo string
  9. // 发起调用,参数以数组形式指定(标准 json 格式,可参考 java 泛化调用)
  10. connDubbo.CallUnary(context.Background(), []interface{}{"hello"}, &respDubbo, "SayHello")

接下来我们尝试运行示例:

  1. 运行 java server
  1. ./java/java-server/run.sh

检查服务运行正常:

  1. curl \
  2. --header "Content-Type: application/json" \
  3. --data '{"name": "Dubbo"}' \
  4. http://localhost:50052/org.apache.dubbo.sample.Greeter/sayHello
  1. 运行 go client
  1. go run go/go-server/cmd/client.go

java-client 调用 go-server

这种场景,意味着您要完全从头开发 go server 服务,这时我们建议是直接使用 protbuf 来开发 go server 服务,java client 侧也使用 protobuf 对新增服务发起调用。具体使用示例请参考上一篇文档。

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