天天看點

grpc 用戶端的context 服務端擷取不到_Grpc 概要與使用

Grpc 概要與使用

什麼是gRPC?

gRPC是一個支援請求/響應和流式處理(非持久化)用例的傳輸機制。 它是一個模式優先的RPC架構,協定在

Protobuf服務描述符

(protobuf service descriptor)中聲明,請求和響應将通過 HTTP/2 連接配接流式的傳輸。 如下圖:

grpc 用戶端的context 服務端擷取不到_Grpc 概要與使用

從上圖和文檔中我們可以了解到,用gRPC來進行遠端服務調用就僅僅需要gRPC Stub(Client)用Proto Request向遠方的gRPC Server發起服務調用,然後遠方的gRPC Server通過Proto Response(s)将調用結果傳回給gRPC Stub。

上面這段邏輯的背後,gRPC做了什麼:

grpc 用戶端的context 服務端擷取不到_Grpc 概要與使用

一個gRPC從開始發起請求到傳回總共要經曆過序列化,編解碼,以及網絡傳輸這些内容。這些東西在我們使用gRPC架構做遠端服務調用的時候完全感覺不到。

它有幾個優點

  • 模式優先設計傾向于定義良好且分享的服務接口,而不是脆弱的自組織方案;
  • 基于Protobuf的wire協定是高效的、衆所周知的,并且允許相容的模式演化;
  • 基于 HTTP/2 ,這樣它允許在單個連接配接上複用多個資料流;
  • 流式處理的請求和響應是第一類的;
  • 許多語言都有可用的工具,不同語言編寫的用戶端與服務之間可無縫互操作。
這使得gRPC非常适合

  • 内部服務之間的連接配接
  • 連接配接到公開的gRPC API外部服務(甚至是用其它語言編寫的服務)
  • 給Web或移動裝置前端提供資料

Grpc 四種服務類型

gRPC 允許你定義四類服務方法:

單項 RPC

即用戶端發送一個請求給服務端,從服務端擷取一個應答,就像一次普通的函數調用。

rpc SayHello(HelloRequest) returns (HelloResponse){}
           

使用場景:普通的遠端調用,像http一樣,即請求-響應。實作内容可見以下内容

千尋客:grpc for java-普通RPC 開發執行個體​zhuanlan.zhihu.com

grpc 用戶端的context 服務端擷取不到_Grpc 概要與使用

服務端流式 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

grpc 用戶端的context 服務端擷取不到_Grpc 概要與使用