完成一次自己定义接口的版本 RPC 调用

完成一次 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

我们来调整 service 目录: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,每个 consumer 自行生成代码,或统一生成 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: ""

运行 client,获取 id:

export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yml
go run cmd/client.go