Golang – 關於 proto 文件的一點小思考
前言
ProtoBuf
是什麼?
ProtoBuf
是一套接口描述語言(IDL),通俗的講是一種數據表達方式,也可以稱為數據交換格式。
我們常用的數據格式有 JSON
和 XML
,為什麼使用 ProtoBuf
?是因為它的傳輸快,為什麼傳輸快?大家可以找下資料。使用 .proto
文件進行描述要序列化的數據結構,然後將寫好 .proto
文件使用 protoc
就可以很容易編譯成眾多計算機語言的接口代碼。
gRPC
是什麼?
gRPC
是開源的 RPC
框架,已支持主流的計算機語言,可以通過 ProtoBuf
進行定義接口,可以基於 ProtoBuf
進行數據傳輸。
兩者雖然是一家,但是分別解決不同的問題,可以配合使用,也可以分開。
看一下的 gRPC
helloworld 的 proto
文件是如何定義的?
helloworld.proto
syntax = "proto3";
package helloworld;
option go_package = "./;helloworld";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
文件中定義了一個 service
Greeter 和 rpc
SayHello 方法。
入參:string
name
出參:string
message
這些過於簡單,還能不能描述其他信息?
小思考
-
定義的
rpc
方法能否也同時支持HTTP
調用?例如:SayHello 方法,既支持 gRPC 調用,也支持 HTTP 調用,同時支持protoc
生成代碼時,同時也生成Swagger
接口文檔。 -
定義的入參能否支持參數驗證?例如:name 長度不能大於 20 個字符。
-
定義的
service
Greeter 服務能否支持攔截器?例如:該服務下的所有方法需要進行登錄令牌驗證。 -
定義的
rpc
SayHello 方法能夠支持攔截器?例如:當前方法支持開啟和關閉是否記錄日誌。
小結
以上問題還未完全解決,學習 gRPC 感覺有些吃力…
大家有沒有可以推薦的學習資源?目前在看 grpc-gateway 。
推薦閱讀
- Go – 使用 sync.WaitGroup 來實現並發操作
- Go – 使用 sync.Map 解決 map 並發安全問題
- Go – 基於逃逸分析來提升程序性能
- Go – 使用 sync.Pool 來減少 GC 壓力
- Go – 使用 options 設計模式