gRPC遠(yuǎn)程調(diào)用
gRPC是一個(gè)現(xiàn)代的高性能框架,它發(fā)展了古老的遠(yuǎn)程過(guò)程調(diào)用(RPC)協(xié)議。
什么是gRPC?
gRPC是一個(gè)現(xiàn)代的高性能框架,它發(fā)展了古老的遠(yuǎn)程過(guò)程調(diào)用(RPC)協(xié)議。在應(yīng)用程序級(jí)別,gRPC簡(jiǎn)化了客戶端和后端服務(wù)之間的消息傳遞。gRPC源自Google,是開(kāi)源的,并且是云原生產(chǎn)品的 Cloud Native Computing Foundation(CNCF)生態(tài)系統(tǒng)的一部分。CNCF認(rèn)為gRPC是一個(gè)孵化項(xiàng)目。孵化意味著最終用戶在生產(chǎn)應(yīng)用程序中使用了該技術(shù),并且該項(xiàng)目有大量的參與者。
典型的gRPC客戶端應(yīng)用程序?qū)⒐_(kāi)實(shí)現(xiàn)業(yè)務(wù)操作的本地進(jìn)程內(nèi)函數(shù)。在后臺(tái),該本地功能調(diào)用了遠(yuǎn)程計(jì)算機(jī)上的另一個(gè)功能。看起來(lái)像是本地調(diào)用,實(shí)質(zhì)上變成了對(duì)遠(yuǎn)程服務(wù)的透明的進(jìn)程外調(diào)用。RPC管道抽象了計(jì)算機(jī)之間的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)通信,序列化和執(zhí)行。
在云原生應(yīng)用程序中,開(kāi)發(fā)人員經(jīng)??缇幊陶Z(yǔ)言,框架和技術(shù)工作。這種互操作性使消息契約和跨平臺(tái)通信所需的管道復(fù)雜化。gRPC提供了抽象這些問(wèn)題的“統(tǒng)一水平層”。開(kāi)發(fā)人員在其本機(jī)平臺(tái)上的代碼側(cè)重于業(yè)務(wù)功能,而gRPC處理通信管道。
gRPC在包括Java,JavaScript,C#,Go,Swift和NodeJS在內(nèi)的大多數(shù)流行開(kāi)發(fā)堆棧中提供全面的支持。
gRPC的好處
gRPC使用HTTP / 2作為其傳輸協(xié)議。與HTTP 1.1兼容時(shí),HTTP / 2具有許多高級(jí)功能:
-
一種用于數(shù)據(jù)傳輸?shù)亩M(jìn)制框架協(xié)議-與基于文本的HTTP 1.1不同。
-
多路復(fù)用支持通過(guò)同一連接發(fā)送多個(gè)并行請(qǐng)求-HTTP 1.1將處理一次限制為一個(gè)請(qǐng)求/響應(yīng)消息。
-
雙向全雙工通信,用于同時(shí)發(fā)送客戶端請(qǐng)求和服務(wù)器響應(yīng)。
-
內(nèi)置流式傳輸使請(qǐng)求和響應(yīng)能夠異步流式傳輸大數(shù)據(jù)集。
-
標(biāo)頭壓縮可減少網(wǎng)絡(luò)使用量。
gRPC是輕量級(jí)且高性能的。它可以比JSON序列化快8倍,而消息卻要小60-80%。用Microsoft Windows Communication Foundation(WCF)的話來(lái)說(shuō),gRPC的性能超過(guò)了高度優(yōu)化的NetTCP綁定的速度和效率。與支持Microsoft堆棧的NetTCP不同,gRPC是跨平臺(tái)的。
協(xié)議緩沖區(qū)
gRPC包含一種稱為協(xié)議緩沖區(qū)的開(kāi)源技術(shù)。它們提供了一種高效且與平臺(tái)無(wú)關(guān)的序列化格式,用于序列化服務(wù)之間相互發(fā)送的結(jié)構(gòu)化消息。開(kāi)發(fā)人員使用跨平臺(tái)接口定義語(yǔ)言(IDL),為每個(gè)微服務(wù)定義服務(wù)合同。合同以基于文本的.proto文件的形式實(shí)現(xiàn),描述了每種服務(wù)的方法,輸入和輸出。相同的合同文件可用于在不同開(kāi)發(fā)平臺(tái)上構(gòu)建的gRPC客戶端和服務(wù)。
使用protobuf編譯器proto文件,protoc為目標(biāo)平臺(tái)生成客戶端代碼和服務(wù)代碼。該代碼包括以下組件:
客戶端和服務(wù)共享的強(qiáng)類型對(duì)象,代表消息的服務(wù)操作和數(shù)據(jù)元素。
具有遠(yuǎn)程gRPC服務(wù)可以繼承和擴(kuò)展的必需網(wǎng)絡(luò)管道的強(qiáng)類型基類。
客戶端存根,其中包含調(diào)用遠(yuǎn)程gRPC服務(wù)所需的管道。
在運(yùn)行時(shí),每條消息都被序列化為標(biāo)準(zhǔn)的Protobuf表示形式,并在客戶端和遠(yuǎn)程服務(wù)之間交換。與JSON或XML不同,Protobuf消息被序列化為已編譯的二進(jìn)制字節(jié)。
可以從Microsoft體系結(jié)構(gòu)站點(diǎn)上獲得的《用于WCF開(kāi)發(fā)人員的gRPC》一書(shū)深入介紹了gRPC和協(xié)議緩沖區(qū)。
.NET中的gRPC支持
gRPC已集成到.NET Core 3.0 SDK和更高版本中。以下工具支持它:
Visual Studio 2019 16.3版或更高版本,已安裝Web開(kāi)發(fā)工作負(fù)載。
Visual Studio程式碼
dotnet CLI
該SDK包含用于端點(diǎn)路由,內(nèi)置IoC和日志記錄的工具。開(kāi)源Kestrel Web服務(wù)器支持HTTP / 2連接。圖4-20顯示了一個(gè)Visual Studio 2019模板,該模板為gRPC服務(wù)構(gòu)建骨架項(xiàng)目。請(qǐng)注意.NET Core如何完全支持Windows,Linux和macOS。
gRPC使用
在以下情況下支持gRPC:
-
同步后端微服務(wù)到微服務(wù)通信,需要立即響應(yīng)才能繼續(xù)處理。
-
需要支持混合編程平臺(tái)的多語(yǔ)言環(huán)境。
-
在性能至關(guān)重要的地方,低延遲和高吞吐量通信。
-
點(diǎn)對(duì)點(diǎn)實(shí)時(shí)通信-gRPC可以實(shí)時(shí)推送消息而無(wú)需輪詢,并且對(duì)雙向流具有出色的支持。
-
網(wǎng)絡(luò)受限的環(huán)境–二進(jìn)制gRPC消息始終小于等效的基于文本的JSON消息。
在撰寫本文時(shí),gRPC主要與后端服務(wù)一起使用?,F(xiàn)代瀏覽器無(wú)法提供支持前端gRPC客戶端所需的HTTP / 2控制級(jí)別。就是說(shuō),對(duì)帶有.NET的gRPC-Web的支持使從使用JavaScript或Blazor WebAssembly技術(shù)構(gòu)建的基于瀏覽器的應(yīng)用程序進(jìn)行g(shù)RPC通信成為可能。gRPC-Web使ASP.NET Core gRPC應(yīng)用程序能夠支持瀏覽器應(yīng)用程序中的gRPC功能:
-
強(qiáng)類型代碼生成的客戶端
-
緊湊的Protobuf消息
-
服務(wù)器流
gRPC實(shí)施
Microsoft的微服務(wù)參考架構(gòu)eShop on Containers顯示了如何在.NET Core應(yīng)用程序中實(shí)現(xiàn)gRPC服務(wù)。圖4-22給出了后端體系結(jié)構(gòu)。
在上圖中,請(qǐng)注意eShop如何通過(guò)公開(kāi)多個(gè)API網(wǎng)關(guān)來(lái)?yè)肀Ш蠖说那岸四J剑˙FF)。我們?cè)诒菊虑懊嬗懻摿薆FF模式。請(qǐng)密切注意位于Web-Shopping API網(wǎng)關(guān)和后端Shopping微服務(wù)之間的Aggregator微服務(wù)(灰色)。聚合器從客戶端接收單個(gè)請(qǐng)求,將其分配給各種微服務(wù),對(duì)結(jié)果進(jìn)行聚合,然后將其發(fā)送回發(fā)出請(qǐng)求的客戶端。這樣的操作通常需要同步通信以產(chǎn)生即時(shí)響應(yīng)。在eShop中,使用gRPC執(zhí)行來(lái)自聚合器的后端調(diào)用,如圖所示。
gRPC通信需要客戶端和服務(wù)器組件。在上圖中,請(qǐng)注意Shopping Aggregator如何實(shí)現(xiàn)gRPC客戶端??蛻舳藢?duì)后端微服務(wù)進(jìn)行同步gRPC調(diào)用(紅色),每個(gè)后端微服務(wù)都實(shí)現(xiàn)一個(gè)gRPC服務(wù)器??蛻舳撕头?wù)器都可以利用.NET Core SDK內(nèi)置的gRPC管道。客戶端存根提供了調(diào)用遠(yuǎn)程gRPC調(diào)用的管道。服務(wù)器端組件提供了gRPC管道,自定義服務(wù)類可以繼承和使用。
公開(kāi)RESTful API和gRPC通信的微服務(wù)需要多個(gè)端點(diǎn)來(lái)管理流量。您將打開(kāi)一個(gè)端點(diǎn),該端點(diǎn)偵聽(tīng)RESTful調(diào)用的HTTP流量,并偵聽(tīng)gRPC調(diào)用的另一個(gè)流量。必須為gRPC通信所需的HTTP / 2協(xié)議配置gRPC端點(diǎn)。
盡管我們努力使微服務(wù)與異步通信模式脫鉤,但是某些操作需要直接調(diào)用。gRPC應(yīng)該是微服務(wù)之間直接同步通信的主要選擇。它基于HTTP / 2和協(xié)議緩沖區(qū)的高性能通信協(xié)議使其成為理想的選擇。
