修改使用的协议

1. 准备工作

  • dubbo-go cli 工具和依赖工具已安装
  • 创建一个新的 demo 应用

2. 如何配置网络协议

在快速开始章节可以看到,生成的Demo 将 Protocol 设置为 tri,表明使用 Triple 协议进行服务暴露和服务调用。快速开始章节使用的配置 API 进行配置的写入,这样的好处是无需使用配置文件。我们摘取出和网络协议相关的内容进行说明。

使用配置文件

参考 samples/helloworld

  • 客户端使用配置文件设置网络协议
  1. dubbo:
  2. consumer:
  3. references:
  4. GreeterClientImpl:
  5. protocol: tri # set protcol to tri
  6. interface: com.apache.dubbo.sample.basic.IGreeter
  • 服务端使用配置文件设置网络协议
  1. dubbo:
  2. protocols:
  3. triple: # define protcol-id 'triple'
  4. name: tri # set protcol to tri
  5. port: 20000 # set port to be listened
  6. provider:
  7. services:
  8. GreeterProvider:
  9. protocol-ids: triple # use protocol-ids named 'triple'
  10. interface: com.apache.dubbo.sample.basic.IGreeter

3. 编写 Dubbo 协议的接口和实现

3.1 定义接口和传输结构,位于api/api.go

  1. package api
  2. import (
  3. "context"
  4. "dubbo.apache.org/dubbo-go/v3/config"
  5. hessian "github.com/apache/dubbo-go-hessian2"
  6. "time"
  7. )
  8. //1. 定义传输结构, 如需 Java 互通,字段需要与 Java 侧对应,首字母大写
  9. type User struct {
  10. ID string
  11. Name string
  12. Age int32
  13. Time time.Time
  14. }
  15. func (u *User) JavaClassName() string {
  16. return "org.apache.dubbo.User" // 如果与 Java 互通,需要与 Java 侧 User class全名对应,
  17. }
  18. var (
  19. UserProviderClient = &UserProvider{} // 客户端指针
  20. )
  21. // 2。 定义客户端存根类:UserProvider
  22. type UserProvider struct {
  23. // dubbo标签,用于适配go侧客户端大写方法名 -> java侧小写方法名,只有 dubbo 协议客户端才需要使用
  24. GetUser func(ctx context.Context, req int32) (*User, error) //`dubbo:"getUser"`
  25. }
  26. func init(){
  27. hessian.RegisterPOJO(&User{}) // 注册传输结构到 hessian 库
  28. // 注册客户端存根类到框架,实例化客户端接口指针 userProvider
  29. config.SetConsumerService(UserProviderClient)
  30. }

2.2 编写 Go-Server 配置和代码

server/dubbogo.yaml

  1. dubbo:
  2. registries:
  3. demoZK: # 定义服务注册发现中心
  4. protocol: zookeeper
  5. address: 127.0.0.1:2181
  6. protocols:
  7. dubbo:
  8. name: dubbo # 协议名 dubbo
  9. port: 20000 # 监听端口
  10. provider:
  11. services:
  12. UserProvider: # 服务提供结构类名
  13. interface: org.apache.dubbo.UserProvider # 接口需要与 go/java 客户端对应

server/server.go

  1. package main
  2. import (
  3. "context"
  4. "dubbo.apache.org/dubbo-go/v3/common/logger" // dubbogo 框架日志
  5. "dubbo.apache.org/dubbo-go/v3/config"
  6. _ "dubbo.apache.org/dubbo-go/v3/imports" // dubbogo 框架依赖,所有dubbogo进程都需要隐式引入一次
  7. "dubbo3-demo/api"
  8. "strconv"
  9. "time"
  10. )
  11. type UserProvider struct {
  12. }
  13. // 实现接口方法
  14. func (u *UserProvider) GetUser(ctx context.Context, req int32) (*api.User, error) {
  15. var err error
  16. logger.Infof("req:%#v", req)
  17. user := &api.User{}
  18. user.ID = strconv.Itoa(int(req))
  19. user.Name = "laurence"
  20. user.Age = 22
  21. user.Time = time.Now()
  22. return user, err
  23. }
  24. //// MethodMapper 定义方法名映射,从 Go 的方法名映射到 Java 小写方法名,只有 dubbo 协议服务接口才需要使用
  25. //// go -> go 互通无需使用
  26. //func (s *UserProvider) MethodMapper() map[string]string {
  27. // return map[string]string{
  28. // "GetUser": "getUser",
  29. // }
  30. //}
  31. func init(){
  32. config.SetProviderService(&UserProvider{}) // 注册服务提供者类,类名与配置文件中的 service 对应
  33. }
  34. // export DUBBO_GO_CONFIG_PATH=dubbogo.yml 运行前需要设置环境变量,指定配置文件位置
  35. func main() {
  36. if err := config.Load(); err != nil {
  37. panic(err)
  38. }
  39. select {}
  40. }

2.3 编写 Go-Client 配置和代码

client/dubbogo.yaml

  1. dubbo:
  2. registries:
  3. demoZK: # 定义服务注册发现中心
  4. protocol: zookeeper
  5. address: 127.0.0.1:2181
  6. consumer:
  7. references:
  8. UserProvider: # 存根类名
  9. protocol: dubbo # dubbo 协议,默认 hessian2 序列化方式
  10. interface: org.apache.dubbo.UserProvider # 接口需要与 go/java 客户端对应

client/client.go

  1. package main
  2. import (
  3. "context"
  4. "dubbo.apache.org/dubbo-go/v3/common/logger"
  5. "dubbo.apache.org/dubbo-go/v3/config"
  6. _ "dubbo.apache.org/dubbo-go/v3/imports"
  7. "dubbo3-demo/api"
  8. )
  9. func main(){
  10. // 启动框架
  11. if err := config.Load(); err != nil{
  12. panic(err)
  13. }
  14. var i int32 = 1
  15. // 发起调用
  16. user, err := api.UserProviderClient.GetUser(context.TODO(), i)
  17. if err != nil {
  18. panic(err)
  19. }
  20. logger.Infof("response result: %+v", user)
  21. }

4. 启动服务

开启两个终端,分别进入server client 目录

分别执行;

  1. export DUBBO_GO_CONFIG_PATH=dubbogo.yml
  2. go run .

先后启动服务端和客户端, 可在客户端看到输出:

  1. response result: &{ID:1 Name:laurence Age:22 Time:2021-11-12 17:59:39.185 +0800 CST}

调用成功

更多samples可以参阅 【dubbo-go-samples】