grpc入門(一)html
一.什麼是grpcjava
grpc是谷歌開源的一款高性能的rpc框架 (https://grpc.io),可使用protocol buffers做爲IDL(Interface Definition Language)文件,也能夠做爲底層的信息傳輸的格式(這也是本博文所介紹的方式)。python
如下內容屬於筆者對 what is grpc? 的翻譯,原文請見: https://grpc.io/docs/guides/index.html。c++
grpc的客戶端應用能夠像訪問本地方法同樣調用其餘機器上的服務端應用的方法,使得咱們能夠很是簡單的建立分佈式應用與服務。和其餘不少rpc框架同樣,gprc也是建立一個服務接口,而後指定調用遠程方法所需的參數和返回類型。在服務端,須要實現服務的接口,而後啓動一個服務器來處理客戶端的調用;在客戶端,須要樁代碼,提供與服務端相同的方法。編程
grpc的客戶端與服務端能夠在不一樣的環境下相互調用,例如: 從谷歌內部的服務到咱們的桌面應用,這些應用可使用gprc所支持的不一樣的語言來實現。所以,你可使用grpc輕鬆的建立一個java的服務端應用,使用go或者python或者ruby語言建立一個客戶端應用。另一方面,谷歌最近的所公佈的一些接口使用了grpc,如此一來,你能夠將谷歌的一些功能集成到你的應用中。json
grpc默認採用了protocol buffers, 這是google已經開源了的而且很是成熟的用於數據結構序列化的框架(也可使用其餘的數據格式例如json)。在這裏快速的介紹他的用法,若是你對protocol buffers已經很是熟悉額了,你能夠跳過這篇文章直接進入到下一個章節。ruby
首先,當使用protocol buffers來序列化數據,須要編寫一個proto文件,文件中定義你想要序列化的結構數據,注意文件名必須以 .proto結尾。protocol buffers的數據是一個結構化的消息,每一個消息都是一小的邏輯信息的記錄,消息中包含了一系列的鍵值對,稱之爲屬性,下面有一個簡單的例子:服務器
message Person { string name = 1; int32 age = 2; bool has_ponycopter = 3; }
接着,當你已經制定了你的數據結構,你就可使用protocol buffers編譯命令protoc來生成你所擅長的語言對應的類。類中提供了簡單的方法來操做每一個屬性(例如name()和set_name()), 另外這些方法內部能夠將數據序列化爲元數據傳輸給對方,也能夠將對方發送過來的元數據進行解析。拿一個具體的例子來講,若是你使用的是c++,編譯如上的例子後會生成一個叫作Person的類,你可使用這個類來構建,序列化,而且獲得 Person對應的protocol buffers消息。數據結構
下面會給出一個更加詳細的例子,你能夠在一個普通的proto文件中定義grpc的服務,rpc的方法的參數和返回類型須要聲明爲一個protocol buffers的消息。框架
// 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命令將你編寫的proto文件生成代碼。然而,使用grpc的插件的時候,你能夠生成grpc的客戶端和服務端代碼,和通常的protocol buffers代碼同樣,能夠構建,序列化,獲取消息。
你能夠從 Protocol Buffers document 文檔中獲取更多關於protocol buffers的說明,也能夠從中學到如何得到和安裝你所擅長的編程語言的 protoc 插件。
二. grpc的四種定義方式
grpc容許用戶定義四種形式的rpc方法(原文參照:https://grpc.io/docs/guides/concepts.html):
A.客戶端發送請求到服務端,而後服務端給出一個響應,就像一個普通的方法定義同樣,以下所示:
rpc SayHello(HelloRequest) returns (HelloResponse) {}
B.服務端的流式rpc:客戶端發送一個請求到服務端,而後獲得一個流用於讀取服務端的的消息,客戶端從返回的流中讀取全部的信息,以下所示:
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {}
C.客戶端流式rpc: 客戶端使用流將信息發送個服務端,只要客戶端發送完全部的信息給服務器,就開始等待服務端的響應,以下所示:
rpc LotsOfGreeting(stream HelloRequest) returns HttpResponse {}
D.雙向流式rpc:服務端與客戶端都是用讀寫流發送數據給對方。這兩個流式相互獨立的,因此他們的讀寫能夠是任意順序的,例如:服務端在接受到客戶的全部的信息以前就已經開始響應,也能夠先讀取數據而後再寫數據,或者其餘任何組合,以下所示:
rpc BidiHello(stream HelloRequest) returns HelloResponse {}