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