RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程電腦程式上請求服務,而不需要了解底層網絡技術的協議。比如兩個不同的服務 A、B 部署在兩台不同的機器上,那麼服務 A 如果想要調用服務 B 中的某個方法該怎麼辦呢?使用 HTTP請求 當然可以,但是可能會比較慢而且一些優化做的並不好。 RPC 的出現就是為了解決這個問題。
下面再貼一個網上的時序圖:
從上面對 RPC 介紹的內容中,概括來講RPC 主要解決了:讓分布式或者微服務系統中不同服務之間的調用像本地調用一樣簡單。
RPC 只是一種概念、一種設計,就是為了解決 不同服務之間的調用問題, 它一般會包含有 傳輸協議 和 序列化協議 這兩個。
實現 RPC 的可以傳輸協議可以直接建立在 TCP 之上,也可以建立在 HTTP 協議之上。大部分 RPC 框架都是使用的 TCP 連接(gRPC使用了HTTP2)。
可能現在很多對計算機網絡不太熟悉的朋友已經被搞蒙了,要想真正搞懂,還需要來簡單複習一下計算機網絡基礎知識:
我們通常談計算機網絡的五層協議的體系結構是指:應用層、傳輸層、網絡層、數據鏈路層、物理層。
應用層(application-layer)的任務是通過應用進程間的交互來完成特定網絡應用。HTTP 屬於應用層協議,它會基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過 URL 向HTTP服務端即WEB伺服器發送所有請求。Web伺服器根據接收到的請求後,向客戶端發送響應信息。HTTP協議建立在 TCP 協議之上。
運輸層(transport layer)的主要任務就是負責向兩台主機進程之間的通信提供通用的數據傳輸服務。TCP是傳輸層協議,主要解決數據如何在網絡中傳輸。相比於UDP,TCP 提供的是面向連接的,可靠的數據傳輸服務。
主要關鍵就在 HTTP 使用的 TCP 協議,和我們自定義的 TCP 協議在報文上的區別。
http1.1協議的 TCP 報文包含太多在傳輸過程中可能無用的信息:
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 協議進行傳輸就會避免上面這個問題,極大地減輕了傳輸數據的開銷。 這也就是為什麼通常會採用自定義 TCP 協議的 RPC 來進行進行服務調用的真正原因。除此之外,成熟的 RPC 框架還提供好了「服務自動註冊與發現」、"智能負載均衡"、「可視化的服務治理和運維」、「運行期流量調度」等等功能,這些也算是選擇 RPC 進行服務註冊和發現的一方面原因吧!
很多文章中還會提到說 HTTP 協議相較於自定義 TCP 報文協議,增加的開銷在於連接的建立與斷開,但是這個觀點已經被否認,下面截取自某乎中一個回答:
首先要否認一點 HTTP 協議相較於自定義 TCP 報文協議,增加的開銷在於連接的建立與斷開。HTTP 協議是支持連接池復用的,也就是建立一定數量的連接不斷開,並不會頻繁的創建和銷毀連接。二一要說的是 HTTP 也可以使用 Protobuf 這種二進位編碼協議對內容進行編碼,因此二者最大的區別還是在傳輸協議上。
除此之外,還需要注意的一點是 Spring Cloud Netflix 並沒有使用 RPC 框架來進行不同服務之間的調用,而是使用 HTTP 協議進行調用的,速度雖然不比 RPC ,但是使用 HTTP 協議也會帶來其他很多好處(這一點,可以自行查閱相關資料了解)。
分享一份手寫RPC的視頻,內有RPC原理解析等等一系列的相關難點解析,感興趣的朋友可以私信我免費獲取