淺談RPC調用

     RPC英文全稱remote procedure call 翻譯成中文的意思就是遠程過程調用。RPC的出現其實主要是爲了解決分佈式系統間的通訊透明性的問題。編程

     那什麼是分佈式系統的通訊透明性問題?這個問題就是指分佈式系統間的相互調用實際上是基本進程間的顯式消息交換,然而,消息的發送和接收過程沒法隱藏。而通訊的隱藏對於分佈式中實現訪問的透明性是極爲重要的。試想一下好比你要想查看一個訂單詳情,而後訂單系統部署了三臺機器。假設沒有RPC,其它系統想經過調訂單系統查詢訂單詳情的信息,就必須知道訂單系統部署機器的ip和端口,每一個調用者必須關注訂單系統新加或者下線和換機器部署等情景。試想這對調用者來講是有多蛋疼。換言之分佈式系統通訊就應該是透明的,這樣調用者就不須要關心調用的是那臺機器上面的服務。在調用者的角度這個遠程服務應該和調用本地服務同樣是一個單一穩定可靠的服務。數組

     基於這樣的背景有人就提出了一種與傳統方法大相徑庭的通訊手段:不一樣機器上的進程是容許相與調用的,當機器A上的進程調用機器B上的進程時,A上的調用進程被掛起,而B上的被調用進程開始執行。調用方能夠經過使用參數將信息傳送給被調用方,而後能夠經過傳回的結果獲得信息。編程人員看不到任何消息傳遞過程。這個方法就被程爲遠程過程調用RPC.服務器

     在介紹RPC以前咱們先來看常規過程調用。好比咱們定義一個c語言的方法網絡

     count = read(fd,buf,nbytes); 這裏fd爲一個整形數,表示一個文件,buf爲一個字符數組,用於存儲讀入的數據,nbytes爲另外一個整數,用於記錄實際讀入的字節數。當在主程序調用這個方法時實際的執行過程是先把參數壓入堆棧中架構

 

 

     而後程序讀取堆棧裏面的參數,執行系統的庫函數,其中還包括執行線程從用戶態到內核態的切換,執行完畢後又從內核態到用戶態的轉換過程。這些於調用者來講都是不可見和不用關心的。框架

     RPC的設計思想其實與常規過程調用相似,屏蔽底層的細節使程序不知道調用的業務邏輯是在另外一臺機器上面處理的使其專一於自身業務邏輯處理。正常的RPC調用過程異步

                           

 

 舉一個遠程調用兩個數求和的詳細調用過程分佈式

 

    這裏面出現了兩個名詞客戶端存根、服務端存根 其實客戶端存根指的就是咱們如今RPC框架中的client端,服務端存根就是server端,只是不叫法而已。客戶端存根的做用是把請求的參數以約定的通信協議打包好發送給服務端而後解析服務端返回消息,服務端存根就是根據收到的請求信息執行相應的業務邏輯調用並把結果返回客戶端。要定義一個RPC框架首先要定義好通信格式,由於最絡從網絡層解析出來的數據都是以字符串的形式解析出來的.咱們須要從這一串字符中解析出調用哪一個服務,服務入參是什麼。函數

    通常來講客戶端存根會把調用類名稱傳給服務端,服務端存根根據這個名稱找到對應的service的映射,就知道調哪一個服務了。因此服務端存根要保存一份service的映射關係。一樣客戶端存根收到響應後會喚醒以前調用的線程或者等待以前的線程運行處理返回的結果。 性能

   解決了RPC的調用問題,如今還要解決的一個關鍵問題是,客戶端怎麼知道調用哪一臺機器上的服務。就須要引入一箇中間的第三者目標服務器

 

 

                                                                                                                                                       

     服務提供者向目標服務器註冊服務,客戶機從目標服務器(一種叫法叫服務註冊中心)中獲取可調用的機器列表。若是有用過相似dubbo這樣的RPC框架是否是對這個圖很熟悉?由於全部的RPC架構的原理大多都是相似的。服務提供者往目標服務器裏面一般會註冊機器的ip和端口信息。

        下面咱們來談下RPC的好處和注意的地方。

        好處:屏蔽了底層通信的複雜性,在分佈式系統中提供了通信的透明性。

        須要注意的地方:RPC是點對點的通信方式,要求通信兩端必須同時運行,當其中一端掛了就會致使一般異常,而且調用者通常會阻塞住等待結果的返回,性能相對不是很高,固然也有異步RPC,超時重試狀況下服務端提供者須要作好服務冪等性處理。相對於RPC而言採用了面向消息通信模型的架構好比MQ則不要求通信兩端同時運行,發送消息時也不須要阻塞等待處理結果的返回通信性能就高出不少。

        最後咱們總結一下:RPC調用是指不一樣機器間的進程通信。程序不須要關心某個遠程服務是在哪臺機器上執行的,遠程服務調用就和調用本地服務同樣。要在不一樣機器間進行通信咱們須要知道通信機器的ip和端口號。ip幫助咱們定位是哪一臺機器,端口號幫咱們定位是機器上的哪個進程。RPC的出現使用得機器的進程通信透明化,這在分佈式系統中是很重要的。RPC調用架構中客戶端和服務端都和一個叫服務註冊中心的第三方通信。

相關文章
相關標籤/搜索