RPC,Remote Procedure Call,遠程過程調用。
那麼怎麼去理解這個遠程過程調用呢?咱們能夠先理解一下相對的本地過程調用。html
本地調用,很簡單,通俗一點來講,就是你在你的項目中定義了一個函數,而後調用,這就是本地過程調用。瀏覽器
function add(x, y){ return x + y; } const a = 1, b = 2; const result = add(a, b) // 這就是本地過程調用
如上面代碼所示,先是定義了一個add
函數,在代碼塊最後一行調用add
函數的過程其實就是本地過程調用。
那麼最後一行代碼的執行,在計算機中的過程是怎樣的呢?性能優化
result
ps:這只是簡單描述了一下本地調用的過程,其實計算機內部或者瀏覽器V8引擎作了許多優化。網絡
那麼上面講了本地過程調用,遠程過程調用實際上是類似的,只是函數聲明定義及其做用域在遠端,別的機器,別的服務上,由於不存在共同的內存空間,因此不能夠直接像本地調用同樣尋找到該函數。框架
那麼,對比本地調用,遠程調用還須要額外解決什麼問題呢?tcp
相對於本地調用來講,不一樣服務和不一樣機器沒法共用一樣的內存空間,所以沒法直接通信。所以須要創建TCP鏈接,調用方和被調方的數據均是基於此鏈接中進行交換。像grpc的框架,底層tcp鏈接是基於http2.0協議的,其中的協議數據類型有unary
和stream
兩種,其中差別是客戶端和服務端的通信差別,底層仍是經過二進制流拼湊的數據幀進行傳輸,而且在包頭中會代表對應的數據類型。函數
基於第一步,兩臺機器中已經創建鏈接了,那麼被調方怎麼知道調用方想調用哪一個服務的哪一個接口呢?這裏就須要在創建tcp鏈接進行數據傳輸的時候,須要調用方把被調方的ip、端口和函數id等信息帶過去,這部分信息通常稱爲call ID映射。
通常來講,調用方和被調方都會維護一個映射表,裏面包含了調用函數的入參和出參,這部分有點相似與接口協議。性能
基於網絡協議傳輸是二進制的形式,那麼調用方傳輸的尋址信息和入參等數據須要序列化以後才能傳輸,而被調方先是反序列化數據,找到對應的函數,並在執行函數後將結果序列化後傳回去給到調用方,最後調用方反序列化數據以後獲得結果。
圖片來源(https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)優化
相信不少同窗都有疑問,爲啥要用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