介紹 gRPC 和 protocol buffers。
gRPC 可以使用 protocol buffers 作為其接口定義語言(Interface Definition Language)(IDL)和底層消息交換格式惹资。
Overview
使用 gRPC,一個(gè)客戶端應(yīng)用程序能夠 直接調(diào)用 另一臺機(jī)器上的 服務(wù)應(yīng)用程序的方法竿痰,就好像它是本地對象一樣。這使更容易創(chuàng)建分布式應(yīng)用程序和服務(wù)砌溺。
與許多RPC系統(tǒng)一樣影涉,gRPC基于定義服務(wù)
的思想,指定可以被遠(yuǎn)程調(diào)用的方法规伐,方法的參數(shù)蟹倾、返回類型。
在服務(wù)端猖闪,服務(wù)端實(shí)現(xiàn)這個(gè)接口鲜棠,運(yùn)行一個(gè)gRPC服務(wù)去處理客戶端調(diào)用。
在客戶端培慌,客戶端有一個(gè)存根豁陆,它提供與服務(wù)器相同的方法。
gRPC客戶機(jī)和服務(wù)器可以在各種環(huán)境中運(yùn)行并相互通信吵护。
例如盒音,你可以使用java創(chuàng)建一個(gè) gRPC 服務(wù),使用 Go馅而, Python 或者 Ruby 創(chuàng)建客戶端祥诽。
除此之外,最新的 Google APIs 將會有 gRPC 版本的接口瓮恭,你可以輕松的將 Google 的功能構(gòu)建到你的應(yīng)用程序中雄坪。
Working with Protocol Buffers
默認(rèn)情況下,gRPC使用 Protocol Buffers屯蹦,Googel 成熟的 結(jié)構(gòu)化數(shù)據(jù) 序列化的開源機(jī)制(雖然也可是使用其它數(shù)據(jù)格式诸衔,像 JSON)盯漂。
-
第一步,在 proto 文件(一個(gè)普通的文本文件笨农,使用 .proto 擴(kuò)展名)中定義 你想要序列化的數(shù)據(jù)結(jié)構(gòu)。
protocol buffer 數(shù)據(jù)被構(gòu)造為 message帖渠,其中每條 message 都是包含一系列鍵值對(稱為字段)的信息的小的邏輯記錄谒亦,例如:message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; }
一旦你定義好你的數(shù)據(jù)結(jié)構(gòu),就使用 protocol buffer 的編譯器 protoc空郊,根據(jù)你的proto定義生成你首選語言對應(yīng)的數(shù)據(jù)訪問類份招。它們?yōu)槊總€(gè)字段提供簡單的訪問器,像 name() 狞甚、set_name()锁摔,以及將整個(gè)結(jié)構(gòu) 序列化/反序列化為原始字節(jié)的方法。
例如哼审,你選擇的語言是 C++谐腰,在第一步的示例上運(yùn)行編譯器,將會生成一個(gè)叫做 Person 的類涩盾,你可以在應(yīng)用程序中使用這個(gè)類十气,用于填充、序列化春霍、檢索 Person 協(xié)議緩沖區(qū)消息砸西。-
在普通的 proto 文件中定義 gRPC 服務(wù),并將 RPC 方法參數(shù)址儒、返回類型 定義為 protocol buffer messages:
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
gRPC使用 protoc 和一個(gè)特殊的gRPC插件從 .proto文件 生成代碼:生成 gRPC客戶端 和 服務(wù)器 代碼芹枷,以及用于填充、序列化和檢索消息類型的常規(guī)協(xié)議緩沖區(qū)代碼莲趣。