聲明
本篇文章是在學(xué)習(xí)gRPC框架的過程中翻譯的官方文檔,非作者原創(chuàng)而咆,官方文檔參考gRPC霍比,學(xué)習(xí)gRPC過程中,有些概念暴备,思想理解翻譯不到位還請多多指教悠瞬。
本文主要介紹gRPC和protocol buffers,gRPC使用protocol buffers作為接口定義語言(IDL)和底層數(shù)據(jù)交換的格式涯捻。如果讀者初次接觸gRPC或protocol bufers浅妆,請繼續(xù)閱讀本文了解更多基本概念,如果你想快速深入并實際使用gRPC障癌,請參考快速入門指南凌外。
概述
在gRPC中,客戶端應(yīng)用可以像調(diào)用本地對象的方法一樣直接調(diào)用部署在其他機(jī)器上的服務(wù)端應(yīng)用的方法涛浙。gRPC降低了構(gòu)建分布式應(yīng)用和服務(wù)的難度康辑。和其他RPC系統(tǒng)一樣摄欲,gRPC的核心也是服務(wù)定義,定義可以被遠(yuǎn)程調(diào)用方法的入?yún)⒑头祷刂荡薄T诜?wù)端蒿涎,服務(wù)器應(yīng)用實現(xiàn)方法并啟動一個gRPC服務(wù)器來處理客戶端調(diào)用。在客戶端惦辛,客戶端有一個叫做stub的組件(在很多語言中稱為客戶端)劳秋,提供和服務(wù)端一致的方法。
gRPC客戶端和服務(wù)端可以在多種不同的環(huán)境下運(yùn)行并相互通信胖齐,也可以使用gRPC支持的語言實現(xiàn)玻淑。例如,使用Java實現(xiàn)服務(wù)端呀伙,使用Go补履、Python或Ruby實現(xiàn)客戶端。此外剿另,Google最新的API都有對應(yīng)的gRPC接口箫锤,可以更加容易的在應(yīng)用構(gòu)建Google的功能。
使用Protocol Buffers
gRPC默認(rèn)使用protocl buffers雨女,protoc buffers 是谷歌成熟的開源的用于結(jié)構(gòu)化數(shù)據(jù)序列化的機(jī)制谚攒。gRPC也可以使用其他數(shù)據(jù)格式,比如JSON氛堕。下面簡單介紹如何使用protocol buffers馏臭,如果讀者對protocol buffers非常熟悉可以跳過該章節(jié)。
第一步:使用 .proto文件(以.proto為后綴的二進(jìn)制文本文件)定義待序列化數(shù)據(jù)的結(jié)構(gòu)讼稚。Protocol buffer中的數(shù)據(jù)稱為“message”括儒,每個message都是一個包含一系列稱為“fields”的鍵-值對的小型化邏輯記錄,下面是一個簡單的例子锐想。
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
第二步:使用 protocol buffer 的編譯器protoc從proto定義生成選擇語言的數(shù)據(jù)接入層類帮寻。編譯器生成的類提供簡單的對field訪問方法,例如name()和set_name()赠摇,這點和Java Bean中的Set和Get方法類似固逗,也提供序列化和反序列化整個數(shù)據(jù)結(jié)構(gòu)的方法。例如蝉稳,加入選擇的語言是C++抒蚜,編譯上面的例子可以得到一個名為Person的類掘鄙,在應(yīng)用中可以直接使用這個類填充耘戚,序列化和檢索Person protocol buffer消息。
正如您將在示例中更詳細(xì)地看到的那樣操漠,您可以在普通的proto文件中定義gRPC服務(wù)收津,并將RPC方法參數(shù)和返回類型指定為protocol buffer :
// greeter 服務(wù)定義.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 客戶端請求消息包含用戶名.
message HelloRequest {
string name = 1;
}
// 服務(wù)端響應(yīng)包含一條greeting消息
message HelloReply {
string message = 1;
}
gRPC使用帶有特殊gRPC插件的protoc
來生成proto文件中的代碼饿这。 但是,使用gRPC插件撞秋,您可以生成gRPC客戶端和服務(wù)器代碼,以及用于填充,序列化和檢索消息類型的常規(guī)protocol buffer 代碼磷箕。你可以從Protocol Buffers文檔中獲取到更多有關(guān)protocol buffer的信息呻右,并能夠獲取到如何獲取安裝和你選定語言相關(guān)的protoc
。
Protocol buffer 版本
雖然protocol buffer 被開源用戶使用已經(jīng)有一段時間舅列,但我們的示例使用了一種新的protocol buffer肌割,稱為proto3,它具有略微簡化的語法帐要,一些有用的新功能把敞,并支持更多語言。proto3目前已經(jīng)支持Java榨惠,C++奋早,Python,Objective-C赠橙,C#耽装,Ruby和JavaScript,也實現(xiàn)了對Go語言的支持期揪。通常剂邮,雖然您可以使用proto2(當(dāng)前默認(rèn)protocol buffer版本),但我們建議您將proto3與gRPC一起使用横侦,因為它允許您使用全系列g(shù)RPC支持的語言挥萌,并避免使用proto2客戶端與使用proto3服務(wù)端通信時的兼容性問題,反之亦然枉侧。