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