Golang - 關於 proto 檔案的一點小思考

新亮發表於2021-11-28

前言

ProtoBuf 是什麼?

ProtoBuf 是一套介面描述語言(IDL),通俗的講是一種資料表達方式,也可以稱為資料交換格式。

我們常用的資料格式有 JSONXML,為什麼使用 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

這些過於簡單,還能不能描述其他資訊?

小思考

  1. 定義的 rpc 方法能否也同時支援 HTTP 呼叫?例如:SayHello 方法,既支援 gRPC 呼叫,也支援 HTTP 呼叫,同時支援 protoc 生成程式碼時,同時也生成 Swagger 介面文件。
  2. 定義的入參能否支援引數驗證?例如:name 長度不能大於 20 個字元。
  3. 定義的 service Greeter 服務能否支援攔截器?例如:該服務下的所有方法需要進行登入令牌驗證。
  4. 定義的 rpc SayHello 方法能夠支援攔截器?例如:當前方法支援開啟和關閉是否記錄日誌。

小結

以上問題還未完全解決,學習 gRPC 感覺有些吃力...

大家有沒有可以推薦的學習資源?目前在看 grpc-gateway

推薦閱讀

相關文章