RPC和Socket


RPC和Socket的區別

rpc是通過什么實現啊?socket!  

RPC(Remote Procedure Call,遠程過程調用)是建立在Socket之上的,出於一種類比的願望,在一台機器上運行的主程序,可以調用另一台機器上准備好的子程序,就像LPC(本地過程調用).

    越底層,代碼越復雜、靈活性越高、效率越高;越上層,抽象封裝的越好、代碼越簡單、效率越差。Socket和RPC的區別再次說明了這點。不論是程序員在編寫基於C/S(客戶端服務器)的程序時,還是網絡工程師在處理RPC問題時,他們問的最多的就是RPC和Socket有什么區別和聯系? 
  RPC(Remote Procedure Call,遠程過程調用)是建立在Socket之上的,出於一種類比的願望,在一台機器上運行的主程序,可以調用另一台機器上准備好的子程序,就像LPC(本地過程調用).RPC帶來了開發C/S程序的簡單可靠的手段,它通過一種叫XDR的數據表達方法描述數據,程序員書寫偽代碼,然后由rpcgen程序翻譯為真正的可編譯的C語言源代碼,再編譯成真正的Client端和Server端程序。 
  RPC作為普遍的C/S開發方法,開發效率高效,可靠.但RPC方法的基本原則是--以模塊調用的簡單性忽略通訊的具體細節,以便程序員不用關心C/S之間的通訊協議,集中精力對付實現過程.這就決定了 RPC生成的通訊包不可能對每種應用都有最恰當的處理辦法,與Socket方法相比,傳輸相同的有效數據,RPC占用更多的網絡帶寬. 
  RPC是在Socket的基礎上實現的,它比socket需要更多的網絡和系統資源.另外,在對程序優化時,程序員雖然可以直接修改由rpcgen產生的令人費解的源程序,但對於追求程序設計高效率的RPC而言,獲得的簡單性則被大大削弱. 
RPC與是Socket的類比 

兩個老板手下各有一個負責接通MSN的秘書.這兩個秘書就是基於RPC協議建立的會話層通信.老板不需要知道怎么使用MSN,只要告訴秘書,秘書就會通過MSN與對方建立會話請求和響應.而基於Socket的通信,老板需要會使用MSN,這樣盡管老板需要事先培訓一下MSN的簡單使用常識,但若與對方通信時,無需經過秘書,效率更高.

  1. RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。

  2. 網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取后一種意思。通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。

 

關於RPC
你的題目是RPC框架,首先了解什么叫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服務器上的應用

 


(圖片來源:cs.rutgers.edu/~pxk/417

 

為什么RPC呢?就是無法在一個進程內,甚至一個計算機內通過本地調用的方式完成的需求,比如比如不同的系統間的通訊,甚至不同的組織間的通訊。由於計算能力需要橫向擴展,需要在多台機器組成的集群上部署應用,

RPC的協議有很多,比如最早的CORBA,Java RMI,Web Service的RPC風格,Hessian,Thrift,甚至Rest API。

關於Netty
而Netty框架不局限於RPC,更多的是作為一種網絡協議的實現框架,比如HTTP,由於RPC需要高效的網絡通信,就可能選擇以Netty作為基礎。除了網絡通信,RPC還需要有比較高效的序列化框架,以及一種尋址方式。如果是帶會話(狀態)的RPC調用,還需要有會話和狀態保持的功能。

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

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

(圖片來源:ChannelPipeline (The Netty Project API Reference (3.2.6.Final))

 

這樣每一層都有一個處理接口,都可以進行不同的操作,比如身份認證,加解密,日志,流控,將不同的處理實現像拼積木那樣插接起來就可以實現一個網絡協議了(快速開發)。每一層都有自己的實現,上層不需要關注面向網絡的操作(可維護)。Netty已經提供了很多實現。

(圖片來源:docs.jboss.org/netty/3.
當然Netty還有許多好處,比如對非阻塞IO(NIO)的支持,比如在鏈上傳遞時最大程度的減少buffer的copy(高性能)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM