在 gRPC 裏客戶端應用可以像調用本地對象壹樣直接調用另壹臺不同的機器上服務端 應用的方法,使得您能夠更容易地創建分布式應用和服務。與許多 RPC 系統類似,gRPC 也是基於以下理念:定義壹個服務,指定其能夠被遠程調用的方法(包含參數和返回類型)。在服務端實現這個接口,並運行壹個 gRPC 服務器來處理客戶端調用。在客戶端擁有壹個存根能夠像服務端壹樣的方法。
gRPC 客戶端和服務端可以在多種環境中運行和交互 - 從 google 內部的服務器到妳自己的筆記本,並且可以用任何 gRPC 支持的語言來編寫。所以,妳可以很容易地用 Java 創建壹個 gRPC 服務端,用 Go、Python、Ruby 來創建客戶端。此外,Google 最新 API 將有 gRPC 版本的接口,使妳很容易地將 Google 的功能集成到妳的應用裏。
gRPC 默認使用 protocol buffers,這是 Google 開源的壹套成熟的結構數據序列化機制(當然也可以使用其他數據格式如 JSON)。名叫 proto3 的新風格的 protocol buffers,它擁有輕量簡化的語法、壹些有用的新功能,並且支持更多新語言。當前針對 Java 和 C++ 發布了 beta 版本,針對 JavaNano(即 Android Java)發布 alpha 版本,在protocol buffers Github 源碼庫裏有 Ruby 支持, 在golang/protobuf Github 源碼庫裏還有針對 Go 語言的生成器, 對更多語言的支持正在開發中。
有了 gRPC, 我們可以壹次性的在壹個 .proto 文件中定義服務並使用任何支持它的語言去實現客戶端和服務器,反過來,它們可以在各種環境中,從Google的服務器到妳自己的平板電腦—— gRPC 幫妳解決了不同語言及環境間通信的復雜性.使用 protocol buffers 還能獲得其他好處,包括高效的序列號,簡單的 IDL 以及容易進行接口更新。
現在讓我們來仔細了解壹下當 gRPC 客戶端調用 gRPC 服務端的方法時到底發生了什麽。我們不究其實現細節,關於實現細節的部分,妳可以在我們的特定語言頁面裏找到更為詳盡的內容。
首先我們來了解壹下最簡單的 RPC 形式:客戶端發出單個請求,獲得單個響應。
服務端流式 RPC 除了在得到客戶端請求信息後發送回壹個應答流之外,與我們的簡單例子壹樣。在發送完所有應答後,服務端的狀態詳情(狀態碼和可選的狀態信息)和可選的跟蹤元數據被發送回客戶端,以此來完成服務端的工作。客戶端在接收到所有服務端的應答後也完成了工作。
客戶端流式 RPC 也基本與我們的簡單例子壹樣,區別在於客戶端通過發送壹個請求流給服務端,取代了原先發送的單個請求。服務端通常(但並不必須)會在接收到客戶端所有的請求後發送回壹個應答,其中附帶有它的狀態詳情和可選的跟蹤數據。
雙向流式 RPC ,調用由客戶端調用方法來初始化,而服務端則接收到客戶端的元數據,方法名和截止時間。服務端可以選擇發送回它的初始元數據或等待客戶端發送請求。 下壹步怎樣發展取決於應用,因為客戶端和服務端能在任意順序上讀寫 - 這些流的操作是完全獨立的。例如服務端可以壹直等直到它接收到所有客戶端的消息才寫應答,或者服務端和客戶端可以像"乒乓球"壹樣:服務端後得到壹個請求就回送壹個應答,接著客戶端根據應答來發送另壹個請求,以此類推。
通過運行下面的命令克隆並安裝grpc-go代碼庫:
下載protobuf源碼包
安裝golang-protobuf
第壹步使用 protocol buffers去定義 gRPC service 和方法 request 以及 response 的類型。
要定義壹個服務,必須在.proto 文件中指定 service:
然後在服務中定義 rpc 方法,指定請求的和響應類型,gRPC 允許定義4種類型的 service 方法。
服務.proto文件如下所示: