RPC零基礎學習指南

分佈式基礎

  1. 爲什麼要使用RPC
    1. 分佈式的定義及解決問題的方式非常簡單,即業務服務器接收到用戶的計算請求後根據特定的算法,將計算的不同部分交由後臺的不同主機處理,待結果彙總後,由業務服務器反饋給客戶端。
    2. 在這個過程中,開發人員最爲關注的就是計算的分發調度方式,因爲這涉及到對網絡通訊和併發的控制。
    3. 如果有一種方式能夠將網絡通訊和併發控制對程序開發人員透明化,那麼將極度簡化此類應用的開發成本,RMI就是這樣一個範例
  2. 如何實現網絡通訊和併發控制的透明化?
    1. 將調用網絡的業務的具體實現方法,就像調用本地的方法一樣。
    2. 使用RPC完成
  3. RPC概念
    1. RPC(Remote Procedure Call Protocol):遠程過程調用:
    2. 兩臺服務器A、B,分別部署不同的應用a,b。當A服務器想要調用B服務器上應用b提供的函數或方法的時候,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義傳達調用的數據。
    3. 即在遠程端的機器上寫了一個程序,客戶端這邊是無法直接調用的,這個時候就出現了一個遠程服務調用的概念。
    4. RPC是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。RPC採用客戶端/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答覆信息,然後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,獲得進程結果,然後調用執行繼續進行。
  4. RPC需要解決的問題
    1. 通訊問題
    2. 尋址問題
    3. 序列化與反序列化
    4. 具體描述:
      • 通訊問題 :
        1. 主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裏傳輸。連接可以是按需連接,調用結束後就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
      • 尋址問題
        1. A服務器上的應用怎麼告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什麼,這樣才能完成調用。比如基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查找。如果是RMI調用的話,還需要一個RMI Registry來註冊服務的地址。
      • 序列化與反序列化 :
        1. 當A服務器上的應用發起遠程過程調用時,方法的參數需要通過底層的網絡協議如TCP傳遞到B服務器,由於網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化或編組,通過尋址和傳輸將序列化的二進制發送給B服務器。同理,B服務器接收參數要將參數反序列化。B服務器應用調用自己的方法處理後返回的結果也要序列化給A服務器,A服務器接收也要經過反序列化的過程。
  5. Java中的RPC分佈式規範:RMI
    1. 遠程方法調用(Remote Method Invocation);
    2. 能夠讓在某個Java虛擬機上的對象調用本地對象一樣調用另一個Java虛擬機的對象上的方法。
  6. RMI使用過程中需要的環境
    1. RMI是Java的一組擁護開發分佈式應用程序的API。
    2. RMI可以被看作是RPC的Java版本。
  7. RMI使用的一般流程:
    1. 客戶對象調用客戶端輔助對象上的方法。
    2. 客戶端輔助對象打包調用信息(變量,方法名),通過網絡發送給服務端輔助對象;
    3. 服務端輔助對象將客戶端輔助對象發送來的信息解包,找出真正被調用的方法以及該方法所在對象;
    4. 調用真正服務對象上的真正方法,並將結果返回給服務端輔助對象;
    5. 服務端輔助對象將結果打包,發送給客戶端輔助對象;
    6. 客戶端輔助對象將返回值解包,返回給客戶對象;
    7. 客戶端獲取返回值。
  8. 做到透明化:步驟2~6是完全透明的,開發人員無需關注任何的網絡數據傳輸處理。
  9. RMI使用範例
    1. 服務端
      • 定義的業務接口要繼承Remote
      • 在業務接口的方法聲明處要拋出RemoteException
      • 在業務邏輯實現的類中繼承UnicastRemoteObject
      • 在業務邏輯的實現類的構造方法上也要拋出RemoteException
      • 業務邏輯接收的參數和返回值:均需要可序列化(都需要通過網絡傳輸)
      • 指定對外服務的端口號LocateRegistry.createRegistry(9999)
      • 使用Naming綁定URL,指定服務的識別名稱Naming.bind("rmi://127.0.0.1:9999/Hello", biz);
    2. 客戶端
      • 接口和服務器端完全一致
      • 使用Naming尋址,找到提供服務的遠程業務方法Naming.lookup("rmi://127.0.0.1:9999/Hello");
        1. 返回與指定 name 關聯的遠程對象的引用(一個 stub)。
      • 調用該接口對象的具體方法。
  10. RMI的限制
    1. 爲了滿足計算任務調度的開發規範性和統一的異常處理,RMI對開發的流程規範比較嚴格,因此需要在業務代碼中侵入較多的RMI特定API。
    2. 客戶端參數傳遞即服務器端計算完成後的返回值傳遞使用了通用的序列化方式,這對於一些需要在完成分佈式調度時對數據進行自定義的安全加密流程的項目來說,無疑是一個不好的消息,另一方面,RMI採用了標準的Socket通訊,這對於系統建立在其他網絡通訊協議上的業務系統來說也是一個很大的障礙。
    3. RMI對於用非Java語言開發的應用系統的支持不足。
  11. 根據RMI的實現原理自行完成一套RPC模塊
    1. 原理分析:
      • RMI應用程序通常包括兩個獨立的程序:服務器程序和客戶端程序。典型的服務器應用程序將創建多個遠程對象,使這些遠程對象能夠被引用,然後等待客戶機調用這些遠程對象的方法。而典型的客戶端程序則從服務器中得到一個或多個遠程對象的引用,然後調用遠程對象的方法。RMI爲服務器和客戶端進行通信和信息傳遞提供了一種機制。
      • 在與遠程對象的通信過程中,RMI使用標準機制:stub和skeleton。遠程對象的stub擔當遠程對象的客戶本地代表或代理人角色。調用程序將調用本地stub的方法,而本地stub將負責執行對遠程對象的方法調用。在RMI中,遠程對象的stub與該遠程對象所實現的遠程接口集相同。調用stub的方法時將執行下列操作:
        1. 初始化與包含遠程對象的遠程虛擬機的連接;
        2. 對遠程虛擬機的參數進行編組(寫入並傳輸);
        3. 等待方法調用結果;
        4. 解編(讀取)返回值或返回的異常;
        5. 將值返回給調用程序。爲了向調用程序展示比較簡單的調用機制,stub將參數的序列化和網絡級通信等細節隱藏了起來。在遠程虛擬機中,每個遠程對象都可以有相應的skeleton(在JDK1.2以後的環境中便無需開發人員編寫具體Stub和skeleton,而是自動生成)。
    2. 使用Java的特徵:
      • Java網絡開發
      • Java反射機制
      • 重要的常用設計模式:Java動態代理
  12. 反射
    1. JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
    2. 對於任意一個對象,都能夠調用它的任意方法和屬性;
    3. 這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
  13. Java反射機制主要提供了以下功能
    1. 在運行時判斷任意一個對象所屬的類;
    2. 在運行時構造任意一個類的對象;
    3. 在運行時判斷任意一個類所具有的成員變量和方法;
    4. 在運行時調用任意一個對象的方法;
    5. 生成動態代理。
  14. 代理模式
    1. 代理模式是一種常用的設計模式,其目的就是爲其他對象提供一個代理以控制對某個真實對象的訪問。代理類負責爲委託類預處理消息,過濾消息並轉發消息,以及進行消息被委託類執行後的後續處理。通過使用代理,通常有兩個優點:
      • 可以隱藏委託類的實現;
      • 可以實現客戶與委託類間的解耦,在不修改委託類代碼的情況下能夠做一些額外的處理。
  15. 動態代理
    1. 可以動態地創建並代理,動態地處理對所代理方法的調用。
    2. 在動態代理上所做的所有調用都會被重定向到單一的調用處理器上,它的工作是揭示調用的類型並確定相應的策略。
  16. 示例代碼:
    1. 被代理的業務接口
    2. 創建動態代理的處理器
    3. 構建代理對象並執行
  17. 根據JDK動態代理實現機理的提示,我們可以自行利用多態實現無接口的動態代理,其結構如下:
  18. Java中通常使用什麼方式實現網絡和併發透明的便捷分佈式RPC調用?
  19. Java中通常使用動態代理模式在代理處理器中完成分佈式RPC調用的網絡連接、數據傳輸和併發控制處理,由於Java的反射機制和部分動態特性,使用動態代理後,這些操作可以完全對用戶(開發人員)透明,用戶可以方便的以本地方法調用的方式調用遠程端聲明實現的業務方法(計算過程在遠程端實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章