一文弄懂 RPC 通信流程全程序
什么是 RPC 呢
RPC 的全稱是 Remote Procedure Call,即遠程程序呼叫
從字面意思可以知道,遠程肯定是指要跨機器而非本機,需要網路編程才能實作,但是不是只要通過網路通信訪問到另一臺機器的應用程式,就可以稱之為 RPC 呼叫了?
其實 RPC 是幫助我們用來屏蔽網路編程細節,實作呼叫遠程方法就跟呼叫本地方法(同一個專案中的方法)一樣的簡單,不需要因為網路編程而寫很多與業務無關的代碼,總之,RPC 的作用體現在兩方面:
- 屏蔽遠程呼叫根本地呼叫的區別,呼叫遠程方法就像呼叫本地方法一樣簡單
- 隱藏底層網路通信的復雜性,讓我們更專注于業務邏輯
RPC 通信流程
一個完整的 RPC 會涉及到哪些步驟呢?
- 由于 RPC 的遠程呼叫必然會通過網路來傳輸資料,且需要保證可靠性,所以 RPC 一般默認采用 TCP 來進行傳輸
- 網路傳輸的資料必須是二進制資料,但是呼叫方請求的出入引數都是物件,而物件是無法直接在網路中傳輸的,因此我們需要把物件轉換為二進制資料才能在網路上傳輸,這個程序我們稱之為“序列化”
- 當二進制資料進過網路傳輸給了服務提供方之后,那提供方怎么知道一個請求的資料哪里結束,是一個什么型別的請求呢
- 于是我們將資料格式的約定叫做“協議“,一般分為訊息頭和訊息體,服務方根據協議格式就可以從二進制資料中分割出不同的請求來,同時根據請求型別和序列化型別,把二進制的訊息體逆向還原成請求物件,稱之為”反序列化“
- 服務方根據反序列化出來的請求物件找到對應的實作類,完成真正的方法呼叫,再將結果傳輸序列化之后通過 TCP 傳輸給呼叫方
- 呼叫方再反序列化即可獲得應答物件,這樣就完成了一次 RPC 呼叫,
注意:這里序列化是對方法呼叫的請求資訊進行處理,編解碼是對網路傳輸訊息進行處理
那 RPC 是怎么簡化 API,屏蔽掉 RPC 細節,使用方只需要關注業務介面,像呼叫本地一樣來呼叫遠程方法呢?
- 由服務提供方給出業務介面申明,在呼叫方的程式里面, RPC 框架根據呼叫的服務介面提前生成動態代理實作類,并通過依賴注入等技術注入到宣告了介面的相關業務邏輯里面,該代理實作類會攔截所有的方法呼叫,在提供的方法邏輯里面完成一套完整的遠程呼叫,并把遠程呼叫結果回傳個呼叫方,這樣呼叫方在呼叫遠程方法的時候就像呼叫本地方法一樣,
有上述流程就一定是一個 RPC 框架了嗎?
- RPC 不僅有上述的作用,其真正強大的地方是他的治理功能,比如連接管理、健康檢測、負載均衡、熔斷限流等等
該文是作者的看極客的學習筆記
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301921.html
標籤:其他
