gRPC和Protobuf的筆記(未完待續)
阿新 • • 發佈:2022-03-03
通過gRPC和Protobuf實現簡單分散式應用
技術簡介
gRPC框架
gRPC框架是一個新式的中立的高效能通訊框架。gRPC框架中的客戶端 就像呼叫本地服務一樣呼叫遠端服務。
gRPC的中立性,體現在語言中立、平臺中立、開源上。
gRPC的優點在於:
- 基於HTTP/2實現,具有更高的通訊效益
- 支援多種語言
- 支援使用Protobuf來定義服務並生成框架的目的碼
Protobuf序列化協議
Protobuf是一種資料序列化協議,用於將資料進行序列化和反序列化以支援通訊過程。gRPC使用Protobuf來定義“服務”這一概念。
Protobuf的優點在於:
- 通訊訊息被序列化經過編譯的二進位制位元組,效能好效率高,相比於JSON的序列化快8倍,訊息體積小60%~80%
- 獨立於平臺和語言,可以在
.proto
檔案中使用跨平臺介面定義語言(IDL)來定義服務,然後直接使用Protobuf編譯器生成gRPC框架所需的客戶端和服務端程式碼 - 提供嚴格的呼叫介面約束
- 支援向前和向下相容,新加欄位可以採用預設值(向前相容,通過default關鍵字實現),也可以直接忽略(向後相容,通過optional關鍵字實現)
通訊時,傳遞的訊息是由Protobuf中的關鍵字 message 訊息 這一資料結構進行打包,然後編譯為二進位制的碼流後進行傳輸和儲存。在定義訊息時,每個欄位會對應一個數字,也就是 標識號,其中1~15之間的標識號在編碼時佔用一個位元組,16~2047之間的標識號佔用兩個位元組。
message HelloRequest {
required string title = 1; // 該欄位必須有值,根據型別Protobuf會自動指定預設值
optional string content = 2; // 該欄位可以為空。具體來說Protobuf會使用一個bool變數來標記該欄位是否有值
repeated string author = 3; // 該欄位可以重複。具體來說Protobuf會使用一個count變數來標記該欄位有幾個
}
遠端服務所提供的介面,是通過Protobuf中的關鍵字 service 服務這一結構來描述的。
service HelloService { rpc Hello(HelloRequest) returns(HelloResponse); }
Protobuf通常有proto2和proto3兩種語法規則可選,需要在.proto
檔案開頭使用syntax
關鍵字宣告使用的版本。不同版本的語法略有不同,比如proto3中預設欄位為required,且使用oneof取代repeated,等等。
syntax "proto2";
技術實現
gRPC的使用可以被概括為:
- 通過Protobuf來定義介面和資料型別
- 編譯Protobuf檔案生成目標語言的實際程式碼,其中的物件用於提供通訊功能
- 使用目標語言編寫gRPC客戶端和服務端程式碼,通常需要繼承(2)中生成的程式碼物件
- 分別執行客戶端和服務端,實現通訊
未完待續