微服務(wù)通信方式,HTTP 和 RPC 的選擇

微服務(wù)架構(gòu)在現(xiàn)代軟件開發(fā)中變得越來越流行,它將一個(gè)單體應(yīng)用程序分割為多個(gè)相對(duì)獨(dú)立的小服務(wù),這些服務(wù)可以獨(dú)立開發(fā)、部署和維護(hù)。為了讓這些分布在不同地方的服務(wù)協(xié)同工作,服務(wù)之間需要通過通信協(xié)議進(jìn)行交互。通常,HTTP 和 RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)是兩個(gè)常見的微服務(wù)通信方式。在選擇這兩者之間時(shí),開發(fā)者需要根據(jù)具體情況,仔細(xì)權(quán)衡各種因素。

HTTP 協(xié)議的內(nèi)部使用場(chǎng)景

HTTP 協(xié)議廣泛用于微服務(wù)間的通信,其主要原因之一是其通用性和易用性。HTTP 是基于請(qǐng)求-響應(yīng)模型的協(xié)議,適用于多數(shù)應(yīng)用場(chǎng)景,尤其是在跨服務(wù)之間傳輸標(biāo)準(zhǔn)化的數(shù)據(jù)時(shí)。HTTP 通信的典型應(yīng)用包括 RESTful API,在微服務(wù)架構(gòu)中,這種方式通常用來實(shí)現(xiàn)服務(wù)的暴露接口,以便其他服務(wù)能夠使用它提供的功能。

比如,假設(shè)有一個(gè)電商系統(tǒng)被分成多個(gè)服務(wù)模塊,包括用戶服務(wù)、訂單服務(wù)和支付服務(wù)。在這個(gè)系統(tǒng)中,用戶服務(wù)可能需要查詢訂單歷史記錄,訂單服務(wù)就提供了一個(gè)標(biāo)準(zhǔn)化的 HTTP 接口,這個(gè)接口可以被用戶服務(wù)、支付服務(wù)甚至前端用戶調(diào)用。HTTP 的最大優(yōu)勢(shì)在于它是無狀態(tài)的,可以通過標(biāo)準(zhǔn)的 GET、POST 等請(qǐng)求方法來實(shí)現(xiàn)各種類型的操作。服務(wù)之間以 JSON 格式傳遞數(shù)據(jù),易于人類理解和調(diào)試。


在實(shí)際開發(fā)中,HTTP 的優(yōu)勢(shì)在于其廣泛兼容性和成熟的工具支持。大部分編程語言都提供了非常便捷的 HTTP 客戶端庫。例如,Python 的 requests 庫或者 JavaScript 的 axios,這些工具使得開發(fā)者可以很容易地發(fā)起 HTTP 請(qǐng)求。這種方式也有助于開發(fā)者在測(cè)試和調(diào)試過程中快速確定問題所在。例如,通過瀏覽器或 Postman 等工具,開發(fā)者可以直接發(fā)起 HTTP 請(qǐng)求,驗(yàn)證服務(wù)的響應(yīng)是否符合預(yù)期。

HTTP 的另一個(gè)好處是它的可讀性和廣泛支持。由于數(shù)據(jù)多以 JSON 等易于理解的格式傳輸,因此在集成第三方服務(wù),或者當(dāng)團(tuán)隊(duì)成員需要快速了解系統(tǒng)的各部分之間如何交互時(shí),HTTP 通信非常有用。在云計(jì)算平臺(tái)中,HTTP 通常也是標(biāo)準(zhǔn)的通信方式,比如使用 Amazon API Gateway 來管理服務(wù)接口。

然而,HTTP 也存在一些缺點(diǎn),例如其通信性能相對(duì)較低。由于 HTTP 通信需要攜帶大量元數(shù)據(jù)(例如請(qǐng)求頭、狀態(tài)碼等),并且采用文本格式傳輸數(shù)據(jù),因此在微服務(wù)數(shù)量眾多的情況下,其性能瓶頸可能會(huì)變得明顯。尤其是在數(shù)據(jù)傳輸量大且需要高吞吐量的場(chǎng)景下,HTTP 并不是最有效的選擇。

RPC 協(xié)議的使用場(chǎng)景

RPC 作為一種遠(yuǎn)程過程調(diào)用協(xié)議,旨在讓調(diào)用遠(yuǎn)程服務(wù)像調(diào)用本地函數(shù)一樣簡單。RPC 的主要目標(biāo)是隱藏網(wǎng)絡(luò)通信的細(xì)節(jié),提供更加直接的調(diào)用方式。RPC 通信在微服務(wù)內(nèi)部通信中的一個(gè)重要優(yōu)勢(shì)是其高效性,這得益于 RPC 采用了更為輕量化的數(shù)據(jù)傳輸格式,常見的 RPC 框架如 gRPC 使用 Protocol Buffers(一種高效的二進(jìn)制序列化格式)來傳輸數(shù)據(jù),極大地提高了數(shù)據(jù)通信的效率。


舉個(gè)例子,在某個(gè)實(shí)時(shí)交易系統(tǒng)中,有一個(gè)訂單管理服務(wù)和庫存管理服務(wù)。訂單管理服務(wù)需要在處理訂單時(shí)檢查庫存,這個(gè)操作需要頻繁調(diào)用庫存服務(wù)。如果使用 HTTP,那么由于其需要處理大量的文本數(shù)據(jù)并包含很多請(qǐng)求頭信息,這些都增加了通信的開銷。而如果采用 RPC,訂單管理服務(wù)可以通過序列化后的二進(jìn)制數(shù)據(jù)與庫存服務(wù)進(jìn)行高效通信,減少帶寬占用,提高整體性能。這種方式尤其適用于延遲敏感的應(yīng)用,例如金融系統(tǒng)中的交易確認(rèn)。

此外,RPC 框架通常還具有良好的接口定義功能,例如 gRPC 提供了基于 .proto 文件的接口定義和自動(dòng)代碼生成,這樣開發(fā)者在定義好服務(wù)接口后,客戶端和服務(wù)端代碼可以自動(dòng)生成,極大地減少了手動(dòng)編寫客戶端請(qǐng)求邏輯的工作量,從而減少人為錯(cuò)誤。

在數(shù)據(jù)中心內(nèi)的微服務(wù)通信中,RPC 通常是更好的選擇,因?yàn)樵谝粋€(gè)低延遲、高帶寬的內(nèi)部網(wǎng)絡(luò)環(huán)境中,RPC 可以更好地發(fā)揮其性能優(yōu)勢(shì)。由于大部分?jǐn)?shù)據(jù)中心內(nèi)部的網(wǎng)絡(luò)延遲非常低,使用 RPC 的方式可以將其延遲控制到最小。這種高效的通信方式可以讓服務(wù)之間以最小的網(wǎng)絡(luò)開銷協(xié)同工作,適合那些需要高吞吐量、低延遲的內(nèi)部服務(wù)調(diào)用場(chǎng)景。

HTTP 和 RPC 的區(qū)別

HTTP 和 RPC 在底層通信機(jī)制、數(shù)據(jù)格式和適用場(chǎng)景上存在顯著差異。

  1. 通信模型:HTTP 通?;谡?qǐng)求-響應(yīng)模型,即每個(gè)請(qǐng)求都會(huì)有一個(gè)明確的響應(yīng)。而 RPC 則模擬函數(shù)調(diào)用,使得服務(wù)之間的通信看起來更像本地方法調(diào)用。RPC 在語義上更接近編程語言中的函數(shù)調(diào)用,可以有參數(shù)傳遞和返回值,這使得 RPC 更符合面向?qū)ο蟮拈_發(fā)風(fēng)格。

  2. 數(shù)據(jù)格式:HTTP 通常使用 JSON 或 XML 作為數(shù)據(jù)傳輸格式,這些格式雖然可讀性強(qiáng),但相對(duì)較為冗余。而 RPC 通常使用二進(jìn)制序列化的方式,例如 gRPC 使用的 Protocol Buffers,這種格式更加緊湊,有助于減少網(wǎng)絡(luò)帶寬的占用和提高序列化速度。

  3. 性能:在性能上,RPC 相較于 HTTP 更加高效,尤其是在數(shù)據(jù)量較大或需要頻繁通信的場(chǎng)景中,RPC 的優(yōu)勢(shì)非常明顯。例如,gRPC 由于采用了 HTTP/2,可以在同一個(gè) TCP 連接上進(jìn)行多路復(fù)用,這意味著它可以并行地處理多個(gè)請(qǐng)求而不需要?jiǎng)?chuàng)建新的連接,這對(duì)減少網(wǎng)絡(luò)開銷有很大幫助。而傳統(tǒng)的 HTTP/1.1 需要為每個(gè)請(qǐng)求建立單獨(dú)的連接,或保持連接,但仍然不如 HTTP/2 的多路復(fù)用高效。

  4. 兼容性和易用性:HTTP 是一種通用協(xié)議,具有廣泛的兼容性,幾乎所有的編程語言和框架都支持 HTTP。而 RPC 雖然更加高效,但其使用需要客戶端和服務(wù)端嚴(yán)格遵循相同的接口定義。對(duì)于第三方集成和跨團(tuán)隊(duì)合作,HTTP 更加靈活和易于理解。

舉例說明:電商平臺(tái)中的應(yīng)用場(chǎng)景

考慮一個(gè)典型的電商平臺(tái),這個(gè)平臺(tái)包括多個(gè)服務(wù)模塊,如用戶管理、商品管理、訂單處理、庫存管理和支付服務(wù)等。我們來看看這些模塊之間如何通信,選擇 HTTP 還是 RPC。

在這個(gè)系統(tǒng)中,用戶管理服務(wù)可能需要提供給外部應(yīng)用訪問的接口,例如前端應(yīng)用程序、移動(dòng)客戶端,甚至是合作伙伴的系統(tǒng)。由于這些外部系統(tǒng)可能是不同的編程語言和技術(shù)棧,為了實(shí)現(xiàn)最大的兼容性,用戶管理服務(wù)通常采用 HTTP 作為通信協(xié)議。這不僅方便開發(fā)人員調(diào)試和測(cè)試,也確保了跨平臺(tái)、跨語言的可訪問性。例如,用戶管理服務(wù)暴露一個(gè) GET /users/{userId} 接口來獲取用戶信息,前端應(yīng)用可以輕松地調(diào)用這個(gè)接口并渲染用戶界面。

另一方面,訂單處理服務(wù)和庫存管理服務(wù)之間的通信需要頻繁、低延遲,并且服務(wù)之間的接口是受控的、不對(duì)外部暴露。在訂單創(chuàng)建時(shí),訂單處理服務(wù)需要立即檢查庫存,這種情況下,使用 RPC 通信可以大大提高效率,因?yàn)?RPC 的二進(jìn)制序列化數(shù)據(jù)傳輸占用的網(wǎng)絡(luò)資源更少,并且調(diào)用更類似于本地函數(shù)調(diào)用,這種方式的低延遲、高性能特點(diǎn)非常適合這種高頻內(nèi)部服務(wù)調(diào)用的場(chǎng)景。

支付服務(wù)通常也是一個(gè)對(duì)外暴露的服務(wù)模塊,涉及到與銀行、支付網(wǎng)關(guān)等第三方系統(tǒng)的交互。這些第三方系統(tǒng)的接口可能也是基于 HTTP 的,因此支付服務(wù)內(nèi)部可能會(huì)使用 RPC 與訂單服務(wù)、用戶服務(wù)通信,但與外部銀行接口交互時(shí)則使用 HTTP。這種組合使用可以達(dá)到內(nèi)部通信的高效性和外部交互的兼容性。

實(shí)際案例:Uber 的通信選擇

Uber 作為一個(gè)大規(guī)模的分布式系統(tǒng),它的微服務(wù)架構(gòu)非常復(fù)雜。早期,Uber 的服務(wù)間通信主要基于 HTTP,因?yàn)樗拈_發(fā)和調(diào)試比較簡單,也符合 Uber 早期快速開發(fā)的需求。然而,隨著系統(tǒng)的不斷擴(kuò)展,服務(wù)數(shù)量激增,HTTP 通信帶來的性能瓶頸和復(fù)雜的請(qǐng)求處理逐漸顯現(xiàn)出來,導(dǎo)致系統(tǒng)的延遲和網(wǎng)絡(luò)開銷變得不可控。

為了解決這些問題,Uber 逐漸將服務(wù)間通信遷移到基于 RPC 的框架下,采用了一種名為 TChannel 的高效傳輸協(xié)議。這種協(xié)議支持多路復(fù)用,能夠有效地減少網(wǎng)絡(luò)通信的開銷,并且在傳輸效率上遠(yuǎn)超傳統(tǒng)的 HTTP。這種遷移大幅度提高了系統(tǒng)的響應(yīng)速度和穩(wěn)定性,尤其是在訂單和司機(jī)匹配的過程中,低延遲的 RPC 通信對(duì)于提高整體用戶體驗(yàn)至關(guān)重要。

通過這個(gè)案例可以看到,HTTP 適用于系統(tǒng)早期開發(fā)和需要對(duì)外部提供標(biāo)準(zhǔn)化接口的場(chǎng)景,而 RPC 則更加適合需要高性能和低延遲的內(nèi)部服務(wù)通信。隨著系統(tǒng)規(guī)模的擴(kuò)展,Uber 逐漸在不同的服務(wù)之間根據(jù)需求選擇不同的通信協(xié)議,以實(shí)現(xiàn)性能和兼容性的最佳平衡。

如何做出選擇

在選擇 HTTP 還是 RPC 作為微服務(wù)間的通信協(xié)議時(shí),需要考慮以下幾點(diǎn):

  • 性能要求:如果服務(wù)之間的通信頻繁,且需要盡可能低的延遲,那么 RPC 更加適合。RPC 的二進(jìn)制數(shù)據(jù)傳輸和多路復(fù)用機(jī)制使其具備更高的傳輸效率。

  • 兼容性:如果需要與外部系統(tǒng)集成,或者服務(wù)需要對(duì)多種不同語言的客戶端提供支持,那么 HTTP 是更好的選擇。它的廣泛使用和標(biāo)準(zhǔn)化使得幾乎所有的編程語言都可以方便地與之交互。

  • 數(shù)據(jù)格式和可讀性:HTTP 通常使用 JSON 進(jìn)行數(shù)據(jù)傳輸,具有較好的可讀性,適合人類調(diào)試和檢查。而 RPC 使用二進(jìn)制數(shù)據(jù),雖然效率高,但不易直接閱讀,這對(duì)于開發(fā)和調(diào)試過程可能會(huì)帶來一些額外的負(fù)擔(dān)。

  • 系統(tǒng)復(fù)雜性:采用 RPC 通信需要額外的學(xué)習(xí)成本,例如需要熟悉 Protocol Buffers 的定義和序列化過程,以及客戶端和服務(wù)端的代碼生成。如果團(tuán)隊(duì)對(duì) RPC 技術(shù)不熟悉,可能會(huì)增加開發(fā)的復(fù)雜性和維護(hù)成本。而 HTTP 則是大多數(shù)開發(fā)人員都熟悉的協(xié)議,開發(fā)和調(diào)試都較為方便。

總結(jié)

HTTP 和 RPC 在微服務(wù)架構(gòu)中的使用場(chǎng)景各有千秋,HTTP 的通用性和易于調(diào)試使其成為微服務(wù)對(duì)外暴露接口的首選,而 RPC 的高效性和類似本地調(diào)用的特性則使其更適合服務(wù)間的內(nèi)部高頻通信。在選擇 HTTP 還是 RPC 時(shí),開發(fā)者需要根據(jù)系統(tǒng)的具體需求,權(quán)衡性能、兼容性、易用性等因素,做出最合適的選擇。以 Uber 為例,早期的 HTTP 通信適合快速迭代和系統(tǒng)擴(kuò)展,而在服務(wù)數(shù)量和通信頻率增加后,遷移到 RPC 則帶來了顯著的性能提升。這些經(jīng)驗(yàn)教訓(xùn)為其他開發(fā)團(tuán)隊(duì)在構(gòu)建和擴(kuò)展微服務(wù)系統(tǒng)時(shí)提供了寶貴的參考。

通過對(duì) HTTP 和 RPC 的深入比較,我們可以看到它們?cè)诓煌瑘?chǎng)景中的優(yōu)缺點(diǎn)。HTTP 提供了一種標(biāo)準(zhǔn)、通用和便于人類理解的通信方式,適合對(duì)外服務(wù)和需要調(diào)試的場(chǎng)景。而 RPC 更像是對(duì)遠(yuǎn)程函數(shù)調(diào)用的一種模擬,提供了類似本地調(diào)用的開發(fā)體驗(yàn),更適合內(nèi)部高效、低延遲的服務(wù)交互。因此,開發(fā)團(tuán)隊(duì)在設(shè)計(jì)系統(tǒng)時(shí)需要結(jié)合具體的業(yè)務(wù)需求,選擇最適合的通信方式,來保證系統(tǒng)的高效、穩(wěn)定和可維護(hù)性。

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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