主頁 > 後端開發 > 有了HTTP,為啥還要用RPC

有了HTTP,為啥還要用RPC

2023-03-30 07:38:31 後端開發

既然有 HTTP 請求,為什么還要用 RPC 呼叫?

一直以來都沒有深究過RPC和HTTP的區別,不都是寫一個服務然后在客戶端呼叫么?

HTTP和RPC最本質的區別,就是 RPC 主要是基于 TCP/IP 協議的,而 HTTP 服務主要是基于 HTTP 協議的

我們都知道 HTTP 協議是在傳輸層協議 TCP 之上的,所以效率來看的話,RPC 當然是要更勝一籌啦!

HTTP和RPC的相同點是,底層通訊都是基于socket,都可以實作遠程呼叫,都可以實作服務呼叫服務

HTTP 的本質

首先你要明確 HTTP 是一個協議,是一個超文本傳輸協議,

HTTP 它是協議,不是運輸通道,

它基于 TCP/IP 來傳輸文本、圖片、視頻、音頻等,

重點來了,

HTTP 不提供資料包的傳輸功能,也就是資料包從瀏覽器到服務端再來回的傳輸和它沒關系,

這是 TCP/IP 干的,

那 HTTP 有啥用?我們來分析一波,

我們上網要么就是獲取一些資訊來看,要么就是修改一些資訊,

比如你用瀏覽器刷微博就是獲取資訊,發微博就是修改資訊,

所以說瀏覽器需要告知服務器它需要什么,這次的請求是要獲取哪些資訊?發怎么樣的微博,

這就涉及到瀏覽器和服務器之間的通信互動,

而互動就需要一種格式,

像你我之間的談話就用中文,你要突然換成俄語我聽不懂那不就 GG 了,

所以說 HTTP 它規定了一種格式,一種通信格式,大家都用這個格式來交談,

這樣不論你是什么服務器、什么瀏覽器都能順利的交流,減少互動的成本,

就像全世界如果都講中文,那我們不就不需要學英文了,那不就較少互動的成本了,

不像現在我們還得學英文,不然就看不懂檔案等等,

萬一之后俄語又起來了,咱還得對接俄文,這互動成本是不是就上來了,

而網路世界還好,咱們現在的 Web 互動基本上就是 HTTP 了,

其實 HTTP 協議的格式很像我們信封,有個固定的格式,

本文已經收錄到Github倉庫,該倉庫包含計算機基礎、Java基礎、多執行緒、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~

Github地址

如果訪問不了Github,可以訪問gitee地址,

gitee地址

左上角寫郵編,右上角貼郵票,然后地址姓名啥的依次來,

因為計算機是很死板的,不像我們人一樣有一種立體掃描感,所以要規定先寫頭、再寫尾,

你要是先寫尾,再寫頭計算機就認不出來了,

所以 HTTP 就規定了請求先搞請求行、再搞請求報頭、再搞請求體,

回應就狀態行、回應報頭、回應體,

所以 HTTP 的本質是什么?

就是客戶端和服務端約定好的一種通信格式,

HTTP 和 RPC 的關系

HTTP 和 RPC 其實是兩個維度的東西, HTTP 指的是通信協議,

而 RPC 則是遠程呼叫,其對應的是本地呼叫,

RPC 的通信可以用 HTTP 協議,也可以自定義協議,是不做約束的,

像之前的單體時代,我們的 service 呼叫就是自己實作的方法,是本地行程內的呼叫,

public User getUserById(Long id) {
       return userDao.getUserById(id); // 這叫本地呼叫
    }

現在都是微服務了,根據業務模塊做了不同的拆分,像用戶的服務不用我這個小組負責,我這小組只要寫訂單服務就行了,

但是我們服務需要用到用戶的資訊,于是我們需要呼叫用戶小組的服務,于是代碼變成了以下這種

public User getUserById(Long id) {
       return userConsumer.getUserById(id); // 這是遠程呼叫,邏輯是用戶小組的服務實作的,
    }

可能還有些小伙伴不太清楚,再來看個圖,

把之前的用戶實作拆分出來弄了一個用戶服務,訂單相關的也拆成了訂單服務,都單獨部署,

這樣訂單相關的服務要獲取用戶的資訊就需要遠程呼叫了,

可以看到 RPC 就是通過網路進行遠程呼叫,訂單服務其實就是客戶端,而用戶服務是服務端,

這又涉及到互動了,所以也需要約定一個格式,至于要不要用 HTTP 這個格式,就是大家自己看著辦,

至此相信你對 HTTP 是啥也清楚了,

RPC 和 HTTP 的之間的關系也清楚了,

最全面的Java面試網站

那為什么要有 RPC?

可能你常聽到什么什么之間是 RPC 呼叫的,那你有沒有想過為什么要 RPC, 我們直接 WebClient HTTP 呼叫不行么?

其實 RPC 呼叫是因為服務的拆分,或者本身公司內部的多個服務之間的通信,

服務的拆分獨立部署,那服務間的呼叫就必然需要網路通信,用 WebClient 呼叫當然可行,但是比較麻煩,

我們想即使服務被拆分了但是使用起來還是和之前本地呼叫一樣方便,

所以就出現了 RPC 框架,來屏蔽這些底層呼叫細節,使得我們編碼上還是和之前本地呼叫相差不多,

并且 HTTP 協議比較的冗余,RPC 都是內部呼叫所以不需要太考慮通用性,只要公司內部保持格式統一即可,

所以可以做各種定制化的協議來使得通信更高效,

比如規定 yes 代表 yes的練級攻略,你看是不是更高效了,少傳輸的 5 個字,

就像特殊行動的暗號,高效簡潔!

所以公司內部服務的呼叫一般都用 RPC,而 HTTP 的優勢在于通用,大家都認可這個協議,

所以三方平臺提供的介面都是通過 HTTP 協議呼叫的,

所以現在知道為什么我們呼叫第三方都是 HTTP ,公司內部用 RPC 了吧?

上面這段話看起來仿佛 HTTP 和 RPC 是對等關系,不過相信大家看了之前的決議心里應該都有數了,

下面來具體說一說 RPC 服務和 HTTP 服務的區別,

OSI 網路七層模型

在說 RPC 和 HTTP 的區別之前,我覺的有必要了解一下 OSI 的七層網路結構模型(

它可以分為以下幾層:(從上到下)

  • 第一層:應用層,定義了用于在網路中進行通信和傳輸資料的介面,
  • 第二層:表示層,定義不同的系統中資料的傳輸格式,編碼和解碼規范等,
  • 第三層:會話層,管理用戶的會話,控制用戶間邏輯連接的建立和中斷,
  • 第四層:傳輸層,管理著網路中的端到端的資料傳輸,
  • 第五層:網路層,定義網路設備間如何傳輸資料,
  • 第六層:鏈路層,將上面的網路層的資料包封裝成資料幀,便于物理層傳輸,
  • 第七層:物理層,這一層主要就是傳輸這些二進制資料,

實際應用程序中,五層協議結構里面是沒有表示層和會話層的,應該說它們和應用層合并了,

我們應該將重點放在應用層和傳輸層這兩個層面,因為 HTTP 是應用層協議,而 TCP 是傳輸層協議,

好,知道了網路的分層模型以后我們可以更好地理解為什么 RPC 服務相比 HTTP 服務要 Nice 一些!

RPC 服務

從三個角度來介紹 RPC 服務,分別是:

  • RPC 架構
  • 同步異步呼叫
  • 流行的 RPC 框架

RPC 架構

先說說 RPC 服務的基本架構吧,我們可以很清楚地看到,一個完整的 RPC 架構里面包含了四個核心的組件,

分別是:

  • Client
  • Server
  • Client Stub
  • Server Stub(這個Stub大家可以理解為存根)

分別說說這幾個組件:

  • 客戶端(Client),服務的呼叫方,
  • 服務端(Server),真正的服務提供者,
  • 客戶端存根,存放服務端的地址訊息,再將客戶端的請求引數打包成網路訊息,然后通過網路遠程發送給服務方,微信搜索公眾號:Linux技術迷,回復:linux 領取資料 ,
  • 服務端存根,接收客戶端發送過來的訊息,將訊息解包,并呼叫本地的方法,

RPC 主要是用在大型企業里面,因為大型企業里面系統繁多,業務線復雜,而且效率優勢非常重要的一塊,這個時候 RPC 的優勢就比較明顯了,

比如我們有一個處理訂單的系統服務,先宣告它的所有的介面,然后將整個專案打包,服務端這邊引入,然后實作相應的功能,客戶端這邊也只需要引入就可以呼叫了,

為什么這么做?

主要是為了減少客戶端這邊的包大小,因為每一次打包發布的時候,包太多總是會影響效率,

另外也是將客戶端和服務端解耦,提高代碼的可移植性,

同步呼叫與異步呼叫

什么是同步呼叫?什么是異步呼叫?

同步呼叫就是客戶端等待呼叫執行完成并回傳結果,

異步呼叫就是客戶端不等待呼叫執行完成回傳結果,不過依然可以通過回呼函式等接收到回傳結果的通知,如果客戶端并不關心結果,則可以變成一個單向的呼叫,

流行的 RPC 框架

目前流行的開源 RPC 框架還是比較多的,下面重點介紹三種:

①gRPC 是 Google 最近公布的開源軟體,基于最新的 HTTP2.0 協議,并支持常見的眾多編程語言,

我們知道 HTTP2.0 是基于二進制的 HTTP 協議升級版本,目前各大瀏覽器都在快馬加鞭的加以支持,

這個 RPC 框架是基于 HTTP 協議實作的,底層使用到了 Netty 框架的支持,

②Thrift 是 Facebook 的一個開源專案,主要是一個跨語言的服務開發框架,它有一個代碼生成器來對它所定義的 IDL 定義檔案自動生成服務代碼框架,

用戶只要在其之前進行二次開發就行,對于底層的 RPC 通訊等都是透明的,不過這個對于用戶來說的話需要學習特定領域語言這個特性,還是有一定成本的,

③Dubbo 是阿里集團開源的一個極為出名的 RPC 框架,在很多互聯網公司和企業應用中廣泛使用,協議和序列化框架都可以插拔是及其鮮明的特色,

HTTP 服務

通常,我們的開發模式一直定性為 HTTP 介面開發,也就是我們常說的 RESTful 風格的服務介面,

的確,對于在介面不多、系統與系統互動較少的情況下,解決資訊孤島初期常使用的一種通信手段;優點就是簡單、直接、開發方便,

利用現成的 HTTP 協議進行傳輸,

平時的作業主要就是進行介面的開發,還要寫一大份介面檔案,嚴格地標明輸入輸出是什么?說清楚每一個介面的請求方法,以及請求引數需要注意的事項等,

比如下面這個例子:

POST http://www.httpexample.com/restful/buyer/info/shar

介面可能回傳一個 JSON 字串或者是 XML 檔案,然后客戶端再去處理這個回傳的資訊,從而可以比較快速地進行開發,

但是對于大型企業來說,內部子系統較多、介面非常多的情況下,RPC 框架的好處就顯示出來了,首先就是長鏈接,不必每次通信都要像 HTTP 一樣去 3 次握手什么的,減少了網路開銷,

其次就是 RPC 框架一般都有注冊中心,有豐富的監控管理;發布、下線介面、動態擴展等,對呼叫方來說是無感知、統一化的操作,

小結

RPC 服務和 HTTP 服務還是存在很多的不同點的,一般來說,RPC 服務主要是針對大型企業的,而 HTTP 服務主要是針對小企業的,因為 RPC 效率更高,而 HTTP 服務開發迭代會更快,

很多RPC框架包含了重試機制,路由策略,負載均衡策略,高可用策略,流量控制策略等等,如果應用行程之間只使用HTTP協議通信,顯然是無法完成上述功能的,

總之,選用什么樣的框架不是按照市場上流行什么而決定的,而是要對整個專案進行完整地評估,從而在仔細比較兩種開發框架對于整個專案的影響,最后再決定什么才是最適合這個專案的,

一定不要為了使用 RPC 而每個專案都用 RPC,而是要因地制宜,具體情況具體分析,


最后給大家分享一個Github倉庫,上面有大彬整理的300多本經典的計算機書籍PDF,包括C語言、C++、Java、Python、前端、資料庫、作業系統、計算機網路、資料結構和演算法、機器學習、編程人生等,可以star一下,下次找書直接在上面搜索,倉庫持續更新中~

Github地址

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548554.html

標籤:Java

上一篇:三方對接「心得」與「體會」

下一篇:java開發規范

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more