您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)服務(wù)之間的如何調(diào)用 HTTP代替RPC,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
RPC(Remote Procedure Call)—遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。 |
什么是 RPC?
RPC(Remote Procedure Call)—遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。比如兩個(gè)不同的服務(wù) A、B 部署在兩臺(tái)不同的機(jī)器上,那么服務(wù) A 如果想要調(diào)用服務(wù) B 中的某個(gè)方法該怎么辦呢?使用 HTTP請(qǐng)求 當(dāng)然可以,但是可能會(huì)比較慢而且一些優(yōu)化做的并不好。 RPC 的出現(xiàn)就是為了解決這個(gè)問題。
RPC原理是什么?
服務(wù)之間的調(diào)用為啥不直接用 HTTP 而用 RPC?
服務(wù)消費(fèi)方(client)調(diào)用以本地調(diào)用方式調(diào)用服務(wù);
client stub接收到調(diào)用后負(fù)責(zé)將方法、參數(shù)等組裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw;
client stub找到服務(wù)地址,并將消息發(fā)送到服務(wù)端;
server stub收到消息后進(jìn)行解碼;
server stub根據(jù)解碼結(jié)果調(diào)用本地的服務(wù);
本地服務(wù)執(zhí)行并將結(jié)果返回給server stub;
server stub將返回結(jié)果打包成消息并發(fā)送至消費(fèi)方;
client stub接收到消息,并進(jìn)行解碼;
服務(wù)消費(fèi)方得到最終結(jié)果。
下面再貼一個(gè)網(wǎng)上的時(shí)序圖:
服務(wù)之間的調(diào)用為啥不直接用 HTTP 而用 RPC?
RPC 解決了什么問題?
從上面對(duì) RPC 介紹的內(nèi)容中,概括來講RPC 主要解決了:讓分布式或者微服務(wù)系統(tǒng)中不同服務(wù)之間的調(diào)用像本地調(diào)用一樣簡(jiǎn)單。
常見的 RPC 框架總結(jié)?
RMI(JDK自帶): JDK自帶的RPC,有很多局限性,不推薦使用。
Dubbo: Dubbo是 阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring框架無縫集成。目前 Dubbo 已經(jīng)成為 Spring Cloud Alibaba 中的官方組件。
gRPC :gRPC是可以在任何環(huán)境中運(yùn)行的現(xiàn)代開源高性能RPC框架。它可以通過可插拔的支持來有效地連接數(shù)據(jù)中心內(nèi)和跨數(shù)據(jù)中心的服務(wù),以實(shí)現(xiàn)負(fù)載平衡,跟蹤,運(yùn)行狀況檢查和身份驗(yàn)證。它也適用于分布式計(jì)算的最后一英里,以將設(shè)備,移動(dòng)應(yīng)用程序和瀏覽器連接到后端服務(wù)。
Hessian: Hessian是一個(gè)輕量級(jí)的remotingonhttp工具,使用簡(jiǎn)單的方法提供了RMI的功能。 相比WebService,Hessian更簡(jiǎn)單、快捷。采用的是二進(jìn)制RPC協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
Thrift: Apache Thrift是Facebook開源的跨語言的RPC通信框架,目前已經(jīng)捐獻(xiàn)給Apache基金會(huì)管理,由于其跨語言特性和出色的性能,在很多互聯(lián)網(wǎng)公司得到應(yīng)用,有能力的公司甚至?xí)趖hrift研發(fā)一套分布式服務(wù)框架,增加諸如服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)等功能。
RPC 只是一種設(shè)計(jì)而已
RPC 只是一種概念、一種設(shè)計(jì),就是為了解決 不同服務(wù)之間的調(diào)用問題, 它一般會(huì)包含有 傳輸協(xié)議 和 序列化協(xié)議 這兩個(gè)。
實(shí)現(xiàn) RPC 的可以傳輸協(xié)議可以直接建立在 TCP 之上,也可以建立在 HTTP 協(xié)議之上。大部分 RPC 框架都是使用的 TCP 連接(gRPC使用了HTTP2)。
HTTP 和 TCP
可能現(xiàn)在很多對(duì)計(jì)算機(jī)網(wǎng)絡(luò)不太熟悉的朋友已經(jīng)被搞蒙了,要想真正搞懂,還需要來簡(jiǎn)單復(fù)習(xí)一下計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識(shí):
我們通常談?dòng)?jì)算機(jī)網(wǎng)絡(luò)的五層協(xié)議的體系結(jié)構(gòu)是指:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層。
應(yīng)用層(application-layer)的任務(wù)是通過應(yīng)用進(jìn)程間的交互來完成特定網(wǎng)絡(luò)應(yīng)用。HTTP 屬于應(yīng)用層協(xié)議,它會(huì)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過 URL 向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求。Web服務(wù)器根據(jù)接收到的請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息。HTTP協(xié)議建立在 TCP 協(xié)議之上。
運(yùn)輸層(transport layer)的主要任務(wù)就是負(fù)責(zé)向兩臺(tái)主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)。TCP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸。相比于UDP,TCP 提供的是面向連接的,可靠的數(shù)據(jù)傳輸服務(wù)。
主要關(guān)鍵就在 HTTP 使用的 TCP 協(xié)議,和我們自定義的 TCP 協(xié)議在報(bào)文上的區(qū)別。
http1.1協(xié)議的 TCP 報(bào)文包含太多在傳輸過程中可能無用的信息:
HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires: Thu, 05 Dec 1997 16:00:00 GMT Last-Modified: Wed, 5 August 1996 15:55:28 GMT Server: Apache 0.84 Hello World
使用自定義 TCP 協(xié)議進(jìn)行傳輸就會(huì)避免上面這個(gè)問題,極大地減輕了傳輸數(shù)據(jù)的開銷。 這也就是為什么通常會(huì)采用自定義 TCP 協(xié)議的 RPC 來進(jìn)行進(jìn)行服務(wù)調(diào)用的真正原因。除此之外,成熟的 RPC 框架還提供好了“服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn)”、"智能負(fù)載均衡"、“可視化的服務(wù)治理和運(yùn)維”、“運(yùn)行期流量調(diào)度”等等功能,這些也算是選擇 RPC 進(jìn)行服務(wù)注冊(cè)和發(fā)現(xiàn)的一方面原因吧!
一個(gè)常見的錯(cuò)誤觀點(diǎn)
很多文章中還會(huì)提到說 HTTP 協(xié)議相較于自定義 TCP 報(bào)文協(xié)議,增加的開銷在于連接的建立與斷開,但是這個(gè)觀點(diǎn)已經(jīng)被否認(rèn),下面截取自某乎中一個(gè)回答:
首先要否認(rèn)一點(diǎn) HTTP 協(xié)議相較于自定義 TCP 報(bào)文協(xié)議,增加的開銷在于連接的建立與斷開。HTTP 協(xié)議是支持連接池復(fù)用的,也就是建立一定數(shù)量的連接不斷開,并不會(huì)頻繁的創(chuàng)建和銷毀連接。二一要說的是 HTTP 也可以使用 Protobuf 這種二進(jìn)制編碼協(xié)議對(duì)內(nèi)容進(jìn)行編碼,因此二者最大的區(qū)別還是在傳輸協(xié)議上。
看完上述內(nèi)容,你們對(duì)服務(wù)之間的如何調(diào)用 HTTP代替RPC有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。