1. 程式人生 > 其它 >gRPC和Protobuf的筆記(未完待續)

gRPC和Protobuf的筆記(未完待續)

通過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的使用可以被概括為:

  1. 通過Protobuf來定義介面和資料型別
  2. 編譯Protobuf檔案生成目標語言的實際程式碼,其中的物件用於提供通訊功能
  3. 使用目標語言編寫gRPC客戶端和服務端程式碼,通常需要繼承(2)中生成的程式碼物件
  4. 分別執行客戶端和服務端,實現通訊

未完待續