Grpc 概要與使用
什麼是gRPC?
gRPC是一個支援請求/響應和流式處理(非持久化)用例的傳輸機制。 它是一個模式優先的RPC架構,協定在
Protobuf服務描述符(protobuf service descriptor)中聲明,請求和響應将通過 HTTP/2 連接配接流式的傳輸。 如下圖:
從上圖和文檔中我們可以了解到,用gRPC來進行遠端服務調用就僅僅需要gRPC Stub(Client)用Proto Request向遠方的gRPC Server發起服務調用,然後遠方的gRPC Server通過Proto Response(s)将調用結果傳回給gRPC Stub。
上面這段邏輯的背後,gRPC做了什麼:
一個gRPC從開始發起請求到傳回總共要經曆過序列化,編解碼,以及網絡傳輸這些内容。這些東西在我們使用gRPC架構做遠端服務調用的時候完全感覺不到。
它有幾個優點:
- 模式優先設計傾向于定義良好且分享的服務接口,而不是脆弱的自組織方案;
- 基于Protobuf的wire協定是高效的、衆所周知的,并且允許相容的模式演化;
- 基于 HTTP/2 ,這樣它允許在單個連接配接上複用多個資料流;
- 流式處理的請求和響應是第一類的;
- 許多語言都有可用的工具,不同語言編寫的用戶端與服務之間可無縫互操作。
:
- 内部服務之間的連接配接
- 連接配接到公開的gRPC API外部服務(甚至是用其它語言編寫的服務)
- 給Web或移動裝置前端提供資料
Grpc 四種服務類型
gRPC 允許你定義四類服務方法:
單項 RPC
即用戶端發送一個請求給服務端,從服務端擷取一個應答,就像一次普通的函數調用。
rpc SayHello(HelloRequest) returns (HelloResponse){}
使用場景:普通的遠端調用,像http一樣,即請求-響應。實作内容可見以下内容
千尋客:grpc for java-普通RPC 開發執行個體zhuanlan.zhihu.com
服務端流式 RPC
即用戶端發送一個請求給服務端,可擷取一個資料流用來讀取一系列消息。用戶端從傳回的資料流裡一直讀取直到沒有更多消息為止。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){}
使用場景:一次請求,建立連接配接後,服務端多次資料傳回。比如請求某個股票接口,需要源源不斷擷取實時的股票資訊。
用戶端流式 RPC
即用戶端用提供的一個資料流寫入并發送一系列消息給服務端。一旦用戶端完成消息寫入,就等待服務端讀取這些消息并傳回應答。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
使用場景:一次請求,建立連接配接後,用戶端在此連接配接上多次向服務端發送消息,待用戶端發送完畢,服務端再傳回響應。比如以下執行個體: 做一個加法的服務,服務端接收用戶端傳過來的一系列的數字(int型),然後進行所有數字的和、數字數量和平均值的統計,将最終統計結果傳回給調用者。
雙向流式 RPC
即兩邊都可以分别通過一個讀寫資料流來發送一系列消息。這兩個資料流操作是互相獨立的,是以用戶端和服務端能按其希望的任意順序讀寫,例如:服務端可以在寫應答前等待所有的用戶端消息,或者它可以先讀一個消息再寫一個消息,或者是讀寫相結合的其他方式。每個資料流裡消息的順序會被保持。此模式可以媲美Websocket。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){}
使用場景:一次請求,建立連接配接後,用戶端與服務端可向對方發送消息,比如機器人聊天程式,以下是實作一個極其簡易的聊天室。
千尋客:grpc for java 雙向流式通信實踐zhuanlan.zhihu.com