>[info] 原文地址:http://www.grpc.io/docs/guides/
本文向你介紹gRPC和protocol buffers。gRPC可以使用protocol buffers作為它的IDL(Interface Description Language),同時也可以將它作為底層消息交換格式。如果你剛開始接觸gRPC以及protocol buffers,正好可以閱讀此文。
**Overview**
在gRPC中,一個客戶端程序可以直接調用一個服務端程序中的方法,這個服務端程序可以是在另外一臺機器上,調用起來就像它是一個本地對象,這就方便你創造分布式的應用和服務。正如需要RPC系統那樣,gRPC的思想基礎也是:定義一個服務,然后指定方法可以通過參數和返回類型,來遠程調用它們。在服務端,程序實現這個接口,并且運行一個gRPC服務器來處理客戶端調用。在客戶端,有一個存根(stub,即為用任何語言寫的客戶端程序),它提供了和服務端相同的方法。

gRPC客戶端和服務器可以相互通信,并能夠在多變的環境里正常運行,從Google的服務器到你自己的桌面端,并且可以使用任何gRPC支持的語言編寫。所以,比如,你可以很容易的用Java實現一個gRPC服務端,然后用Go,Python或Ruby實現一個客戶端。此外,最新的Google APIs將會有他們接口的gRPC版本,讓你在應用中,方便的使用Google的功能。
**使用Protocol Buffers**
gRPC默認使用[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview),它是Google的一個成熟開源框架,用來序列化結構化的數據(盡管它也可以使用其它的數據格式,比如JSON)。這里簡要介紹它是如何工作的。如果你已經很熟悉protocol buffers,可以跳過該部分
使用protocol buffers的第一步是,在一個*proto*文件中定義你想序列化的數據的結構:它是一個普通的文本文件,以`.proto`擴展名結尾。protocol buffer的數據被結構化為消息,每一個`message`都是一個小的邏輯記錄,包含了一系列的被稱為`fields`的name-value對信息。下面是一個簡單樣例:
~~~
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
~~~
然后,當你指定完了你的數據結構,就可以使用protocol buffer編譯器`protoc`,依照之前的定義來生成數據訪問類,可以使用你喜好的任何語言。這些會為每一個field提供簡單的訪問器(例如`name()`和`set_name()`),也提供了將整個結構序列化為原生字節的方法,以及從原生字節轉換為結構化數據的方法。--所以,比如,如果你選擇使用C++語言,對以上例子執行編譯,將會生成一個叫做`Person`的類。然后你就可以使用這個類來填充,序列化,和接收Person的 protocol buffer消息。
接下來你會看到更多的細節,在普通的proto文件中,使用RPC方法的參數和返回類型定義gRPC服務,其中返回類型就是protocol buffer中已定義的各種messages:
~~~
// The greeter 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;
}
~~~
gRPC還使用`protoc`和一個特殊的gRPC插件,從proto文件中生成代碼。并且,通過gRPC插件,你可以得到生成的gRPC客戶端和服務端代碼,就像上面那樣用來填充,序列化,和接收消息類型的規則protocol buffer代碼一樣。我們將會在后面看到更多細節。
你可以在[Protocol Buffers documentation](https://developers.google.com/protocol-buffers/docs/overview)中找到更多細節,而且在你選擇的語言的Quickstart中,查到如何獲取,和安裝帶有gRPC插件的`protoc`。
**Protocol buffer 版本**
因為protocol buffers作為開源項目已有一段時間,我們的案例使用了一個新的版本,叫做proto3,它有著輕量簡化的語法,一些有用的新特性,并支持很多語言,目前在Java, C++, Python, Objective-C, C#, a lite-runtime(Android Java), Ruby, 和JavaScript中都可用,這里是[下載地址](https://github.com/google/protobuf/releases), 而Go語言的生成器在[這里](https://github.com/golang/protobuf),同樣包含了每個語言的手冊文檔,并且在發布說明中,能看到和目前默認版本的主要區別。更多proto3的文檔即將發布。
一般來說,雖然你可以使用proto2(當前默認的protocol buffers版本),但我們推薦你使用proto3協同gRPC,它可以允許你使用gRPC支持的所有語言,并且避過了proto2客戶端和proto3服務端或者相反帶來的兼容性問題。