Golang – 關於 proto 文件的一點小思考

前言

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

推薦閱讀