go-zero rpc命令

2022-04-22 10:32 更新

rpc命令

Goctl Rpc是goctl腳手架下的一個rpc服務代碼生成模塊,支持proto模板生成和rpc服務代碼生成,通過此工具生成代碼你只需要關注業(yè)務邏輯編寫而不用去編寫一些重復性的代碼。這使得我們把精力重心放在業(yè)務上,從而加快了開發(fā)效率且降低了代碼出錯率。

特性

  • 簡單易用
  • 快速提升開發(fā)效率
  • 出錯率低
  • 貼近protoc

快速開始

方式一:快速生成greet服務

通過命令 ?goctl rpc new ${servieName}?生成

如生成greet rpc服務:

  goctl rpc new greet

執(zhí)行后代碼結構如下:

.
├── etc
│   └── greet.yaml
├── go.mod
├── go.sum
├── greet
│   ├── greet.go
│   ├── greet.pb.go
│   └── greet_grpc.pb.go
├── greet.go
├── greet.proto
└── internal
    ├── config
    │   └── config.go
    ├── logic
    │   └── pinglogic.go
    ├── server
    │   └── greetserver.go
    └── svc
        └── servicecontext.go

方式二:通過指定proto生成rpc服務

  • 生成proto模板

goctl rpc template -o=user.proto
syntax = "proto3";

package user;
option go_package="./user";

message Request {
  string ping = 1;
}

message Response {
  string pong = 1;
}

service User {
  rpc Ping(Request) returns(Response);
}

  • 生成rpc服務代碼

$ goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.

準備工作

  • 安裝了go環(huán)境
  • 安裝了protoc & protoc-gen-go,并且已經設置環(huán)境變量

用法

rpc服務生成用法

goctl rpc protoc -h
NAME:
   goctl rpc protoc - generate grpc code

USAGE:
   example: goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.

DESCRIPTION:
   for details, see https://go-zero.dev/cn/goctl-rpc.html

OPTIONS:
   --zrpc_out value  the zrpc output directory
   --style value     the file naming format, see [https://github.com/zeromicro/go-zero/tree/master/tools/goctl/config/readme.md]
   --home value      the goctl home path of the template
   --remote value    the remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
                     The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
   --branch value    the branch of the remote repo, it does work with --remote

參數(shù)說明

  • --zrpc_out 可選,默認為proto文件所在目錄,生成代碼的目標目錄
  • --style 可選,輸出目錄的文件命名風格
  • --home 可選,指定模板路徑
  • --remote 可選,指定模板遠程倉庫
  • --branch 可選,指定模板遠程倉庫分支,與 --remote 配合使用

你可以理解為 zrpc 代碼生成是用 goctl rpc $protoc_command --zrpc_out=${output} 模板,如原來生成 grpc 代碼指令為

$ protoc user.proto --go_out=. --go-grpc_out=.

則生成 zrpc 代碼指令就為

$ goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.
  1. --go_out 與 --go-grpc_out 生成的最終目錄必須一致
  2. --go_out & --go-grpc_out 和 --zrpc_out 的生成的最終目錄必須不為同一目錄,否則pb.go和_grpc.pb.go就與main函數(shù)同級了,這是不允許的。 --go_out 與 --go-grpc_out 生產的目錄會受 --go_opt 和 --grpc-go_opt 和proto源文件中 go_package值的影響。

開發(fā)人員需要做什么

關注業(yè)務代碼編寫,將重復性、與業(yè)務無關的工作交給goctl,生成好rpc服務代碼后,開發(fā)人員僅需要修改

  • 服務中的配置文件編寫(etc/xx.json、internal/config/config.go)
  • 服務中業(yè)務邏輯編寫(internal/logic/xxlogic.go)
  • 服務中資源上下文的編寫(internal/svc/servicecontext.go)

注意事項

  • proto暫不支持多文件同時生成
  • proto不支持外部依賴包引入,message不支持inline
  • 目前main文件、shared文件、handler文件會被強制覆蓋,而和開發(fā)人員手動需要編寫的則不會覆蓋生成,這一類在代碼頭部均有的標識,請注意不要在里面寫業(yè)務性代碼;也不要將它寫在業(yè)務性代碼里面。

    // Code generated by goctl. DO NOT EDIT!
    // Source: xxx.proto

proto import

對于rpc中的requestType和returnType必須在main proto文件定義,對于proto中的message可以像protoc一樣import其他proto文件。

錯誤import

syntax = "proto3";

package greet;

option go_package = "./greet";

import "base/common.proto";

message Request {
  string ping = 1;
}

message Response {
  string pong = 1;
}

service Greet {
  rpc Ping(base.In) returns(base.Out);// request和return 不支持import
}

正確import

syntax = "proto3";

package greet;

option go_package =  "./greet";

import "base/common.proto";

message Request {
  base.In in = 1;// 支持import
}

message Response {
 base.Out out = 2;// 支持import
}

service Greet {
  rpc Ping(Request) returns(Response);
}


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號