rpc

RPC簡介

RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。

比如說,一個方法可能是這樣定義的

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就是提供一種事件驅動的,責任鏈式(也可以說是流水線)的網絡協議實現方式。網絡協議包含很多層次,很多部分組成,如傳輸層協議,編碼解碼,壓縮解壓,身份認證,加密解密,請求的處理邏輯,怎麼能夠更好的複用,擴展,業界通用的方法就是責任鏈,<br><br>一個請求應答網絡交互通常包含兩條鏈,一條鏈(Upstream)是從傳輸層,經過一系列步驟,如身份認證,解密,日誌,流控,最後到達業務層,一條鏈(DownStream)是業務層返回後,又經過一系列步驟,如加密等,又回到傳輸層。這樣每一層都有一個處理接口,都可以進行不同的操作,比如身份認證,加解密,日誌,流控,將不同的處理實現像拼積木那樣插接起來就可以實現一個網絡協議了(快速開發)。每一層都有自己的實現,上層不需要關注面向網絡的操作(可維護)。Netty已經提供了很多實現。當然Netty還有許多好處,比如對非阻塞IO(NIO)的支持,比如在鏈上傳遞時最大程度的減少buffer的copy(高性能)。

Netty只是網絡通信框架,把Java Socket的API又封裝了一次,使得你可以用最少的代碼來完成網絡通信這一任務。

我們可以推斷演進一下
====
1. A B 兩個進程之間需要進行數據交換。
2.於是我們想出來在某個內存區域劃出一個空間,然後向該空間中寫入和讀取數據。(共享文件也可以)(常見的socket就是這一共享內存的抽象,只是現在大多指網絡通路)
3.A B 通信完成。
====
4.A B需要完成更復雜的交互
5.於是我們指定一個協議,A B 根據該協議對數據的進行編碼解碼,根據協議內容做出決策。
====
6.發現協議過於複雜(比如 編號1代表調用 a函數,編號2代表b函數)
7.試圖優化協議,將函數參數和調用的函數名稱作爲協議的一部分,函數返回值類似
8.RPC達成
=====
9.表現出來的特性就是,object invok(parameter),就代表了,序列化 parameter 對象到中間格式,利用遠程服務器的 invok 函數進行處理 ,同時將返回的數據解碼生成 object對象。

======總結=====

RPC 在整個過程中,體現了逐層抽象,將複雜的協議編解碼和數據傳輸封裝到了一個函數中。

======缺點=====
單一 RPC 無法實現 push,即推送服務。
理由是,RPC 是client 調用 server獲取數據,是一個完整的過程,實現不了server調用client。
解決方案:讓client 既可以調用server上的RPC服務,反之client本身也成爲一個RPC服務讓Server來調用。


1. Netty只是網絡通信框架,目的是讓你用最少的代碼構建出足夠支撐網絡通信的功能。

2.完成RPC 需要兩個協議: 對象序列化協議 和 調用控制協議

常見例子舉例:

1.zeroC ICE,擁有自己的網絡通信框架 + ICE 調用控制協議和對象序列化協議,同時也涵蓋了服務組件的抽象部署等功能。

2.thrift,有自己的網絡通信框架+thrift 對象序列化協議+thrift 調用控制協議

3.probuff,只是 對象序列化協議

4.XMLRPC ,jsonRPC,常見的語境是利用HTTP協議作爲調用控制協議,XML 和 JSON 作爲對象序列化之後的格式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章