RPC 框架原理詳解

首先了解什麼叫RPC,爲何要RPC,RPC是指遠程過程調用?
也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。html

好比說,一個方法多是這樣定義的:
Employee getEmployeeByName(String fullName)
那麼:
首先,要解決通信的問題,主要是經過在客戶端和服務器之間創建TCP鏈接,遠程過程調用的全部交換的數據都在這個鏈接裏傳輸。鏈接能夠是按需鏈接,調用結束後就斷掉,也能夠是長鏈接,多個遠程過程調用共享同一個鏈接。json

第二,要解決尋址的問題,也就是說,A服務器上的應用怎麼告訴底層的RPC框架,如何鏈接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什麼,這樣才能完成調用。好比基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查找。若是是RMI調用的話,還須要一個RMI Registry來註冊服務的地址。服務器

第三,當A服務器上的應用發起遠程過程調用時,方法的參數須要經過底層的網絡協議如TCP傳遞到B服務器,因爲網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化(Serialize)或編組(marshal),經過尋址和傳輸將序列化的二進制發送給B服務器。網絡

第四,B服務器收到請求後,須要對參數進行反序列化(序列化的逆操做),恢復爲內存中的表達方式,而後找到對應的方法(尋址的一部分)進行本地調用,而後獲得返回值。框架

第五,返回值還要發送回服務器A上的應用,也要通過序列化的方式發送,服務器A接到後,再反序列化,恢復爲內存中的表達方式,交給A服務器上的應用。ide

45366c44f775abfd0ac3b43bccc1abc3_b

地址:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html ;函數

爲何RPC呢?
就是沒法在一個進程內,甚至一個計算機內經過本地調用的方式完成的需求,好比好比不一樣的系統間的通信,甚至不一樣的組織間的通信。因爲計算能力須要橫向擴展,須要在多臺機器組成的集羣上部署應用;性能

RPC的協議有不少,好比最先的CORBA,Java RMI,Web Service的RPC風格,Hessian,Thrift,甚至Rest API。ui

關於Netty
Netty框架不侷限於RPC,更多的是做爲一種網絡協議的實現框架,好比HTTP,因爲RPC須要高效的網絡通訊,就可能選擇以Netty做爲基礎。除了網絡通訊,RPC還須要有比較高效的序列化框架,以及一種尋址方式。若是是帶會話(狀態)的RPC調用,還須要有會話和狀態保持的功能。編碼

大致上來講,Netty就是提供一種事件驅動的,責任鏈式(也能夠說是流水線)的網絡協議實現方式。網絡協議包含不少層次,不少部分組成,如傳輸層協議,編碼解碼,壓縮解壓,身份認證,加密解密,請求的處理邏輯,怎麼可以更好的複用,擴展,業界通用的方法就是責任鏈,

一個請求應答網絡交互一般包含兩條鏈,一條鏈(Upstream)是從傳輸層,通過一系列步驟,如身份認證,解密,日誌,流控,最後到達業務層,一條鏈(DownStream)是業務層返回後,又通過一系列步驟,如加密等,又回到傳輸層。

6661f6c06aba782ff5ff61b70f842b64_b

這樣每一層都有一個處理接口,均可以進行不一樣的操做,好比身份認證,加解密,日誌,流控,將不一樣的處理實現像拼積木那樣插接起來就能夠實現一個網絡協議了(快速開發)。每一層都有本身的實現,上層不須要關注面向網絡的操做(可維護)。Netty已經提供了不少實現。

7decee9dca245621988ebb0fea7d2be3_b

固然Netty還有許多好處,好比對非阻塞IO(NIO)的支持,好比在鏈上傳遞時最大程度的減小buffer的copy(高性能)。

地址:http://docs.jboss.org/netty/3.1/guide/html/architecture.html  ;

1. Netty只是網絡通訊框架,目的是讓你用最少的代碼構建出足夠支撐網絡通訊的功能。2.完成RPC 須要兩個協議: 對象序列化協議 和 調用控制協議常見例子舉例:1.zeroC ICE,擁有本身的網絡通訊框架 + ICE 調用控制協議和對象序列化協議,同時也涵蓋了服務組件的抽象部署等功能。2.thrift,有本身的網絡通訊框架+thrift 對象序列化協議+thrift 調用控制協議3.probuff,只是 對象序列化協議4.XMLRPC ,jsonRPC,常見的語境是利用HTTP協議做爲調用控制協議,XML 和 JSON 做爲對象序列化以後的格式。5.其餘的大概也差很少了。

相關文章
相關標籤/搜索