怎麼理解RPC?

參考:https://www.zhihu.com/question/41609070/answer/1030913797

https://zhuanlan.zhihu.com/p/61364466

RPC(romote procedure call):遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。過程其實就是方法。所以PRC可以理解爲遠程方法調用。

這裏的遠程調用是相對於本地調用的。
假如你有一個Calculator接口,以及他的實現類CalculatorImpl, 在單體應用中,要調用Calculator的add方法來執行一個加運算,你可以直接調用。這種方法,因爲在同一個地址空間,或者在同一塊內存,這個稱爲本地函數調用。

現在系統被改造爲分佈式應用,接口調用和實現分別在兩個子系統中。
服務A中並沒有CalculatorImpl這個類,那它要怎麼調用服務B的CalculatorImpl的add方法呢?

應用調用另一個應用的解決方案,我們很容易的想到HTTP調用。如要想讓服務A調用服務B中的方法,比如讓服務B暴露Restful接口,然後讓服務A通過這個Restful接口來間接調用CalculatorImpl的方法。
不過,像這種每次調用,都需要些一串發起http請求的代碼。能不能去掉這些,像本地調用一樣,去發起遠程調用,讓使用者感知不到遠程調用的過程。

怎麼實現這個過程呢?

首先,調用方調用的是接口,必須得爲接口構造一個假的實現。顯然,要使用動態代理。這樣,調用方的調用就被動態代理接收到了。

第二,動態代理接收到調用後,應該想辦法調用遠程的實際實現。這包括下面幾步:

  • 識別具體要調用的遠程方法的IP、端口。
  • 將調用方法的入參進行序列化。
  • 通過通信將請求發送到遠程的方法中。

這樣,遠程的服務就接收到了調用方的請求。它應該:

  • 反序列化各個調用參數
  • 定位到實際要調用的方法,然後輸入參數,執行方法
  • 按照調用的路徑返回調用的結果

整個過程如下所示。

從上述的分析我們可以概括地講,RPC就是讓一個應用調用另一個應用中方法的一種實現方法。

它的思路就是:使用代理模式,生成一個代理對象,在這個代理對象的內部,通過httpClient來實現RPC遠程調用的過程。

總結一下,RPC要解決的兩個問題:

  •  解決分佈式系統中,服務之間的調用問題。
  • 遠程調用時,要能夠像本地調用一樣方便,讓調用者感知不到遠程調用的邏輯。

這也是很多RPC框架要解決的問題和解決的思路。

在遠程調用時,必然要涉及到通信協議選擇的問題,其調用協議通常包含傳輸協議和序列化協議。

傳輸協議包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 協議,也有如dubbo一類的自定義報文的tcp協議等。

序列化協議包含: 如基於文本編碼的 xml json,也有二進制編碼的 protobuf hessian等。

當然一個成熟的rpc框架是很全面的,除了通信協議外還有“服務註冊發現”,錯誤重試,服務升級的灰度策略,服務調用的負載均衡等等的實現。

RPC和HTTP的區別是什麼?

RPC=Remote Produce Call 是一種技術的概念名詞,HTTP是一種協議。它們不是一個層面的東西。

RPC可以通過 HTTP 來實現,也可以通過Socket自己實現一套協議(比如阿里的dubbo)來實現.所以題目可以換一種理解,爲何 RPC 還有除 HTTP 之外的實現法,有何必要,畢竟除了HTTP實現外,私有協議不具備通用性。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章