利用goctl生成rpc服務
- 編寫proto文件
// 聲明 proto 使用的語法版本
syntax = "proto3";// proto 包名
package demoRpc;// golang 包名(可選)
option go_package = "./demo";// 如需為 .proto 文件添加注釋,請使用 C/C++ 樣式的 // 和 /* ... */ 語法。
/* SearchRequest represents a search query, with pagination options to* indicate which results to include in the response. */// 支持import 引入其他.proto文件 但是要求較多,沒有.api文件容易簡易
// 好像是service必須在主文件,引入的proto文件只能包含message定義
import "***.proto";// 枚舉
// 在定義消息類型時,您可能希望它的某個字段僅具有一個預定義的值列表。例如,假設您想要為每個
// SearchRequest 添加一個 corpus 字段,其中正文可以是 UNIVERSAL、WEB、IMAGES、LOCAL、
// NEWS、PRODUCTS 或 VIDEO。為此,您只需在消息定義中添加 enum 并針對每個可能的值添加一個常量。// 在以下示例中,我們添加了一個名為 Corpus 的 enum(包含所有可能的值)和 Corpus 類型的字段:
// 如您所見,Corpus 枚舉的第一個常量映射到零:每個枚舉定義必須包含一個映射到零的第一個常量作為其
// 第一個元素。原因如下:
//
// 1. 必須有一個零值,以便我們可以使用 0 作為數字的默認值。
// 2/ 零值必須是第一個元素,以便與 proto2 語義(其中第一個枚舉值始終是默認值)兼容。enum Corpus {CORPUS_UNSPECIFIED = 0;CORPUS_UNIVERSAL = 1;CORPUS_WEB = 2;CORPUS_IMAGES = 3;CORPUS_LOCAL = 4;CORPUS_NEWS = 5;CORPUS_PRODUCTS = 6;CORPUS_VIDEO = 7;
}// 結構體
// SearchRequest 消息定義指定三個字段(名稱/值對),每個字段對應于要包含在此類消息中的每段數據。每個字段都有一個名稱和類型。
// 類型可以指包括基本類型,切片用 repeated 數據類型 表示,也支持map<數據類型,數據類型>, 以及自定義數據類型
// 字段默認是可選的
message SearchRequest {string query = 1;int32 page_number = 2;int32 result_per_page = 3;Corpus corpus = 4;repeated Result results = 6;map<string, string> projects = 8;
}message Result {string url = 1;string title = 2;repeated string snippets = 3;
}message SearchResponse {map<string, int32> projects = 1;
}// 保留字段編寫示例 不重要 保留————》在這個結構體中這幾個字段不能再被使用
// 如果您通過完全移除或注釋掉某個字段來更新消息類型,則將來的用戶可以自行更新該字段編號以對
// 該類型進行更新。如果用戶日后加載同一 .proto 的舊版本(包括數據損壞、隱私 bug 等),
// 這可能會導致嚴重問題。確保不會發生這種情況的一種方法是,指定已刪除字段的字段編號
// (和/或名稱,也可能導致 JSON 序列化問題)為 reserved。如果任何未來用戶嘗試使用這些字
// 段標識符,協議緩沖區編譯器就會抱怨。
message Foo {reserved 2, 15, 9 to 11;reserved "foo", "bar";
}// 定義服務
// 如果在goctl命令中不設置 -m 則一個文件proto文件中只能有一個 service 多個 service 會報錯
// 但是由于import 不好用,且項目上需要分組, 可以編寫多個 service 這樣切記執行命令時增加 -m
service Demo {// 普通的rpc定義 rpc 方法名稱(請求體)returns (響應體);rpc Search(SearchRequest) returns (SearchResponse);// 客戶端流rpc ClientStream(stream SearchRequest) returns (SearchResponse);// 服務端流rpc ServerStream(SearchRequest) returns (stream SearchResponse);// 雙向流rpc TwoStream(stream SearchRequest) returns (stream SearchResponse);
}
- 執行goctl命令
goctl rpc protoc xxx.proto --go_out=. --go-grpc_out=. --zrpc_out=. (-m 服務分組時)
-
執行結果
其中:
etc:靜態配置文件目錄
demo.go:程序啟動入口文件
internal:單個服務內部文件,其可見范圍僅限當前服務
config:靜態配置文件對應的結構體聲明目錄
logic:業務目錄,所有業務編碼文件都存放在這個目錄下面,logic 為固定后綴
server:類似于API中的handle層,無需修改
svc:依賴注入目錄,所有 logic 層需要用到的依賴都要在這里進行顯式注入
democlient:客戶端調用服務端rpc相關代碼
pb文件:簡單理解為API中的type文件,還包括其他一些代碼,在服務端和客戶端都需要調用 -
接下來你只需要負責logic的具體實現就可以了,當前你也可以對生成的內容進行修改