哈嘍大家好,我是咸魚
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,分布式架構(gòu)越來(lái)越被人們所采用。在分布式架構(gòu)下,為了實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯,應(yīng)用程序需要分布式通信實(shí)現(xiàn)遠(yuǎn)程調(diào)用
而這時(shí)候就需要一種協(xié)議來(lái)支持遠(yuǎn)程過(guò)程調(diào)用,以便實(shí)現(xiàn)不同應(yīng)用程序之間的數(shù)據(jù)交換和信息傳遞。其中常用的協(xié)議包括 HTTP 協(xié)議和 RPC 協(xié)議
HTTP 協(xié)議和 RPC 協(xié)議都是用于計(jì)算機(jī)之間進(jìn)行通信的協(xié)議。那么小伙伴們有沒有想過(guò)它們之間有什么區(qū)別呢?有了HTTP為什么還要RPC呢?
為了解答上面的疑問,我們先從這兩個(gè)協(xié)議的介紹開始
HTTP 和 RPC
- HTTP
學(xué)過(guò)計(jì)算機(jī)網(wǎng)絡(luò)的小伙伴們相信對(duì)下面這段話再熟悉不過(guò)了:
HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)協(xié)議,主要用于在 Web 瀏覽器和 Web 服務(wù)器(B/S架構(gòu))之間傳輸超文本標(biāo)記語(yǔ)言(HTML)文件,支持客戶端和服務(wù)器之間的通信
HTTP 協(xié)議是網(wǎng)絡(luò)傳輸協(xié)議中應(yīng)用最為廣泛的一種,HTTP 協(xié)議基于請(qǐng)求/響應(yīng)模型,通過(guò)在客戶端和服務(wù)器之間交換請(qǐng)求和響應(yīng)來(lái)傳輸數(shù)據(jù)。
它簡(jiǎn)單、靈活、可擴(kuò)展,而且最重要的是——它是一種無(wú)狀態(tài)協(xié)議,也就是說(shuō),每次客戶端和服務(wù)器之間交換請(qǐng)求和響應(yīng)時(shí),HTTP協(xié)議都是一張白紙,不會(huì)記住之前的任何信息
而無(wú)狀態(tài)協(xié)議重要的一點(diǎn)優(yōu)勢(shì)是可靠,即使某個(gè)請(qǐng)求失敗或者丟失,也不會(huì)影響到其他請(qǐng)求的處理
HTTP 協(xié)議使用文本格式進(jìn)行傳輸,方便開發(fā)人員去閱讀和調(diào)試,又因具有可跨平臺(tái)、可擴(kuò)展、可緩存、可重用等優(yōu)點(diǎn)被廣泛應(yīng)用于 Web 開發(fā)中,常用于網(wǎng)頁(yè)訪問、圖片加載等場(chǎng)景
看到這里,小伙伴可能會(huì)想,HTTP 這么神,它真的就一點(diǎn)缺點(diǎn)沒有嗎?當(dāng)然肯定是有的
前面我們說(shuō)到 HTTP 協(xié)議是無(wú)狀態(tài)的,也就是說(shuō)每次請(qǐng)求和響應(yīng)之間是沒有關(guān)聯(lián)的,服務(wù)器不會(huì)記住之前的任何信息,所以會(huì)導(dǎo)致每次請(qǐng)求都要重新建立連接
在處理一些長(zhǎng)連接或高并發(fā)的場(chǎng)景時(shí),每次請(qǐng)求都需要重新建立連接,而這個(gè)過(guò)程不但會(huì)增加了網(wǎng)絡(luò)開銷和延遲,還會(huì)消耗服務(wù)器的資源,從而降低了效率。如果使用有狀態(tài)的協(xié)議,服務(wù)器可以記住之前的信息,避免了重復(fù)建立連接的過(guò)程
除此之外,因?yàn)?HTTP 協(xié)議最初設(shè)計(jì)的目的是為了在客戶端和服務(wù)器之間傳輸 HTML 文檔,即數(shù)據(jù)傳輸格式是基于文本的
所以說(shuō) HTTP 協(xié)議不支持類型化的數(shù)據(jù)傳輸和自定義協(xié)議擴(kuò)展,請(qǐng)求和響應(yīng)的格式是固定的,這就導(dǎo)致了它不能很好地支持自定義數(shù)據(jù)結(jié)構(gòu)和復(fù)雜邏輯
簡(jiǎn)單來(lái)說(shuō),HTTP 協(xié)議有點(diǎn)“死板”
- RPC
RPC(Remote Procedure Call,遠(yuǎn)程過(guò)程調(diào)用)協(xié)議是一種進(jìn)程間通信協(xié)議,用于實(shí)現(xiàn)分布式應(yīng)用程序之間的遠(yuǎn)程調(diào)用,使得不同的應(yīng)用程序可以像調(diào)用本地程序一樣調(diào)用遠(yuǎn)程程序
RPC 協(xié)議基于函數(shù)調(diào)用模型。在 RPC 協(xié)議中,客戶端調(diào)用遠(yuǎn)程服務(wù)器上的函數(shù)時(shí),會(huì)將參數(shù)打包成消息并發(fā)送給服務(wù)器,服務(wù)器接收到消息后,解包參數(shù)并執(zhí)行相應(yīng)的函數(shù),最后將結(jié)果打包成消息并發(fā)送回客戶端、
這這個(gè)過(guò)程對(duì)于客戶端來(lái)說(shuō)是透明的,就像調(diào)用本地函數(shù)一樣,即 RPC 可以實(shí)現(xiàn)在不同的進(jìn)程或不同的機(jī)器之間進(jìn)行函數(shù)調(diào)用
它具有網(wǎng)絡(luò)傳輸速度快、協(xié)議擴(kuò)展性好等優(yōu)點(diǎn)(因?yàn)椴捎昧硕M(jìn)制數(shù)據(jù)傳輸格式,相對(duì)于HTTP等基于文本的協(xié)議,二進(jìn)制格式傳輸數(shù)據(jù)更加高效)。不但如此,RPC 的設(shè)計(jì)初衷就是支持多種數(shù)據(jù)格式和傳輸協(xié)議,這使得它可以很好地支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和邏輯
此外,RPC 協(xié)議可以使用更高效的編碼和傳輸協(xié)議,還可以使用異步調(diào)用來(lái)提高響應(yīng)速度
我們常說(shuō),世上沒有完美的東西,HTTP 如此,RPC 也是如此
與 HTTP 相比,RPC 更加復(fù)雜。為了實(shí)現(xiàn) RPC 協(xié)議的設(shè)計(jì)目標(biāo)(高效、靈活和可擴(kuò)展),它需要定義更多的接口和協(xié)議,同時(shí)需要更多的配置和管理。當(dāng)然這會(huì)提高開發(fā)和運(yùn)維的難度
為了支持跨語(yǔ)言、跨平臺(tái)的遠(yuǎn)程調(diào)用,RPC 通常不包含安全機(jī)制。如果不采取額外的安全措施,就有可能存在身份偽造、數(shù)據(jù)篡改、拒絕服務(wù)等安全問題
為了保護(hù)網(wǎng)絡(luò)安全,我們可以在 RPC 中實(shí)現(xiàn)額外的安全措施:
- 例如使用SSL/TLS協(xié)議進(jìn)行加密通信
- 使用數(shù)字證書進(jìn)行身份驗(yàn)證
- 使用訪問控制列表進(jìn)行授權(quán)
- 進(jìn)行安全審計(jì)和漏洞掃描
前面我們說(shuō)到,RPC 通常采用二進(jìn)制數(shù)據(jù)傳輸格式,而不是基于文本的格式。二進(jìn)制格式雖然傳輸效率高,但是需要額外的計(jì)算資源來(lái)序列化和反序列化參數(shù)和返回值
在 RPC 中,客戶端和服務(wù)器之間需要將參數(shù)和返回值打包成二進(jìn)制數(shù)據(jù),并在網(wǎng)絡(luò)上傳輸。這個(gè)過(guò)程需要將參數(shù)和返回值轉(zhuǎn)換為二進(jìn)制格式,并進(jìn)行壓縮和編碼,以減少數(shù)據(jù)傳輸量
對(duì)于接收方,需要將接收到的二進(jìn)制數(shù)據(jù)解碼并轉(zhuǎn)換為原始數(shù)據(jù)格式。這個(gè)過(guò)程需要消耗額外的計(jì)算資源
因此,RPC需要額外的網(wǎng)絡(luò)帶寬和計(jì)算資源來(lái)序列化和反序列化參數(shù)和返回值
HTTP 和 RPC 的區(qū)別
- 目的不同
HTTP 是一種無(wú)狀態(tài)的協(xié)議,它的主要目的在客戶端和服務(wù)器之間交換請(qǐng)求和響應(yīng)來(lái)傳輸文本內(nèi)容
RPC 是一種有狀態(tài)的協(xié)議,它的主要目的是在客戶端和服務(wù)器之間傳遞信息并調(diào)用遠(yuǎn)程函數(shù)
- 傳輸方式不同
HTTP 使用文本(如 HTML、XML、JSON等)作為載體,并且使用明文傳輸
RPC可以使用多種格式傳輸(例如二進(jìn)制格式),并且可以使用額外的安全加密技術(shù)保證傳輸安全性
- 通信方式不同
HTTP 使用的是請(qǐng)求/響應(yīng)模型,客戶端向服務(wù)器發(fā)送請(qǐng)求并等待響應(yīng)。客戶端發(fā)送一個(gè)請(qǐng)求,服務(wù)器返回一個(gè)響應(yīng)
RPC 使用的是調(diào)用/返回模型,客戶端調(diào)用服務(wù)器上的遠(yuǎn)程函數(shù)并等待返回結(jié)果。RPC 支持多種不同的調(diào)用方式,如同步調(diào)用、異步調(diào)用、流式調(diào)用等
有了 HTTP 為什么還要 RPC?
雖然 HTTP 已經(jīng)成為了網(wǎng)絡(luò)通信的重要標(biāo)準(zhǔn)之一而且被廣泛應(yīng)用于互聯(lián)網(wǎng)上的各種場(chǎng)景,但是在某些情況下,它并不能滿足用戶的需求
例如在一些復(fù)雜的分布式應(yīng)用場(chǎng)景下(分布式系統(tǒng)中的服務(wù)調(diào)用、微服務(wù)架構(gòu)中的服務(wù)間通信等),RPC 協(xié)議要比 HTTP 協(xié)議更適合
咸魚將從以下幾點(diǎn)來(lái)闡述一下 RPC 為什么更適合復(fù)雜的分布式應(yīng)用場(chǎng)景
從時(shí)效性度來(lái)看
- HTTP 協(xié)議的數(shù)據(jù)格式有一定的局限性,比如只能傳輸文本,傳輸效率低下
- HTTP協(xié)議是基于請(qǐng)求/響應(yīng)模型,每次請(qǐng)求都需要建立一個(gè)新的連接,這樣會(huì)增加網(wǎng)絡(luò)開銷
- 相比于 HTTP 協(xié)議,RPC 協(xié)議通常使用二進(jìn)制數(shù)據(jù)格式進(jìn)行傳輸,通常具有更高的傳輸效率和更低的網(wǎng)絡(luò)延遲
- 相比于 HTTP 協(xié)議,RRPC協(xié)議還支持異步調(diào)用和批量調(diào)用等高級(jí)特性,可以提高系統(tǒng)的性能和吞吐量
從安全性來(lái)看文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-450567.html
- HTTP 是一種文本協(xié)議,數(shù)據(jù)傳輸使用的是明文,這樣就容易被中間人竊聽或者篡改數(shù)據(jù)(不過(guò)可以使用SSL/TLS 協(xié)議對(duì)數(shù)據(jù)進(jìn)行加密和認(rèn)證)
- 相比于 HTTP 協(xié)議,RPC 支持傳輸各種類型的數(shù)據(jù)(比如二進(jìn)制),可以更快靈活地傳輸大量數(shù)據(jù),并且也可以加密傳輸以保證安全性
從場(chǎng)景復(fù)雜度來(lái)看文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-450567.html
- 在復(fù)雜的業(yè)務(wù)邏輯和數(shù)據(jù)結(jié)構(gòu)場(chǎng)景下,通常需要進(jìn)行多次請(qǐng)求和響應(yīng)操作,而 HTTP 作為無(wú)狀態(tài)協(xié)議無(wú)法保持會(huì)話狀態(tài),每次請(qǐng)求和響應(yīng)都需要重新建立連接和傳輸數(shù)據(jù),這會(huì)導(dǎo)致網(wǎng)絡(luò)延遲和性能下降
- HTTP協(xié)議的請(qǐng)求和響應(yīng)通常是基于文本或二進(jìn)制數(shù)據(jù)格式,無(wú)法直接支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如對(duì)象、數(shù)組、枚舉等
- 相比于 HTTP 協(xié)議,RPC 是一種有狀態(tài)協(xié)議,而且 RPC 可以通過(guò)定義接口和方法來(lái)封裝業(yè)務(wù)邏輯,使得客戶端可以通過(guò)簡(jiǎn)單的調(diào)用來(lái)完成復(fù)雜的操作
- 相比于 HTTP 協(xié)議,RPC協(xié)議是一種面向?qū)ο蟮膮f(xié)議,它可以直接支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如對(duì)象、數(shù)組、枚舉等
到了這里,關(guān)于為什么有了 HTTP 還要 RPC的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!