完成 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 控制台,可以看到服务已经注册
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)