完成 RPC 调用(自定义接口的版本)

1 概述

在本章中,我们将实现一个简单的小需求,通过分布式 ID 生成服务来获取分布式 ID(假设是一个分布式 ID,我们不讨论 ID 生成方案和算法,这里我们直接使用 uuid 代替,只是为了演示自定义服务的创建)

2. 服务器实现

首先使用 dubbogo-cli 创建 IDC 服务

dubbogo-cli newApp IDC
cd IDC
tree.

.
├── Makefile
├── api
│ ├── api.pb.go
│ ├── api.proto
│ └── api_triple.pb.go
├──build
│ └── Dockerfile
├── chart
│ ├── app
│ │ ├── Chart.yaml
│ │ ├── templates
│ │ │ ├── _helpers.tpl
│ │ │ ├── deployment.yaml
│ │ │ ├── service.yaml
│ │ │ └── serviceaccount.yaml
│ │ └── values.yaml
│ └── nacos_env
│ ├── Chart.yaml
│ ├── templates
│ │ ├── _helpers.tpl
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
├── cmd
│ └── app.go
├── conf
│ └── dubbogo.yaml
├── go.mod
├── go.sum
└── pkg
    └── service
        └── service.go

我们编辑 proto 来定义我们的接口

syntax = "proto3";
package api;

option go_package = "./;api";

service Generator {
  rpc GetID (GenReq) returns (GenResp) {}
}

message GenReq {
  string appId = 1;
}

message GenResp {
  string id = 1;
}

生成代码

$ cd api
$ protoc --go_out=. --go-triple_out=. ./api.proto

让我们调整服务目录:pkg/service/service.go 修改后的代码如下

type GeneratorServerImpl struct {
api. UnimplementedGeneratorServer
}

func (s *GeneratorServerImpl) GetID(ctx context.Context, in *api.GenReq) (*api.GenResp, error) {
logger.Infof("Dubbo-go GeneratorProvider AppId = %s\n", in.AppId)
uuid, err := uuid. NewV4()
if err != nil {
logger.Infof("Dubbo-go GeneratorProvider get id err = %v\n", err)
return nil, err
}
return &api.GenResp{Id: uuid.String()}, nil
}

func init() {
config. SetProviderService(&GeneratorServerImpl{})
}

同时,我们调整 conf/dubbogo.yaml 中的 provider 部分

dubbo:
  registries:
    nacos:
      protocol: nacos
      address: 127.0.0.1:8848
  protocols:
    triple:
      name: tri
      port: 20000
  provider:
    services:
      GeneratorServerImpl:
        interface: "" # read from stub

我们需要拉起一个依赖的注册中心,nacos,如果你已经有一个现成的,这一步可以忽略,我们使用 docker 快速启动一个 nacos

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up

最后,我们启动服务器

export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml
go run cmd/app.go

打开 nacos 控制台,可以看到服务已经注册 img

2. 客户端使用

首先,我们可以将我们服务器的 API 共享给客户端,并生成相关的代码(这里我们可以根据实际项目需要共享 proto,每个消费者自己生成代码,或者统一生成 sdk 后引入到依赖服务中) 客户端目录如下

.
├── api
│ ├── api.pb.go
│ ├── api.proto
│ └── api_triple.pb.go
├── cmd
│ └── client.go
├── conf
│ └── dubbogo.yml
├── go.mod
├── go.sum

api 目录与服务器的 api 目录相同 client.go 代码如下


var grpcGeneratorImpl = new(api. GeneratorClientImpl)

func main() {
config. SetConsumerService(grpcGeneratorImpl)
if err := config.Load(); err != nil {
panic(err)
}

logger.Info("start to test dubbo")
req := &api. GenReq{
AppId: "laurence",
}
reply, err := grpcGeneratorImpl. GetID(context. Background(), req)
if err != nil {
logger. Error(err)
}
logger.Infof("get id result: %v\n", reply.Id)
}

dubbogo.yml 如下

dubbo:
  registries:
    nacos:
      protocol: nacos
      address: 127.0.0.1:8848
  consumer:
    references:
      GeneratorClientImpl:
        protocol: tri
        interface: ""

运行客户端获取 id,如下

export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yml
go run cmd/client.go
...
...
2022-12-30T20:59:19.971+0800 INFO cmd/client.go:44 start to test dubbo
2022-12-30T20:59:19.982+0800 INFO cmd/client.go:52 get id result: aafd9c73-4014-4d67-a67f-5d107105647b

3. 更多

可以发现我们使用 nacos 作为注册中心,当然我们也可以使用其他的注册中心,更多使用方法可以参考 注册中心


上次修改时间:2023 年 1 月 2 日:增强 Dubbogo 文档 (#1800) (71c8e722740)