1. 程式人生 > >dubbo基於tcp協議的RPC框架

dubbo基於tcp協議的RPC框架

什麼是 RPC 框架

誰能用通俗的語言解釋一下什麼是 RPC 框架? - 遠端過程呼叫協議RPC(Remote Procedure Call Protocol)

首先了解什麼叫RPC,為什麼要RPC,RPC是指遠端過程呼叫,也就是說兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。比如說,一個方法可能是這樣定義的: 


java實現簡單rpc通訊的技術:

(1) JDK動態代理

(2) Socket通訊(BIO方式)

(3) 反射、註解

(4) Java序列化(注意所有需要序列化物件必須實現Serializable介面)


 

Employee getEmployeeByName(String fullName)那麼:

  1. 首先,要解決通訊的問題,主要是通過在客戶端和伺服器之間建立TCP連線,遠端過程呼叫的所有交換的資料都在這個連線裡傳輸。連線可以是按需連線,呼叫結束後就斷掉,也可以是長連線,多個遠端過程呼叫共享同一個連線。

  2. 第二,要解決定址的問題,也就是說,A伺服器上的應用怎麼告訴底層的RPC框架,如何連線到B伺服器(如主機或IP地址)以及特定的埠,方法的名稱名稱是什麼,這樣才能完成呼叫。比如基於Web服務協議棧的RPC,就要提供一個endpoint 
    URI,或者是從UDDI服務上查詢。如果是RMI呼叫的話,還需要一個RMI Registry來註冊服務的地址。

  3. 第三,當A伺服器上的應用發起遠端過程呼叫時,方法的引數需要通過底層的網路協議如TCP傳遞到B伺服器,由於網路協議是基於二進位制的,記憶體中的引數的值要序列化成二進位制的形式,也就是序列化(Serialize)或編組(marshal),通過定址和傳輸將序列化的二進位制傳送給B伺服器。

  4. 第四,B伺服器收到請求後,需要對引數進行反序列化(序列化的逆操作),恢復為記憶體中的表達方式,然後找到對應的方法(定址的一部分)進行本地呼叫,然後得到返回值。

  5. 第五,返回值還要傳送回伺服器A上的應用,也要經過序列化的方式傳送,伺服器A接到後,再反序列化,恢復為記憶體中的表達方式,交給A伺服器上的應用

    這裡寫圖片描述 
    為什麼RPC呢?就是無法在一個程序內,甚至一個計算機內通過本地呼叫的方式完成的需求,比如比如不同的系統間的通訊,甚至不同的組織間的通訊。由於計算能力需要橫向擴充套件,需要在多臺機器組成的叢集上部署應用,RPC的協議有很多,比如最早的CORBA,Java RMI,Web Service的RPC風格,Hessian,Thrift,甚至Rest API。關於Netty而Netty框架不侷限於RPC,更多的是作為一種網路協議的實現框架,比如HTTP,由於RPC需要高效的網路通訊,就可能選擇以Netty作為基礎。除了網路通訊,RPC還需要有比較高效的序列化框架,以及一種定址方式。如果是帶會話(狀態)的RPC呼叫,還需要有會話和狀態保持的功能。大體上來說,Netty就是提供一種事件驅動的,責任鏈式(也可以說是流水線)的網路協議實現方式。網路協議包含很多層次,很多部分組成,如傳輸層協議,編碼解碼,壓縮解壓,身份認證,加密解密,請求的處理邏輯,怎麼能夠更好的複用,擴充套件,業界通用的方法就是責任鏈,一個請求應答網路互動通常包含兩條鏈,一條鏈(Upstream)是從傳輸層,經過一系列步驟,如身份認證,解密,日誌,流控,最後到達業務層,一條鏈(DownStream)是業務層返回後,又經過一系列步驟,如加密等,又回到傳輸層。

轉截地址:

https://blog.csdn.net/b1303110335/article/details/79557292