RPC的原理
RCP是一種 封裝 遠程調用的 實現思路,主要用來作為 分散式系統中的 節點之間 進行網路通信的 中間件。
原始的通信方式
基本的網路通訊方式,一般是直接用java自帶的httpclient,或者 封裝過的okhttp等工具,但是這些通信方式,都有一個共同點,就是 調用者需要知道 遠程服務的url地址和請求方式,還需要自己動手 組裝需要傳輸的數據,並且對回傳的數據,需要自己解析成 想要的類型。如下圖:
那麼,有沒有一種方式,可以 讓開發者,在調用遠程服務的時候,就跟調用當前項目中的方法一樣呢?當然有,RPC就是其中一種。
實現原理
如果要讓遠程調用,就跟調用本項目中的方法一樣,那麼有幾件事是必須解決的:
1. 當前項目中(或者引入的jar包中),真的有這個方法,這個方法是不是被實現過 不重要,重要的是,一點要有這個方法。
2. 當執行這些方法的時候,程序會自動去調用遠程的介面,並實現數據的傳輸和對回傳數據的解析。
要實現第一點 並不難,只要在項目中創建相應的介面(interface)即可,而第二點則引來了另外兩個個問題:
1. 怎麼實現,調用一個方法的時候,其實是執行的另一段代碼
2. 程序怎麼知道 這個方法 真正要執行的是哪個伺服器上的哪個介面呢
思路很簡單,那就是利用 動態代理 和 註冊中心, 給每個介面創建代理對象,當調用這些對象中的方法的時候,根據對象的類型和方法信息,去註冊中心尋找相應的介面信息,然後調用遠程的介面。並傳輸數據 和 解析回傳數據。
如下圖所示:
在這個方法里,獲取到 調用的相關信息,根據這些信息,去註冊中心 獲取相應的 遠程介面信息 並實現 調用。
數據傳輸
數據的傳輸,一般會採用序列化的方式,而接收方 會對參數進行反序列化。
推薦閱讀:
※SpringBoot+Hessian實例
※babel: yet another rpc, but far beyond rpc(中)