揭秘gRPC:釋放閃電般的通信能力
在我們深入討論gRPC的細(xì)節(jié)之前,澄清遠(yuǎn)程通信領(lǐng)域各種術(shù)語之間的關(guān)系非常重要,這有時(shí)可能令人困惑。
RPC — 遠(yuǎn)程過程調(diào)用
根據(jù)維基百科的定義,“在分布式計(jì)算中,遠(yuǎn)程過程調(diào)用(RPC)是指計(jì)算機(jī)程序?qū)е略诓煌刂房臻g中執(zhí)行過程(子程序),通常在共享網(wǎng)絡(luò)上的另一臺(tái)計(jì)算機(jī)上,就好像它是一個(gè)正常的(本地)過程調(diào)用,程序員沒有明確編寫遠(yuǎn)程交互的詳細(xì)信息?!?/p>
簡(jiǎn)而言之,這是一種讓一個(gè)計(jì)算機(jī)程序請(qǐng)求另一個(gè)程序執(zhí)行某項(xiàng)任務(wù)的方式,即使它們位于不同的計(jì)算機(jī)上也可以。這有點(diǎn)像在您的程序中調(diào)用一個(gè)函數(shù),盡管它是在不同的機(jī)器上執(zhí)行的。這是一種過程調(diào)用,就好像它在同一臺(tái)機(jī)器上一樣,但實(shí)際上不在同一臺(tái)機(jī)器上,RPC庫/框架負(fù)責(zé)抽象化所有這些復(fù)雜性。
RPC流程
RPC框架負(fù)責(zé)屏蔽底層的傳輸方法(TCP或UDP)、序列化方法(XML/JSON/二進(jìn)制)和通信細(xì)節(jié)。服務(wù)調(diào)用者可以像調(diào)用本地接口一樣調(diào)用遠(yuǎn)程服務(wù)提供者,而不必關(guān)心底層通信。這涉及到調(diào)用的細(xì)節(jié)和過程。
REST
REST代表表述性狀態(tài)傳輸,是一種用于設(shè)計(jì)網(wǎng)絡(luò)應(yīng)用程序的成熟架構(gòu)風(fēng)格。RESTful API使用HTTP請(qǐng)求執(zhí)行CRUD(創(chuàng)建、讀取、更新、刪除)操作,通常表示為URL。REST API以其簡(jiǎn)單性和使用GET、POST、PUT和DELETE等標(biāo)準(zhǔn)HTTP方法而聞名。
HTTP
HTTP(超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上的數(shù)據(jù)通信基礎(chǔ)。它定義了消息的格式和傳輸方式,以及Web服務(wù)器和瀏覽器如何響應(yīng)各種命令。HTTP隨著時(shí)間的推移發(fā)生了演變,不同版本提供了各種功能和改進(jìn):
- HTTP/1.0:HTTP的第一個(gè)版本非常簡(jiǎn)單,缺少許多現(xiàn)代功能。在HTTP/1.0中,每個(gè)請(qǐng)求都需要一個(gè)新的TCP連接,導(dǎo)致效率低下。
- HTTP/1.1:通過引入保持活動(dòng)連接的機(jī)制,HTTP/1.1改進(jìn)了HTTP/1.0,允許多個(gè)請(qǐng)求和響應(yīng)在單個(gè)TCP連接上發(fā)送,從而減少了延遲。然而,它仍然存在一些限制,比如“頭部阻塞”問題,其中一個(gè)慢速請(qǐng)求可以阻止同一連接中的后續(xù)請(qǐng)求,導(dǎo)致“瀑布”效應(yīng)。
- HTTP/2:HTTP/2引入了二進(jìn)制幀機(jī)制,允許多路復(fù)用、請(qǐng)求優(yōu)先級(jí)和頭部壓縮。這些增強(qiáng)顯著提高了網(wǎng)絡(luò)通信的效率和速度。它通過允許在單個(gè)連接內(nèi)有多個(gè)并發(fā)流來消除“頭部阻塞”問題。
- HTTP/3:最新版本HTTP/3通過使用QUIC傳輸協(xié)議進(jìn)一步提高性能。它側(cè)重于減少延遲,特別是在存在高丟包率或不可靠網(wǎng)絡(luò)的情況下。HTTP/3設(shè)計(jì)得比其前身更具彈性和高效性。
所以現(xiàn)在我們了解了這些術(shù)語。讓我們開始吧!
什么是gRPC?
gRPC(這里的“g”代表什么?)是一種進(jìn)程間通信技術(shù),允許您連接、調(diào)用、操作和調(diào)試分布式異構(gòu)應(yīng)用程序,就像進(jìn)行本地函數(shù)調(diào)用一樣簡(jiǎn)單。
當(dāng)您開發(fā)gRPC應(yīng)用程序時(shí),首先要做的是定義一個(gè)服務(wù)接口。服務(wù)接口定義包含有關(guān)如何消費(fèi)服務(wù)的信息,允許消費(fèi)者調(diào)用哪些遠(yuǎn)程方法,調(diào)用這些方法時(shí)要使用什么方法參數(shù)和消息格式,等等。我們?cè)诜?wù)定義中指定的語言稱為接口定義語言(IDL)。
gRPC使用協(xié)議緩沖區(qū)作為定義服務(wù)接口的IDL。協(xié)議緩沖區(qū)是一種與語言無關(guān)、平臺(tái)中立、可擴(kuò)展的機(jī)制,用于序列化結(jié)構(gòu)化數(shù)據(jù)。
gRPC架構(gòu)
是什么讓gRPC擁有閃電般的性能?以下是內(nèi)部情況:
HTTP/2: 2015年,HTTP/2取代了HTTP/1.1,提供了多路復(fù)用功能,允許多個(gè)請(qǐng)求和響應(yīng)共享單個(gè)連接,提高了效率。
- 請(qǐng)求/響應(yīng)多路復(fù)用: 由于HTTP/2的二進(jìn)制幀,gRPC可以在單個(gè)連接內(nèi)處理多個(gè)請(qǐng)求和響應(yīng),徹底改變了通信效率。
- 頭部壓縮: HTTP/2的HPack策略壓縮頭部,減小了有效負(fù)載大小。再加上gRPC的高效編碼,這使性能非常出色。
Protobuf:秘密武器
gRPC效率游戲中的關(guān)鍵因素之一是協(xié)議緩沖區(qū),簡(jiǎn)稱Protobuf。Protobuf定義數(shù)據(jù)結(jié)構(gòu)和函數(shù)合同??蛻舳撕头?wù)器都需要使用相同的Protobuf語言,這是它們?nèi)绾蜗嗷ダ斫獾姆绞?。協(xié)議緩沖區(qū)(ProtoBuf)在gRPC框架內(nèi)發(fā)揮三個(gè)主要作用:定義數(shù)據(jù)結(jié)構(gòu)、指定服務(wù)接口,并通過序列化和反序列化增強(qiáng)傳輸效率。
gRPC的優(yōu)勢(shì)有哪些
除了有一個(gè)非??蓯鄣募槲锿?。采用gRPC的原因在于其獨(dú)特的優(yōu)勢(shì):
- 進(jìn)程間通信的效率: 與JSON或XML不同,gRPC使用基于協(xié)議緩沖區(qū)的二進(jìn)制協(xié)議進(jìn)行通信,提高了速度。它建立在HTTP/2之上,使其成為最高效的進(jìn)程間通信技術(shù)之一。
- 明確定義的服務(wù)接口和模式: gRPC鼓勵(lì)優(yōu)先進(jìn)行合同定義,優(yōu)先考慮服務(wù)接口定義,而不是深入研究實(shí)現(xiàn)細(xì)節(jié)。這種簡(jiǎn)單性、一致性、可靠性和可擴(kuò)展性定義了應(yīng)用程序開發(fā)體驗(yàn)。
- 強(qiáng)類型和多語言支持: gRPC使用協(xié)議緩沖區(qū)來定義服務(wù),清晰地指定了應(yīng)用程序之間通信的數(shù)據(jù)類型。這有助于提高穩(wěn)定性,并減少運(yùn)行時(shí)和互操作性錯(cuò)誤。此外,gRPC可以與各種編程語言無縫集成,為開發(fā)人員提供了選擇其首選語言的靈活性。
- 雙向流和內(nèi)置功能: gRPC本地支持客戶端和服務(wù)器端的流式處理,簡(jiǎn)化了流式服務(wù)和客戶端的開發(fā)。它還內(nèi)置了對(duì)關(guān)鍵功能的支持,如身份驗(yàn)證、加密、彈性(包括截止日期和超時(shí))、元數(shù)據(jù)交換、壓縮、負(fù)載均衡和服務(wù)發(fā)現(xiàn)。
- 云原生集成和成熟性: 作為Cloud Native Computing Foundation(CNCF)的一部分,gRPC與現(xiàn)代框架和技術(shù)無縫集成,成為通信的首選選擇。CNCF中的項(xiàng)目,如Envoy,支持gRPC,并且許多監(jiān)控工具,包括Prometheus,與gRPC應(yīng)用程序有效地配合使用。此外,gRPC在Google進(jìn)行了廣泛測(cè)試,并被廣泛采用。