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)那麼:
-
首先,要解決通訊的問題,主要是通過在客戶端和伺服器之間建立TCP連線,遠端過程呼叫的所有交換的資料都在這個連線裡傳輸。連線可以是按需連線,呼叫結束後就斷掉,也可以是長連線,多個遠端過程呼叫共享同一個連線。
-
第二,要解決定址的問題,也就是說,A伺服器上的應用怎麼告訴底層的RPC框架,如何連線到B伺服器(如主機或IP地址)以及特定的埠,方法的名稱名稱是什麼,這樣才能完成呼叫。比如基於Web服務協議棧的RPC,就要提供一個endpoint
URI,或者是從UDDI服務上查詢。如果是RMI呼叫的話,還需要一個RMI Registry來註冊服務的地址。 -
第三,當A伺服器上的應用發起遠端過程呼叫時,方法的引數需要通過底層的網路協議如TCP傳遞到B伺服器,由於網路協議是基於二進位制的,記憶體中的引數的值要序列化成二進位制的形式,也就是序列化(Serialize)或編組(marshal),通過定址和傳輸將序列化的二進位制傳送給B伺服器。
-
第四,B伺服器收到請求後,需要對引數進行反序列化(序列化的逆操作),恢復為記憶體中的表達方式,然後找到對應的方法(定址的一部分)進行本地呼叫,然後得到返回值。
-
第五,返回值還要傳送回伺服器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)是業務層返回後,又經過一系列步驟,如加密等,又回到傳輸層。
轉截地址: