RMI

RMI
目錄·RMI相關概述
·RMI(遠程方法調用)的組成
·RMI(遠程方法調用)的原理
·RMI與CORBA的關係


RMI相關概述

  RMI是Java的一組擁護開發分佈式應用程序的API。RMI使用Java語言接口定義了遠程對象,它集合了Java序列化和Java遠程方法協議(Java Remote Method Protocol)。簡單地說,這樣使原先的程序在同一操作系統的方法調用,變成了不同操作系統之間程序的方法調用,由於J2EE是分佈式程序平臺,它一RMI機制實現程序組件在不同操作系統之間的通信。比如,一個EJB可以通過RMI調用Web上另一臺機器上的EJB遠程方法。

  RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.1中實現的,它大大增強了Java開發分佈式應用的能力。Java作爲一種風靡一時的網絡開發語言,其巨大的威力就體現在它強大的開發分佈式網絡應用的能力上,而RMI就是開發百分之百純Java的網絡分佈式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地應用於分佈式對象系統。而Java RMI 則支持存儲於不同地址空間的程序級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。

  RMI目前使用Java遠程消息交換協議JRMP(Java Remote Messaging Protocol)進行通信。JRMP是專爲Java的遠程對象制定的協議。因此,Java RMI具有Java的“Write Once,Run Anywhere”的優點,是分佈式應用系統的百分之百純Java解決方案。用Java RMI開發的應用系統可以部署在任何支持JRE(Java Run Environment Java,運行環境)的平臺上。但由於JRMP是專爲Java對象制定的,因此,RMI對於用非Java語言開發的應用系統的支持不足。不能與用非Java語言書寫的對象進行通信。

  Java Remote Method Invocation ( RMI -- Java遠程方法調用)允許您使用Java編寫分佈式對象。本文將介紹RMI的優點以及如何將其連接到現有的和原有的系統中,以及與用Java 編寫的組件的連接。

  RMI爲採用Java對象的分佈式計算提供了簡單而直接的途徑。這些對象可以是新的Java對象,也可以是圍繞現有API的簡單的Java包裝程序。Java體現了“編寫一次就能在任何地方運行的模式。而RMI可將Java模式進行擴展,使之可在任何地方運行”。

  因爲RMI是以Java爲核心的,所以,它將Java的安全性和可移植性等強大功能帶給了分佈式計算。您可將代理和梢?務邏輯等屬性移動到網絡中最合適的地方。如果您要擴展Java在系統中的使用,RMI將使您充分利用其強大功能。

  RMI可利用標準Java本機方法接口JNI與現有的和原有的系統相連接。RMI還可利用標準JDBC包與現有的關係數據庫連接。RMI/JNI和RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有服務器進行通信,而且在您需要時可擴展Java在這些服務器上的使用。RMI可幫助您在擴展使用時充分利用Java的強大功能。
  
RMI(遠程方法調用)的組成

  一個正常工作的RMI系統由下面幾個部分組成:

  ·遠程服務的接口定義

  ·遠程服務接口的具體實現

  ·樁(Stub)和框架(Skeleton)文件

  ·一個運行遠程服務的服務器

  ·一個RMI命名服務,它允許客戶端去發現這個遠程服務

  ·類文件的提供者(一個HTTP或者FTP服務器)

  ·一個需要這個遠程服務的客戶端程序
  
RMI(遠程方法調用)的原理

  RMI系統結構,在客戶端和服務器端都有幾層結構。

  --------- ----------
  | 客戶 | | 服務器|
  ---------- ----------
  | |
  ------------- ----------
  | 佔位程序 | | 骨幹網 |
  -------------- -----------
  | |
  ------------------------------------
  | 遠 程 引 用 層 |
  ------------------------------------
  | |
  ------------------------------------
  | 傳 輸 層 |
  ------------------------------------

  方法調用從客戶對象經佔位程序(Stub)、遠程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然後再次經傳 輸層,向上穿過遠程調用層和骨幹網(Skeleton),到達服務器對象。 佔位程序扮演着遠程服務器對象的代理的角色,使該對象可被客戶激活。 遠程引用層處理語義、管理單一或多重對象的通信,決定調用是應發往一個服務器還是多個。傳輸層管理實際的連接,並且追追蹤可以接受方法調用的遠程對象。服務器端的骨幹網完成對服務器對象實際的方法調用,並獲取返回值。返回值向下經遠程引用層、服務器端的傳輸層傳遞迴客戶端,再向上經傳輸層和遠程調用層返回。最後,佔位程序獲得返回值。

  要完成以上步驟需要有以下幾個步驟:

  1、生成一個遠程接口

  2、實現遠程對象(服務器端程序)

  3、生成佔位程序和骨幹網(服務器端程序)

  4、編寫服務器程序

  5、編寫客戶程序

  6、註冊遠程對象

  7、啓動遠程對象

  具體實現如下:

  1、生成一個遠程接口

  package c15.ptime;

  import java.rmi.*;

  public interface PerfectTimeI extends Remote {

  long getPerfectTime() throws RemoteException;

  }

  2、實現遠程對象(服務器端程序)

  package c15.ptime;

  import java.rmi.*;

  import java.rmi.server.*;

  import java.rmi.registry.*;

  import java.net.*;

  public class PerfectTime

  extends UnicastRemoteObject

  implements PerfectTimeI {

  public long getPerfectTime()

  throws RemoteException {

  return System.currentTimeMillis();

  }

  public PerfectTime() throws RemoteException {

  super();

  }

  public static void main(String[] args) {

  System.setSecurityManager(

  new RMISecurityManager());

  try {

  PerfectTime pt = new PerfectTime();

  Naming.rebind(

  "//zhouty:2005/PerfectTime" , pt);

  System.out.println("Ready to do time");

  } catch(Exception e) {

  e.printStackTrace();

  }

  }

  }

  4、編譯遠程對象(服務器端程序)

  javac -classpath . -d . PerfectTime.java

  5、生成根和幹(佔位程序和骨幹程序)

  rmic -classpath . -d . c15.ptime.PerfectTime

  6、註冊遠程對象

  start rmiregistry 2005

  7、啓動服務器端程序

  java -Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per

  fectTime

  8、編寫客戶端程序

  package c15.ptime;

  import java.rmi.*;

  import java.rmi.registry.*;

  public class DisplayPerfectTime {

  public static void main(String[] args) {

  System.setSecurityManager(

  new RMISecurityManager());

  try {

  PerfectTimeI t =

  (PerfectTimeI)Naming.lookup(

  "192.168.0.171:2005/PerfectTime");

  for(int i = 0 ; i < 10; i++)

  System.out.println("Perfect time =" +

  t.getPerfectTime());

  } catch(Exception e) {

  e.printStackTrace();

  }

  }

  }

  9、編譯客端程序

  javac -classpath . -d . DisplayPerfectTime.java

  10、修改JVM的配置文件 (客戶機和服務器的都需要經過修改)

  %JRE_HOME%/policytool.exe

  11、啓動客戶程序

  java -classpath . c15.ptime.DisplayPerfectTime

  12、返回結果

  Perfect time =967274884390

  Perfect time =967274884450

  Perfect time =967274884450

  Perfect time =967274884450

  Perfect time =967274884500

  Perfect time =967274884500

  Perfect time =967274884560

  Perfect time =967274884610

  Perfect time =967274884610

  Perfect time =967274884610
  RMI(遠程方法調用)的優點
  從最基本的角度看,RMI是Java的遠程過程調用(RPC)機制。與傳統的RPC系統相比,RMI具有若干優點,因爲它是Java面向對象方法的一部分。傳統的RPC系統採用中性語言,所以是最普通的系統--它們不能提供所有可能的目標平臺所具有的功能。

  RMI以Java爲核心,可與採用本機方法與現有系統相連接。這就是說,RMI可採用自然、直接和功能全面的方式爲您提供分佈式計算技術,而這種技術可幫助您以不斷遞增和無縫的方式爲整個系統添加Java功能。

  RMI的主要優點如下:

  面向對象:RMI可將完整的對象作爲參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,您可以將類似Java哈希表這樣的複雜類型作爲一個參數進行傳遞。而在目前的RPC系統中,您只能依靠客戶機將此類對象分解成基本數據類型,然後傳遞這些數據類型,最後在服務器端重新創建哈希表。RMI則不需額外的客戶程序代碼(將對象分解成基本數據類型),直接跨網傳遞對象。

       可移動屬性:RMI可將屬性(類實現程序)從客戶機移動到服務器,或者從服務器移到客戶機。例如,您可以定義一個檢查僱員開支報告的接口,以便察看僱員是否遵守了公司目前實行的政策。在開支報告創建後,客戶機就會從服務器端獲得實現該接口的對象。如果政策發生變化,服務器端就會開始返回使用了新政策的該接口的另一個實現程序。您不必在用戶系統上安裝任何新的軟件就能在客戶端檢查限制條件--從而向用戶提供爍快的反饋,並降低服務器的工作量。這樣就能具備最大的靈活性,因爲政策改變時只需要您編寫一個新的Java類,並將其在服務器主機上安裝一次即可。


  設計方式:對象傳遞功能使您可以在分佈式計算中充分利用面向對象技術的強大功能,如二層和三層結構系統。如果您能夠傳遞屬性,那麼您就可以在您的解決方案中使用面向對象的設計方式。所有面向對象的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的對象--包括實現和類型--就會失去設計方式上所提供的優點。

  安  全:RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。RMI使用專門爲保護系統免遭惡意小應用程序侵害而設計的安全管理程序,可保護您的系統和網絡免遭潛在的惡意下載程序的破壞。在情況嚴重時,服務器可拒絕下載任何執行程序。

  便於編寫和使用:RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工作變得輕鬆、簡單。遠程接口實際上就是Java接口。服務程序大約用三行指令宣佈本身是服務程序,其它方面則與任何其它Java對象類似。這種簡單方法便於快速編寫完整的分佈式對象系統的服務程序,並快速地製做軟件的原型和早期版本,以便於進行測試和評估。因爲RMI程序編寫簡單,所以維護也簡單。

  可連接現有/原有的系統:RMI可通過Java的本機方法接口JNI與現有系統進行進行交互。利用RMI和JNI,您就能用Java語言編寫客戶端程序,還能使用現有的服務器端程序。在使用RMI/JNI與現有服務器連接時,您可以有選擇地用Java重新編寫服務程序的任何部分,並使新的程序充分發揮Java的功能。類似地,RMI可利用JDBC、在不修改使用數據庫的現有非Java源代碼的前提下與現有關係數據庫進行交互。

  編寫一次,到處運行:RMI是Java“編寫一次,到處運行 ”方法的一部分。任何基於RMI的系統均可100%地移植到任何Java虛擬機上,RMI/JDBC系統也不例外。如果使用RMI/JNI與現有系統進行交互工作,則採用JNI編寫的代碼可與任何Java虛擬機進行編譯、運行。

  分佈式垃圾收集:RMI採用其分佈式垃圾收集功能收集不再被網絡中任何客戶程序所引用的遠程服務對象。與Java 虛擬機內部的垃圾收集類似,分佈式垃圾收集功能允許用戶根據自己的需要定義服務器對象,並且明確這些對象在不再被客戶機引用時會被刪除。

  並行計算:RMI採用多線程處理方法,可使您的服務器利用這些Java線程更好地並行處理客戶端的請求。Java分佈式計算解決方案:RMI從JDK 1.1開始就是Java平臺的核心部分,因此,它存在於任何一臺1.1 Java虛擬機中。所有RMI系統均採用相同的公開協議,所以,所有Java 系統均可直接相互對話,而不必事先對協議進行轉換。
  
RMI與CORBA的關係

  RMI 和 CORBA 常被視爲相互競爭的技術,因爲兩者都提供對遠程分佈式對象的透明訪問。但這兩種技術實際上是相互補充的,一者的長處正好可以彌補另一者的短處。RMI 和 CORBA 的結合產生了 RMI-IIOP,RMI-IIOP 是企業服務器端 Java 開發的基礎。

  1997 年,IBM 和 Sun Microsystems啓動了一項旨在促進 Java 作爲企業開發技術的發展的合作計劃。兩家公司特別着力於如何將 Java 用作服務器端語言,生成可以結合進現有體系結構的企業級代碼。所需要的就是一種遠程傳輸技術,它兼有 Java 的 RMI(Remote Method Invocation,遠程方法調用)較少的資源佔用量和更成熟的 CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結構)技術的健壯性。出於這一需要,RMI-IIOP問世了,它幫助將 Java 語言推向了目前服務器端企業開發的主流語言的領先地位。   
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章