什麼是gRPC
宣告
本篇文章是在學習RPC/">gRPC框架的過程中翻譯的官方文件,非作者原創,官方文件參考 ofollow,noindex">gRPC ,學習gRPC過程中,有些概念,思想理解翻譯不到位還請多多指教。
本文主要介紹gRPC和protocol buffers,gRPC使用protocol buffers作為介面定義語言(IDL)和底層資料交換的格式。如果讀者初次接觸gRPC或protocol bufers,請繼續閱讀本文了解更多基本概念,如果你想快速深入並實際使用gRPC,請參考 快速入門指南 。
概述
在gRPC中,客戶端應用可以像呼叫本地物件的方法一樣直接呼叫部署在其他機器上的服務端應用的方法。gRPC降低了構建分散式應用和服務的難度。和其他RPC系統一樣,gRPC的核心也是服務定義,定義可以被遠端呼叫方法的入參和返回值。在服務端,伺服器應用實現方法並啟動一個gRPC伺服器來處理客戶端呼叫。在客戶端,客戶端有一個叫做stub的元件(在很多語言中稱為客戶端),提供和服務端一致的方法。

grpc通訊模型
gRPC客戶端和服務端可以在多種不同的環境下執行並相互通訊,也可以使用gRPC支援的語言實現。例如,使用Java實現服務端,使用Go、Python或Ruby實現客戶端。此外,Google最新的API都有對應的gRPC介面,可以更加容易的在應用構建Google的功能。
使用Protocol Buffers
gRPC預設使用protocl buffers,protoc buffers 是谷歌成熟的開源的用於結構化資料序列化的機制。gRPC也可以使用其他資料格式,比如JSON。下面簡單介紹如何使用protocol buffers,如果讀者對protocol buffers非常熟悉可以跳過該章節。
第一步:使用 .proto檔案(以 .proto為字尾的二進位制文字檔案)定義待序列化資料的結構。Protocol buffer中的資料稱為“message”,每個message都是一個包含一系列稱為“fields”的鍵-值對的小型化邏輯記錄,下面是一個簡單的例子。
message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; }
第二步:使用 protocol buffer 的編譯器protoc從proto定義生成選擇語言的資料接入層類。編譯器生成的類提供簡單的對field訪問方法,例如name()和set_name(),這點和Java Bean中的Set和Get方法類似,也提供序列化和反序列化整個資料結構的方法。例如,加入選擇的語言是C++,編譯上面的例子可以得到一個名為Person的類,在應用中可以直接使用這個類填充,序列化和檢索Person protocol buffer訊息。
正如您將在示例中更詳細地看到的那樣,您可以在普通的proto檔案中定義gRPC服務,並將RPC方法引數和返回型別指定為protocol buffer :
// greeter 服務定義. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // 客戶端請求訊息包含使用者名稱. message HelloRequest { string name = 1; } // 服務端響應包含一條greeting訊息 message HelloReply { string message = 1; }
gRPC使用帶有特殊gRPC外掛的 protoc
來生成proto檔案中的程式碼。 但是,使用gRPC外掛,您可以生成gRPC客戶端和伺服器程式碼,以及用於填充,序列化和檢索訊息型別的常規protocol buffer 程式碼。你可以從 Protocol Buffers文件 中獲取到更多有關protocol buffer的資訊,並能夠獲取到如何獲取安裝和你選定語言相關的 protoc
。
Protocol buffer 版本
雖然protocol buffer 被開源使用者使用已經有一段時間,但我們的示例使用了一種新的protocol buffer,稱為proto3,它具有略微簡化的語法,一些有用的新功能,並支援更多語言。proto3目前已經支援Java,C++,Python,Objective-C,C#,Ruby和JavaScript,也實現了對Go語言的支援。通常,雖然您可以使用proto2(當前預設protocol buffer版本),但我們建議您將proto3與gRPC一起使用,因為它允許您使用全系列gRPC支援的語言,並避免使用proto2客戶端與使用proto3服務端通訊時的相容性問題,反之亦然。