RPC-遠程過程調用

RPC-遠程過程調用

什麼是RPC

RPC,Remote Procedure Call,遠程過程調用。
那麼怎麼去理解這個遠程過程調用呢?咱們能夠先理解一下相對的本地過程調用。html

本地過程調用

本地調用,很簡單,通俗一點來講,就是你在你的項目中定義了一個函數,而後調用,這就是本地過程調用。瀏覽器

function add(x, y){
    return x + y;
}

const a = 1, b = 2;
const result = add(a, b) // 這就是本地過程調用

如上面代碼所示,先是定義了一個add函數,在代碼塊最後一行調用add函數的過程其實就是本地過程調用。
那麼最後一行代碼的執行,在計算機中的過程是怎樣的呢?性能優化

  1. 計算機解析函數名
  2. 經過最底層的塊級做用域一直往上找尋找函數聲明的地方
  3. 計算機尋址,從內存中找到存放該函數的地址
  4. 參數a和b入棧,執行函數邏輯
  5. 返回計算結果並賦值給result

ps:這只是簡單描述了一下本地調用的過程,其實計算機內部或者瀏覽器V8引擎作了許多優化。網絡

遠程過程調用

那麼上面講了本地過程調用,遠程過程調用實際上是類似的,只是函數聲明定義及其做用域在遠端,別的機器,別的服務上,由於不存在共同的內存空間,因此不能夠直接像本地調用同樣尋找到該函數。框架

那麼,對比本地調用,遠程調用還須要額外解決什麼問題呢?tcp

1.通信問題

相對於本地調用來講,不一樣服務和不一樣機器沒法共用一樣的內存空間,所以沒法直接通信。所以須要創建TCP鏈接,調用方和被調方的數據均是基於此鏈接中進行交換。像grpc的框架,底層tcp鏈接是基於http2.0協議的,其中的協議數據類型有unarystream兩種,其中差別是客戶端和服務端的通信差別,底層仍是經過二進制流拼湊的數據幀進行傳輸,而且在包頭中會代表對應的數據類型。函數

  1. unary,經過一問一答的形式在客戶端和服務端中進行通信。
  2. stream,其中又分爲客戶端流、服務端流和雙工流。
    ①客戶端流:客戶端發送多條數據流,服務端回答一條。
    ②服務端流:客戶端發送一條數據流,服務端回答多條。
    ③雙工流:客戶端和服務端均可以主動向對方發送數據流。
2.尋址問題

基於第一步,兩臺機器中已經創建鏈接了,那麼被調方怎麼知道調用方想調用哪一個服務的哪一個接口呢?這裏就須要在創建tcp鏈接進行數據傳輸的時候,須要調用方把被調方的ip、端口和函數id等信息帶過去,這部分信息通常稱爲call ID映射。
通常來講,調用方和被調方都會維護一個映射表,裏面包含了調用函數的入參和出參,這部分有點相似與接口協議。性能

3.序列化和反序列化

基於網絡協議傳輸是二進制的形式,那麼調用方傳輸的尋址信息和入參等數據須要序列化以後才能傳輸,而被調方先是反序列化數據,找到對應的函數,並在執行函數後將結果序列化後傳回去給到調用方,最後調用方反序列化數據以後獲得結果。
image.png
圖片來源(https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)優化

爲何用RPC

相信不少同窗都有疑問,爲啥要用RPC協議?爲啥不能繼續用http/https協議進行傳輸呢?
其實你們陷進了一個理解誤區,就是RPC和``不是兩個平行的概念。
RPC只是一個函數調用,可是須要經過遠程調用,所以底層通信傳輸是基於TCP協議的。
HTTP協議是一個網絡傳輸協議,底層也是基於TCP的,所以你們很容易產生誤解。網絡傳輸協議

那麼爲何要用RPC進行呢?

1.RPC協議,客戶端和服務端都會維護一份結構和映射表,使調用和傳輸的數據更透明,雙方均可以更嚴格地制約調用參數和回包參數的類型,從而減小bug。

2.對TCP傳輸進行優化,如:二進制流傳輸,無用包頭信息廢除,包體壓縮,字節編碼解碼優化等。其實基於HTTP2.0這些功能已經支持了,所以gRPC的TCP傳輸也是參考HTTP2.0的。

3.rpc結構層能夠作更多的監控,容錯和性能優化。

參考文章:
https://www.zhihu.com/question/25536695
https://www.zhihu.com/question/41609070

相關文章
相關標籤/搜索