一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

HTTP協(xié)議用得好好的,為什么還要用RPC協(xié)議?

Q4MP_gh_c472c21 ? 來源:小白debug ? 作者:小白debug ? 2022-11-22 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

想起我剛工作的時候,第一次接觸RPC協(xié)議,當時就很懵,我HTTP協(xié)議用得好好的,為什么還要用RPC協(xié)議?

于是就到網(wǎng)上去搜。

不少解釋顯得非常官方,我相信大家在各種平臺上也都看到過,解釋了又好像沒解釋,都在用一個我們不認識的概念去解釋另外一個我們不認識的概念,懂的人不需要看,不懂的人看了還是不懂。

這種看了,又好像沒看的感覺,云里霧里的很難受,我懂

為了避免大家有強烈的審丑疲勞,今天我們來嘗試重新?lián)Q個方式講一講。

從TCP聊起

作為一個程序員,假設我們需要在A電腦的進程發(fā)一段數(shù)據(jù)到B電腦的進程,我們一般會在代碼里使用socket進行編程。

這時候,我們可選項一般也就TCP和UDP二選一。TCP可靠,UDP不可靠。除非是馬總這種神級程序員(早期QQ大量使用UDP),否則,只要稍微對可靠性有些要求,普通人一般無腦選TCP就對了。

類似下面這樣。

fd=socket(AF_INET,SOCK_STREAM,0);

其中SOCK_STREAM,是指使用字節(jié)流傳輸數(shù)據(jù),說白了就是TCP協(xié)議。

在定義了socket之后,我們就可以愉快的對這個socket進行操作,比如用bind()綁定IP端口,用connect()發(fā)起建連。

9d8ecdd0-50fa-11ed-a3b6-dac502259ad0.gif

握手建立連接流程

在連接建立之后,我們就可以使用send()發(fā)送數(shù)據(jù),recv()接收數(shù)據(jù)。

光這樣一個純裸的TCP連接,就可以做到收發(fā)數(shù)據(jù)了,那是不是就夠了?

不行,這么用會有問題。

使用純裸TCP會有什么問題

八股文常背,TCP是有三個特點,面向連接、可靠、基于字節(jié)流。

9ec106d2-50fa-11ed-a3b6-dac502259ad0.png

TCP是什么

這三個特點真的概括的非常精辟,這個八股文我們沒白背。

每個特點展開都能聊一篇文章,而今天我們需要關注的是基于字節(jié)流這一點。

字節(jié)流可以理解為一個雙向的通道里流淌的數(shù)據(jù),這個數(shù)據(jù)其實就是我們常說的二進制數(shù)據(jù),簡單來說就是一大堆 01 串。純裸TCP收發(fā)的這些 01 串之間是沒有任何邊界的,你根本不知道到哪個地方才算一條完整消息。

9eea4376-50fa-11ed-a3b6-dac502259ad0.png

01二進制字節(jié)流

正因為這個沒有任何邊界的特點,所以當我們選擇使用TCP發(fā)送"夏洛"和"特煩惱"的時候,接收端收到的就是"夏洛特煩惱",這時候接收端沒發(fā)區(qū)分你是想要表達"夏洛"+"特煩惱"還是"夏洛特"+"煩惱"。

9f20aa60-50fa-11ed-a3b6-dac502259ad0.png

消息對比

這就是所謂的粘包問題,之前也寫過一篇專門的文章聊過這個問題。

說這個的目的是為了告訴大家,純裸TCP是不能直接拿來用的,你需要在這個基礎上加入一些自定義的規(guī)則,用于區(qū)分消息邊界。

于是我們會把每條要發(fā)送的數(shù)據(jù)都包裝一下,比如加入消息頭,消息頭里寫清楚一個完整的包長度是多少,根據(jù)這個長度可以繼續(xù)接收數(shù)據(jù),截取出來后它們就是我們真正要傳輸?shù)?strong>消息體。

9f2a37f6-50fa-11ed-a3b6-dac502259ad0.png

消息邊界長度標志

而這里頭提到的消息頭,還可以放各種東西,比如消息體是否被壓縮過和消息體格式之類的,只要上下游都約定好了,互相都認就可以了,這就是所謂的協(xié)議。

每個使用TCP的項目都可能會定義一套類似這樣的協(xié)議解析標準,他們可能有區(qū)別,但原理都類似。

于是基于TCP,就衍生了非常多的協(xié)議,比如HTTP和RPC。

HTTP和RPC

我們回過頭來看網(wǎng)絡的分層圖。

9f441aea-50fa-11ed-a3b6-dac502259ad0.png

四層網(wǎng)絡協(xié)議

TCP是傳輸層的協(xié)議,而基于TCP造出來的HTTP和各類RPC協(xié)議,它們都只是定義了不同消息格式的應用層協(xié)議而已。

HTTP協(xié)議(Hyper Text Transfer Protocol),又叫做超文本傳輸協(xié)議。我們用的比較多,平時上網(wǎng)在瀏覽器上敲個網(wǎng)址就能訪問網(wǎng)頁,這里用到的就是HTTP協(xié)議。

9f7378ee-50fa-11ed-a3b6-dac502259ad0.png

HTTP調(diào)用

RPCRemote Procedure Call),又叫做遠程過程調(diào)用。它本身并不是一個具體的協(xié)議,而是一種調(diào)用方式。

舉個例子,我們平時調(diào)用一個本地方法就像下面這樣。

res=localFunc(req)

如果現(xiàn)在這不是個本地方法,而是個遠端服務器暴露出來的一個方法remoteFunc,如果我們還能像調(diào)用本地方法那樣去調(diào)用它,這樣就可以屏蔽掉一些網(wǎng)絡細節(jié),用起來更方便,豈不美哉?

res=remoteFunc(req)
9f9759b2-50fa-11ed-a3b6-dac502259ad0.png

RPC可以像調(diào)用本地方法那樣調(diào)用遠端方法

基于這個思路,大佬們造出了非常多款式的RPC協(xié)議,比如比較有名的gRPC,thrift。

值得注意的是,雖然大部分RPC協(xié)議底層使用TCP,但實際上它們不一定非得使用TCP,改用UDP或者HTTP,其實也可以做到類似的功能。

基于TCP協(xié)議的HTTP和RPC協(xié)議

到這里,我們回到文章標題的問題。

既然有HTTP協(xié)議,為什么還要有RPC?

其實,TCP是70年代出來的協(xié)議,而HTTP是90年代才開始流行的。而直接使用裸TCP會有問題,可想而知,這中間這么多年有多少自定義的協(xié)議,而這里面就有80年代出來的RPC。

所以我們該問的不是既然有HTTP協(xié)議為什么要有RPC,而是為什么有RPC還要有HTTP協(xié)議。

那么,既然有RPC了,為什么還要有HTTP呢?

現(xiàn)在電腦上裝的各種聯(lián)網(wǎng)軟件,比如xx管家,xx衛(wèi)士,它們都作為客戶端(client)需要跟服務端(server)建立連接收發(fā)消息,此時都會用到應用層協(xié)議,在這種client/server (c/s)架構下,它們可以使用自家造的RPC協(xié)議,因為它只管連自己公司的服務器就ok了。

但有個軟件不同,瀏覽器(browser),不管是chrome還是IE,它們不僅要能訪問自家公司的服務器(server),還需要訪問其他公司的網(wǎng)站服務器,因此它們需要有個統(tǒng)一的標準,不然大家沒法交流。于是,HTTP就是那個時代用于統(tǒng)一 browser/server (b/s) 的協(xié)議。

也就是說在多年以前,HTTP主要用于b/s架構,而RPC更多用于c/s架構。但現(xiàn)在其實已經(jīng)沒分那么清了,b/s和c/s在慢慢融合。很多軟件同時支持多端,比如某度云盤,既要支持網(wǎng)頁版,還要支持手機端和pc端,如果通信協(xié)議都用HTTP的話,那服務器只用同一套就夠了。而RPC就開始退居幕后,一般用于公司內(nèi)部集群里,各個微服務之間的通訊。

那這么說的話,都用HTTP得了,還用什么RPC?

仿佛又回到了文章開頭的樣子,那這就要從它們之間的區(qū)別開始說起。

HTTP和RPC有什么區(qū)別

我們來看看RPC和HTTP區(qū)別比較明顯的幾個點。

服務發(fā)現(xiàn)

首先要向某個服務器發(fā)起請求,你得先建立連接,而建立連接的前提是,你得知道IP地址和端口。這個找到服務對應的IP端口的過程,其實就是服務發(fā)現(xiàn)。

HTTP中,你知道服務的域名,就可以通過DNS服務去解析得到它背后的IP地址,默認80端口。

RPC的話,就有些區(qū)別,一般會有專門的中間服務去保存服務名和IP信息,比如consul或者etcd,甚至是redis。想要訪問某個服務,就去這些中間服務去獲得IP和端口信息。由于dns也是服務發(fā)現(xiàn)的一種,所以也有基于dns去做服務發(fā)現(xiàn)的組件,比如CoreDNS。

可以看出服務發(fā)現(xiàn)這一塊,兩者是有些區(qū)別,但不太能分高低。

底層連接形式

以主流的HTTP1.1協(xié)議為例,其默認在建立底層TCP連接之后會一直保持這個連接(keep alive),之后的請求和響應都會復用這條連接。

RPC協(xié)議,也跟HTTP類似,也是通過建立TCP長鏈接進行數(shù)據(jù)交互,但不同的地方在于,RPC協(xié)議一般還會再建個連接池,在請求量大的時候,建立多條連接放在池內(nèi),要發(fā)數(shù)據(jù)的時候就從池里取一條連接出來,用完放回去,下次再復用,可以說非常環(huán)保。

a0224216-50fa-11ed-a3b6-dac502259ad0.png

connection_pool

由于連接池有利于提升網(wǎng)絡請求性能,所以不少編程語言的網(wǎng)絡庫里都會給HTTP加個連接池,比如go就是這么干的。

可以看出這一塊兩者也沒太大區(qū)別,所以也不是關鍵。

傳輸?shù)膬?nèi)容

基于TCP傳輸?shù)南ⅲf到底,無非都是消息頭header和消息體body。

header是用于標記一些特殊信息,其中最重要的是消息體長度

body則是放我們真正需要傳輸?shù)膬?nèi)容,而這些內(nèi)容只能是二進制01串,畢竟計算機只認識這玩意。所以TCP傳字符串和數(shù)字都問題不大,因為字符串可以轉成編碼再變成01串,而數(shù)字本身也能直接轉為二進制。但結構體呢,我們得想個辦法將它也轉為二進制01串,這樣的方案現(xiàn)在也有很多現(xiàn)成的,比如json,protobuf。

這個將結構體轉為二進制數(shù)組的過程就叫序列化,反過來將二進制數(shù)組復原成結構體的過程叫反序列化。

a0308ea2-50fa-11ed-a3b6-dac502259ad0.png

序列化和反序列化

對于主流的HTTP1.1,雖然它現(xiàn)在叫超文本協(xié)議,支持音頻視頻,但HTTP設計初是用于做網(wǎng)頁文本展示的,所以它傳的內(nèi)容以字符串為主。header和body都是如此。在body這塊,它使用json序列化結構體數(shù)據(jù)。

我們可以隨便截個圖直觀看下。

a0a6722a-50fa-11ed-a3b6-dac502259ad0.png

HTTP報文

可以看到這里面的內(nèi)容非常多的冗余,顯得非常啰嗦。最明顯的,像header里的那些信息,其實如果我們約定好頭部的第幾位是content-type,就不需要每次都真的把"content-type"這個字段都傳過來,類似的情況其實在body的json結構里也特別明顯。

而RPC,因為它定制化程度更高,可以采用體積更小的protobuf或其他序列化協(xié)議去保存結構體數(shù)據(jù),同時也不需要像HTTP那樣考慮各種瀏覽器行為,比如302重定向跳轉啥的。因此性能也會更好一些,這也是在公司內(nèi)部微服務中拋棄HTTP,選擇使用RPC的最主要原因。

a0fd1166-50fa-11ed-a3b6-dac502259ad0.png

HTTP原理

a1241022-50fa-11ed-a3b6-dac502259ad0.png

RPC原理

當然上面說的HTTP,其實特指的是現(xiàn)在主流使用的HTTP1.1,HTTP2在前者的基礎上做了很多改進,所以性能可能比很多RPC協(xié)議還要好,甚至連gRPC底層都直接用的HTTP2。

那么問題又來了:

既然有了HTTP2,為什么還要有RPC協(xié)議?

這個是由于HTTP2是2015年出來的。那時候很多公司內(nèi)部的RPC協(xié)議都已經(jīng)跑了好些年了,基于歷史原因,一般也沒必要去換了。

總結

純裸TCP是能收發(fā)數(shù)據(jù),但它是個無邊界的數(shù)據(jù)流,上層需要定義消息格式用于定義消息邊界。于是就有了各種協(xié)議,HTTP和各類RPC協(xié)議就是在TCP之上定義的應用層協(xié)議。

RPC本質上不算是協(xié)議,而是一種調(diào)用方式,而像gRPC和thrift這樣的具體實現(xiàn),才是協(xié)議,它們是實現(xiàn)了RPC調(diào)用的協(xié)議。目的是希望程序員能像調(diào)用本地方法那樣去調(diào)用遠端的服務方法。同時RPC有很多種實現(xiàn)方式,不一定非得基于TCP協(xié)議。

從發(fā)展歷史來說,HTTP主要用于b/s架構,而RPC更多用于c/s架構。但現(xiàn)在其實已經(jīng)沒分那么清了,b/s和c/s在慢慢融合。很多軟件同時支持多端,所以對外一般用HTTP協(xié)議,而內(nèi)部集群的微服務之間則采用RPC協(xié)議進行通訊。

RPC其實比HTTP出現(xiàn)的要早,且比目前主流的HTTP1.1性能要更好,所以大部分公司內(nèi)部都還在使用RPC。

HTTP2.0HTTP1.1的基礎上做了優(yōu)化,性能可能比很多RPC協(xié)議都要好,但由于是這幾年才出來的,所以也不太可能取代掉RPC。

最后留個問題,大家有沒有發(fā)現(xiàn),不管是HTTP還是RPC,它們都有個特點,那就是消息都是客戶端請求,服務端響應。客戶端沒問,服務端肯定就不答,這就有點僵了,但現(xiàn)實中肯定有需要下游主動發(fā)送消息給上游的場景,比如打個網(wǎng)頁游戲,站在那啥也不操作,怪也會主動攻擊我,這種情況該怎么辦呢?





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • UDP
    UDP
    +關注

    關注

    0

    文章

    330

    瀏覽量

    34636
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11878
  • HTTP協(xié)議

    關注

    0

    文章

    67

    瀏覽量

    10204

原文標題:既然有HTTP協(xié)議,為什么還要用RPC?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    HTTP協(xié)議在工業(yè)領域會用到嗎

    HTTP協(xié)議在工業(yè)領域會用到,并且在工業(yè)互聯(lián)網(wǎng)、設備管理、數(shù)據(jù)交互等多個方面發(fā)揮著重要作用,以下為你詳細介紹: 工業(yè)互聯(lián)網(wǎng)場景 設備接入與管理 原理:在工業(yè)互聯(lián)網(wǎng)平臺中,各類工業(yè)設備(如傳感器
    的頭像 發(fā)表于 06-03 09:17 ?185次閱讀

    HTTP 協(xié)議對于SEO優(yōu)化的影響

    搜索引擎優(yōu)化(SEO)是提高網(wǎng)站在搜索引擎中的可見性和排名的過程。HTTP協(xié)議作為互聯(lián)網(wǎng)通信的基礎,對SEO有著深遠的影響。 1. HTTP狀態(tài)碼 HTTP狀態(tài)碼是服務器響應客戶端請求
    的頭像 發(fā)表于 12-30 09:29 ?600次閱讀

    如何使用 cURL 測試 HTTP 協(xié)議

    cURL是一個強大的命令行工具,用于傳輸數(shù)據(jù),支持多種協(xié)議,包括HTTP、HTTPS、FTP等。使用cURL測試HTTP協(xié)議可以幫助你理解HTTP
    的頭像 發(fā)表于 12-30 09:26 ?1089次閱讀

    如何使用 HTTP 協(xié)議進行數(shù)據(jù)傳輸

    在互聯(lián)網(wǎng)時代,數(shù)據(jù)傳輸是信息交換的基礎。HTTP協(xié)議作為最常用的數(shù)據(jù)傳輸協(xié)議之一,支撐著全球數(shù)十億用戶的數(shù)據(jù)交互。 HTTP協(xié)議的基本概念
    的頭像 發(fā)表于 12-30 09:24 ?1551次閱讀

    如何實現(xiàn) HTTP 協(xié)議的安全性

    HTTP(超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上應用最為廣泛的協(xié)議之一,用于從服務器傳輸超文本到本地瀏覽器的傳輸協(xié)議。然而,HTTP
    的頭像 發(fā)表于 12-30 09:22 ?927次閱讀

    HTTP 協(xié)議的工作原理

    HTTP協(xié)議的工作原理 1. HTTP協(xié)議概述 HTTP是一個應用層協(xié)議,它定義了客戶端與服務器
    的頭像 發(fā)表于 12-30 09:21 ?997次閱讀

    HTTP 協(xié)議的基本概念

    HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)是一種用于分布式、協(xié)作式、超媒體信息系統(tǒng)的網(wǎng)絡協(xié)議。HTTP 是互聯(lián)網(wǎng)上應用最為廣泛的
    的頭像 發(fā)表于 12-29 15:12 ?1463次閱讀

    dap協(xié)議與傳統(tǒng)協(xié)議的區(qū)別 dap協(xié)議的工作原理詳解

    。 DAP協(xié)議與傳統(tǒng)協(xié)議的區(qū)別 去中心化 vs 中心化 傳統(tǒng)協(xié)議 :大多數(shù)傳統(tǒng)協(xié)議依賴于中心化的服務器或服務提供商,例如HTTP
    的頭像 發(fā)表于 11-22 15:40 ?1354次閱讀

    socket 與 HTTP 協(xié)議的關系

    在計算機網(wǎng)絡中,Socket和HTTP協(xié)議是兩個非常重要的概念,它們在數(shù)據(jù)傳輸和網(wǎng)絡通信中扮演著關鍵的角色。 1. Socket的概念 Socket是一種通信機制,它允許兩個程序(一個客戶端和一個
    的頭像 發(fā)表于 11-12 14:12 ?765次閱讀

    socket與HTTP協(xié)議的比較

    (套接字)是一種通信機制,它允許兩個應用程序通過網(wǎng)絡進行雙向通信。在TCP/IP模型中,Socket位于傳輸層和應用層之間,提供了一種抽象的接口,使得應用程序可以忽略底層網(wǎng)絡的細節(jié),專注于數(shù)據(jù)的發(fā)送和接收。 1.2 HTTP協(xié)議 HTT
    的頭像 發(fā)表于 11-01 16:14 ?910次閱讀

    低功耗4G模組HTTP網(wǎng)絡協(xié)議應用

    ?大家好,今天我們來學習合宙Air780E模組LuatOS開發(fā)4G通信中HTTP網(wǎng)絡協(xié)議的應用,實現(xiàn)模組和服務器之間數(shù)據(jù)的傳輸。 一、HTTP概述 1.1 簡介 HTTP
    的頭像 發(fā)表于 11-01 07:23 ?597次閱讀
    低功耗4G模組<b class='flag-5'>HTTP</b>網(wǎng)絡<b class='flag-5'>協(xié)議</b>應用

    4G 模組 HTTP 網(wǎng)絡協(xié)議應用 白嫖版!

    今天我們來白嫖的是Air780E模組LuatOS開發(fā)4G通信中HTTP網(wǎng)絡協(xié)議的應用,實現(xiàn)模組和服務器之間數(shù)據(jù)的傳輸,詳細介紹硬件環(huán)境、軟件環(huán)境、功能驗證等…
    的頭像 發(fā)表于 10-30 14:22 ?1341次閱讀
    4G 模組 <b class='flag-5'>HTTP</b> 網(wǎng)絡<b class='flag-5'>協(xié)議</b>應用 白嫖版!

    HTTP協(xié)議下的海外網(wǎng)絡暢游:安全與效率的雙重保障

    在全球化日益加深的今天,HTTP協(xié)議作為互聯(lián)網(wǎng)上最為廣泛使用的通信協(xié)議之一,為海外網(wǎng)絡暢游提供了重要的技術支持。在HTTP協(xié)議下,海外網(wǎng)絡暢
    的頭像 發(fā)表于 09-24 08:08 ?412次閱讀

    Dubbo源碼淺析(一)—RPC框架與Dubbo

    時,就像調(diào)用本地過程一樣方便。 1.2 RPCHttp的關系 用一句話來總結就是: RPC是一種概念,http是一種協(xié)議,可以認
    的頭像 發(fā)表于 08-16 15:18 ?1147次閱讀
    Dubbo源碼淺析(一)—<b class='flag-5'>RPC</b>框架與Dubbo

    鑒源實驗室·HTTP協(xié)議網(wǎng)絡安全攻擊

    互聯(lián)網(wǎng)的迅猛發(fā)展,HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)已經(jīng)成為網(wǎng)頁傳輸?shù)幕A協(xié)議。它在客戶端(如瀏覽器)和服務器之間傳遞信息,使得我們能夠瀏覽網(wǎng)頁、提交表單
    的頭像 發(fā)表于 07-30 13:48 ?624次閱讀
    鑒源實驗室·<b class='flag-5'>HTTP</b><b class='flag-5'>協(xié)議</b>網(wǎng)絡安全攻擊