用RMI開發基於Java的企業分佈式應用

摘 要 由於Java具有跨平臺、代碼可移植性、安全高效等廣泛而強大的功能,因而在開發網絡分佈式應用的時候,可以用它自身的機制實現分佈式計算,一種基於Java的遠程方法調用(RMI)爲我們開發企業分佈式應用提供了行之有效的解決方案。

  關鍵詞 Java RMI 企業分佈式應用

  概述

  隨着電力企業信息化建設的不斷深入和發展,企業內部和企業與企業之間對信息、對數據的交換量大大增加,這些信息與數據越來越需要在不同的計算機網絡間傳送和交流。同時,由於各單位、各部門之間的現存的計算機網絡硬件設備與操作系統千差萬別,應用水平也參差不齊,因此,開發出跨平臺、可移植、高效安全的網絡分佈式應用來服務於電力企業,就顯得尤爲重要。

  在當今的編程術語裏,分佈式計算已經成爲很常見的詞,它將企業的業務數據和程序分佈在網絡的不同物理位置上,通過調動網絡上多臺計算機的處理能力,發揮遠程調用數據的功能。

  遠程方法調用(Remote Method Invocation ,RMI),可以在不同的Java虛擬機(JVM)之間實現對象與對象的通信。JVM可以位於相同或不同計算機上,在多個JVM中,一個JVM可以調用存儲在其它JVM的對象的方法。

  本文主要介紹RMI的特點,分析應用RMI進行企業分佈式計算的原理,以及利用RMI實現基於Java的企業分佈式應用的具體步驟。

  遠程方法調用(RMI)的特點

  1、TCP編程的缺點

  由於Java編程語言設計之初就是面向對象和支持網絡的,因此,基於對象的RMI機制已經內置在Java平臺中。

  我們經常會在網絡開發中使用TCP/IP編程,這樣,自然而然地就會涉及到Socket(套接字)編程。但是,使用Socket編程需要大量重複編碼,在複雜分佈式操作時顯得非常麻煩,而且易於出錯。因此,如何快速、高效、安全、可擴展地進行網絡分佈式計算,是開發者們一貫追求和倡導的主題。直到RMI的出現,這種繁雜、低效的開發情況纔有很大改觀。

  2、RMI編程的特點

  當我們利用對象序列化在網絡上分配對象時,RMI提供了非Java平臺無法匹敵的獨特而強大的分佈式計算模型,RMI主要有以下特點:

   客戶機可以向本地方法一樣調用遠程服務器上的方法;

   可以根據接口指定客戶機/服務器編程合約;

   可以從服務器對象缺省二進制類文件,自動生成調動/反調動代碼;

   將Java編程模型擴展到機器邊界(和Java虛擬機(JVM)邊界之外),不需要任何特殊語法;

   還可以和一個遠程方法調用中的數據同時傳輸行爲(代碼)。

  儘管RMI不是唯一的企業級遠程對象訪問方案,但它卻是最容易實現的。

  3、RMI與CORBA

  作爲分佈式應用程序框架的規範,COBRA首當其衝,它是由對象管理組織(OMG)開發的。與CORBA不同的是,CORBA能夠利用不同編程語言(例如C/C++、Basic等)開發實現分佈式應用,而RMI是一種純Java解決方案。在RMI中,程序的所有部分都由Java語言編寫,這樣,開發出來的程序完全符合Java規範,便於實現跨平臺訪問、擴展和移植。按照筆者所在西北電力建設集團公司的情況看,服務器操作系統主要有Linux和Windows2000 Server,分別存在於公司和部門當中,它們是不同的系統平臺;同時,公司下屬各個工程項目部又距離很遠,近的幾十公里,遠則達到上千公里甚至位於國外,因此跨平臺和遠程訪問這兩大功能在開發企業應用系統時就必須考慮,而RMI恰恰能夠用它的自身特點來滿足編程需要。

  RMI基本體系結構簡介

  RMI通過TCP/IP在內部使用Socket,象其名稱暗示的那樣,它能夠幫助我們查找並執行遠程對象的方法。RMI的目的是讓位於不同JVM中的對象,在外觀及行爲上都像是本地的對象。

  通常,我們把調用這種遠程對象的JVM,稱爲客戶機;而把包括這種遠程對象的JVM,稱爲服務器。

  儘管對一個遠程對象的引用和獲得對本地對象的引用有所不同,但我們可以把遠程對象像本地對象一樣使用。應用程序並不知道一個對象是遠程的還是本地的。實際上,遠程對象上被調用的方法與本地對象上調用的方法,具有相同的語法結構。

  作爲RMI的底層(會包含複雜的Socket操作),它會自動截獲方法調用,找到遠程對象,然後處理遠程請求。筆者認爲,RMI設計的重要之處,就在於不但在設計上實現了遠程訪問功能,而且實現了設計的透明性。

  RMI的基本體系結構,概括起來說,由三個抽象層組成:

  1、存根/框架層(Stubs/Skeletons Layer)

  RMI爲我們引入了兩種特殊類型的對象,稱爲存根(Stub)和框架(Skeleton),它們組成了RMI的第一層。

  在遠程通信的時候,要利用TCP/IP協議,做很多底層數據的打包傳輸。運用Java技術,我們先要把數據或者對象轉換成字節流(byte stream),便於網絡傳輸,這個過程叫彙集(marshaling);當收到遠程傳來的字節流後,我們要把流信息轉換成對象或者數據,這個過程叫解讀(unmarshaling),它與彙集剛好相反。

  Stub和Skeleton層位於實際應用程序之下,建立在Proxy(代理)設計方案之上。Stub類的作用是遠程服務器實現的代理的角色,Stub是客戶方對象;Skeleton類用於幫助對象通過RMI鏈接與Stub通信,它從鏈路中讀取方法調用的參數,向遠程服務實現對象進行調用,接受返回值,然後再把返回值寫回到Stub。

  2、遠程引用層(Remote Reference Layer)

  遠程引用層定義和支持着RMI連接的調用語義(semantics)。

  RMI進行遠程訪問要用到JRMP(Java Remote Method Protocol,即Java遠程方法協議),這一層提供專用於JRMP的RemoteRef對象,它位於java.rmi.server包內,代表着遠程對象的一個句柄。RemoteRef使用遠程引用來執行遠程對象的一個遠程方法調用。

  3、傳輸層(Transport Layer)

  傳輸層在JVM之間建立基於流的網絡連接,並且負責設置和管理這些連接。這時候,RMI使用一種線級(wire-level)協議進行基於TCP/IP的連接,該協議就是Java遠程方法協議(JRMP,即Java Remote Method Protocol)。

  在JDK版本1.2開始,JRMP不再需要Skeleton,而是使用reflection來建立與遠程服務的連接。爲了生成Stub,我們須用rmic。
當前的RMI實現中,傳輸層建立在TCP/IP基礎上,設計用於在客戶和服務器之間建立一條連接(即使聯網有障礙)。



  開發的基本步驟

  我們使用RMI編寫Client/Server模式(客戶/服務器)應用程序,包括6個基本步驟:

  1) 定義遠程接口

  2) 實現遠程接口

  3) 準備遠程調用的服務器對象

  4) 生成殘根Stub(客戶代理)和框架Skeleton(服務器實體)

  5) 用rmiregistry找到遠程對象

  6) 運行測試RMI分佈式應用

  開發企業信息發佈系統實例

  在開發RMI進行分佈式訪問之前,需要將各項功能模塊化,即把實際應用抽象成符合Java規範的類和接口模型,使這些類和接口之間互相協作,能實現各自獨立的功能,最後,可以把它們組合成統一的網絡分佈式系統。

  現在,我們就以開發公司信息發佈系統爲例,把主模塊(主要的類文件)的名稱暫定爲InfoDistributeService(信息發佈服務),爲了保持應用開發的數據一致性和清晰度,接下來涉及的其它模塊命名也將以這個模塊命名爲基準。

  1、定義遠程接口

  Java RMI運行環境要求任何可以遠程調用的方法必須放在遠程接口中。

  該遠程接口用來擴展java.rmi.Remote接口,在Java API中,可以發現它沒有任何方法,只是個標誌性接口,這樣,可以讓Java運行環境(JRE)認識每個接口的特殊屬性,以便能夠遠程訪問。

  因此,按照信息發佈服務的命名(InfoDistributeService),首先須將InfoDistributeRemote定義爲遠程接口,同時僅放入一個供測試的方法 getRemoteInfo()來實現編碼,將所有模塊至於新建的enterprise.distribute包中,代碼如下:// -----------InfoDistributeRemote.java-------------------
package enterprise. distribute;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface InfoDistributeRemote extends Remote{
public String getRemoteInfo() throws RemoteException;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章