gRPC核心概念、架構(gòu)和生命周期

下面介紹gRPC的核心概念,并概述gRPC架構(gòu)和RPC生命周期。

綜述

服務(wù)的定義

與許多RPC系統(tǒng)一樣,gRPC基于定義服務(wù)、指定可以通過其參數(shù)和返回類型遠(yuǎn)程調(diào)用的方法的思想。默認(rèn)情況下,gRPC使用protocol buffers作為接口定義語(yǔ)言(IDL)來描述服務(wù)接口和有效負(fù)載消息的結(jié)構(gòu)。如果需要,也可以使用其他替代方案。

service HelloService {
????rpc SayHello(HelloRequest) returns (HelloResponse);
}
message HelloRequest {
????string greeting = 1;
}
message HelloResponse {
????string reply = 1;
}

gRPC允許你定義四種服務(wù)方法:

? ? - 一元rpc,客戶端向服務(wù)器發(fā)送單個(gè)請(qǐng)求并得到單個(gè)響應(yīng),就像普通的函數(shù)調(diào)用一樣。

? ??rpc SayHello(HelloRequest) returns (HelloResponse);

? ? - 服務(wù)器流的rpc,客戶端向服務(wù)器發(fā)送請(qǐng)求并獲取一個(gè)流來讀取返回的消息序列??蛻舳藦姆祷氐牧髦凶x取消息,直到?jīng)]有更多的消息為止。gRPC保證單個(gè)RPC調(diào)用中的消息順序。

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

? ? - 客戶端流rpc,客戶端寫入一系列消息并將它們發(fā)送到服務(wù)器,同樣使用提供的流。一旦客戶機(jī)完成了消息的編寫,它就等待服務(wù)器讀取消息并返回響應(yīng)。同樣,gRPC保證了單獨(dú)RPC調(diào)用中的消息順序。

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);

? ? - 雙向流rpc,其中雙方使用讀寫流發(fā)送消息序列。兩個(gè)流獨(dú)立運(yùn)作,因此客戶端和服務(wù)器可以讀和寫在他們喜歡的任何順序:例如,服務(wù)器可以等待收到所有客戶端消息之前寫的反應(yīng),也可以交替閱讀一條消息然后寫一個(gè)消息,或其他一些讀寫的結(jié)合。每個(gè)流中的消息順序被保留。

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

使用API

從.proto文件中的服務(wù)定義開始,gRPC提供了protocol buffers編譯器插件,用于生成客戶端和服務(wù)器端代碼。gRPC用戶通常在客戶端調(diào)用這些API,并在服務(wù)器端實(shí)現(xiàn)相應(yīng)的API。

? ? -?在服務(wù)器端,服務(wù)器實(shí)現(xiàn)服務(wù)聲明的方法,并運(yùn)行g(shù)RPC服務(wù)器來處理客戶端調(diào)用。gRPC基礎(chǔ)架構(gòu)對(duì)傳入請(qǐng)求進(jìn)行解碼,執(zhí)行服務(wù)方法,并對(duì)服務(wù)響應(yīng)進(jìn)行編碼。

? ? -?在客戶端,客戶端有一個(gè)稱為存根(對(duì)于某些語(yǔ)言,首選術(shù)語(yǔ)是客戶端)的本地對(duì)象,它實(shí)現(xiàn)了與服務(wù)相同的方法。然后客戶端可以調(diào)用本地對(duì)象上的這些方法,將調(diào)用的參數(shù)包裝在適當(dāng)?shù)膒rotocol buffers消息類型中——gRPC在向服務(wù)器發(fā)送請(qǐng)求并返回服務(wù)器的protocol buffers響應(yīng)后進(jìn)行查找。

同步與異步

阻塞直到服務(wù)器響應(yīng)到達(dá)的同步RPC調(diào)用是最接近RPC所期望的過程調(diào)用抽象的方法。另一方面,網(wǎng)絡(luò)本身是異步的,在許多場(chǎng)景中,能夠在不阻塞當(dāng)前線程的情況下啟動(dòng)rpc是很有用的。

大多數(shù)語(yǔ)言中的gRPC編程API都有同步和異步兩種風(fēng)格。你可以在每種語(yǔ)言的教程和參考文檔中找到更多信息(完整的參考文檔即將發(fā)布)。

RPC的生命周期

在本節(jié)中,您將進(jìn)一步了解gRPC客戶端調(diào)用gRPC服務(wù)器方法時(shí)會(huì)發(fā)生什么。要了解完整的實(shí)現(xiàn)細(xì)節(jié),請(qǐng)參見特定于語(yǔ)言的頁(yè)面。

一元RPC

首先考慮最簡(jiǎn)單的RPC類型,其中客戶端發(fā)送單個(gè)請(qǐng)求并返回單個(gè)響應(yīng)。

? ? 1、一旦客戶機(jī)調(diào)用了存根方法,服務(wù)器就會(huì)收到通知,RPC已經(jīng)調(diào)用客戶端請(qǐng)求的元數(shù)據(jù)、方法名稱和指定的截止日期(如果兼容的話)。

? ? 2、然后,服務(wù)器可以直接發(fā)送自己的初始元數(shù)據(jù)(必須在任何響應(yīng)之前發(fā)送),或者等待客戶機(jī)的請(qǐng)求消息。首先發(fā)生的是特定于應(yīng)用程序的。

????3、一旦服務(wù)器獲得了客戶端的請(qǐng)求消息,它將執(zhí)行創(chuàng)建和填充響應(yīng)所需的任何工作。然后將響應(yīng)(如果成功的話)返回給客戶端,同時(shí)返回的還有狀態(tài)詳細(xì)信息(狀態(tài)碼和可選的狀態(tài)消息)和可選的尾部元數(shù)據(jù)。

? ? 4、如果響應(yīng)狀態(tài)為OK,則客戶端獲得響應(yīng),響應(yīng)將在客戶端完成調(diào)用。

服務(wù)器流RPC

服務(wù)器流RPC與一元RPC相似,不同之處是服務(wù)器返回一個(gè)消息流來響應(yīng)客戶端的請(qǐng)求。在發(fā)送所有消息之后,服務(wù)器的狀態(tài)詳細(xì)信息(狀態(tài)代碼和可選的狀態(tài)消息)和可選的跟蹤元數(shù)據(jù)被發(fā)送到客戶端。這就完成了服務(wù)器端的處理。一旦客戶端擁有了所有的服務(wù)器消息,它就完成了。

客戶端流RPC

客戶端流RPC與一元RPC類似,不同之處是客戶機(jī)向服務(wù)器發(fā)送消息流,而不是單個(gè)消息。服務(wù)器用一條消息(連同它的狀態(tài)詳細(xì)信息和可選的尾部元數(shù)據(jù))響應(yīng),通常在它收到所有客戶機(jī)消息之后,但不一定是這樣。

雙向流RPC

在雙向流RPC中,調(diào)用由調(diào)用方法的客戶端和接收客戶端元數(shù)據(jù)、方法名稱和截止日期的服務(wù)器發(fā)起。服務(wù)器可以選擇發(fā)送回其初始元數(shù)據(jù)或等待客戶端開始流式消息。

客戶端和服務(wù)器端流處理是特定于應(yīng)用程序的。由于這兩個(gè)流是獨(dú)立的,客戶端和服務(wù)器可以以任何順序讀寫消息。例如,一個(gè)服務(wù)器可以等到它已經(jīng)收到了客戶的所有信息之前寫它的消息,或者是服務(wù)器和客戶端可以玩“乒乓球”——服務(wù)器收到一個(gè)請(qǐng)求,然后發(fā)回一個(gè)響應(yīng),然后客戶端根據(jù)響應(yīng)發(fā)送另一個(gè)請(qǐng)求,等等。

截止時(shí)間/超時(shí)

gRPC允許客戶端指定他們?cè)敢獾却齊PC完成的時(shí)間,在RPC被一個(gè)DEADLINE_EXCEEDED錯(cuò)誤終止之前。在服務(wù)器端,服務(wù)器可以查詢特定RPC是否超時(shí),或者還有多少時(shí)間來完成RPC。

指定期限或超時(shí)是特定于語(yǔ)言的:一些語(yǔ)言api根據(jù)超時(shí)情況(持續(xù)時(shí)間)工作,而一些語(yǔ)言api根據(jù)截止時(shí)間(一個(gè)固定的時(shí)間點(diǎn))工作,可能有也可能沒有默認(rèn)的截止時(shí)間。

終止RPC

在gRPC中,客戶端和服務(wù)器都對(duì)調(diào)用的成功做出獨(dú)立和本地的判斷,他們的結(jié)論可能不匹配。這意味著,例如,您可以有一個(gè)在服務(wù)器端成功完成的RPC(“我已經(jīng)發(fā)送了所有的響應(yīng)!”),但在客戶端失敗(“響應(yīng)在我的截止日期之后到達(dá)!”)。服務(wù)器也可以在客戶端發(fā)送所有請(qǐng)求之前決定是否完成。

取消一個(gè)RPC

客戶端或服務(wù)器都可以在任何時(shí)候取消RPC。取消操作會(huì)立即終止RPC,這樣就不會(huì)再做其他的工作了。

元數(shù)據(jù)( Metadata )

元數(shù)據(jù)是鍵-值對(duì)列表形式的關(guān)于特定RPC調(diào)用的信息(比如身份驗(yàn)證細(xì)節(jié)),其中鍵是字符串,值通常是字符串,但也可以是二進(jìn)制數(shù)據(jù)。元數(shù)據(jù)對(duì)gRPC本身是不透明的——它讓客戶端提供與服務(wù)器調(diào)用相關(guān)的信息,反之亦然。

對(duì)元數(shù)據(jù)的訪問依賴于語(yǔ)言。

通道(Channel)

gRPC通道在指定的主機(jī)和端口上提供與gRPC服務(wù)器的連接。它在創(chuàng)建客戶端存根時(shí)使用??蛻舳丝梢灾付ㄍǖ绤?shù)來修改gRPC的默認(rèn)行為,比如打開或關(guān)閉消息壓縮。通道有狀態(tài),包括連接和空閑。

gRPC如何處理關(guān)閉通道是與語(yǔ)言相關(guān)的。有些語(yǔ)言還允許查詢通道狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • gRPC是高性能的RPC框架, 有效地用于服務(wù)通信(不管是數(shù)據(jù)中心內(nèi)部還是跨數(shù)據(jù)中心)。 由Google開源,目前...
    有態(tài)度的馬甲閱讀 807評(píng)論 0 1
  • 聲明 本篇文章是在學(xué)習(xí)gRPC框架的過程中翻譯的官方文檔,非作者原創(chuàng),官方文檔參考gRPC,學(xué)習(xí)gRPC過程中,有...
    大哥你先走閱讀 8,443評(píng)論 0 50
  • 前言: 原文鏈接。日常學(xué)習(xí),若有錯(cuò)誤,歡迎指正。 一 概覽 服務(wù)定義 像許多RPC系統(tǒng),gRPC基于一個(gè)基本思想...
    show16閱讀 569評(píng)論 0 0
  • 本文通過gRPC的結(jié)構(gòu)概述和生命周期介紹一些gRPC理念的關(guān)鍵點(diǎn)。 概述 服務(wù)定義 就像很多RPC系統(tǒng)一樣,gRP...
    竹天亮閱讀 2,019評(píng)論 1 3
  • 夜鶯2517閱讀 128,159評(píng)論 1 9

友情鏈接更多精彩內(nèi)容