對象中間件之Java RMI
作者:orangelizq 2007-11-30
一、中間件簡介
1.1 中間件的定義
中間件(middleware)是基礎軟件的一大類,屬于可復用的軟件范疇。中間件在操作系統軟件,網絡和數據庫之上,應用軟件之下,總的作用是為處于自己上層的應用軟件提供運行于開發的環境,幫助用戶靈活、高效的開發和集成復雜的應用軟件。[1]
IDC對中間件的定義為:中間件是一種獨立的系統軟件或服務程序,分布式應用軟件借助這種軟件在不同的技術之間共享資源,中間件定位于客戶機服務器的操作系統之上,管理計算機資源和網絡通信。
因而中間件是指一類軟件,是基于分布式處理的軟件,最突出的特點是其網絡通信功能。也可認為中間件是位于平臺和應用之間的通用服務,這些服務具有標準的程序接口和協議。針對不同的操作系統和硬件平臺,可以有符合接口和協議的多種實現。

圖1.1 中間件
1.2 中間件的分類
按照IDC的分類方法,中間件可分為六類:[1]
1) 終端仿真/屏幕轉換
2) 數據訪問中間件(UDA)
3) 遠程過程調用中間件(RPC)
4) 消息中間件(MOM)
5) 交易中間件(TPM)
6) 對象中間件
然而在實際應用中,一般將中間件分為兩大類:一類是底層中間件,用于支撐單個應用系統或解決一類問題,包括交易中間件、應用服務器、消息中間件、數據訪問中間件等;另一類是高層中間件,更多的用于系統整合,包括企業應用集成中間件、工作流中間件、門戶中間件等,他們通常會與多個應用系統打交道,在系統中層次較高,并大多基于前一類的底層中間件運行。
1.2.1 終端仿真/屏幕轉換
此類中間件用于實現客戶機圖形用戶接口與已有的字符接口方式的服務器應用程序之間的互操作,應用與早期的大型機系統,現在已很少使用。
1.2.2 數據訪問中間件
此類中間件是為了建立數據應用資源互操作的模式,對異構環境下的數據庫或文件系統實現聯接。
1.2.3 遠程過程調用中間件
此類中間件可以使開發人員在需要時調用位于遠端服務器上的過程,屏蔽了在調用過程中的通信細節。一個應用程序使用RPC來遠程執行一個位于不同地址空間里的過程,在效果上看和執行本地調用相同。
1.2.4 交易中間件
此類中間件是專門針對聯機交易系統而設計的。聯機交易系統需要處理大量并發進程,處理并發涉及到操作系統,文件系統,編程語言,數據通信,數據庫系統,系統管理,應用軟件等。而交易中間件根據分布式交易處理的標準及參考模型,對資源管理,交易管理和應用進行了實現,從而使得基于交易中間件開發應用程序更為簡單。交易中間件基本上只適用于聯機交易系統,是一種較為專用的中間件。
1.2.5 消息中間件
此類中間件是指利用高效可靠的消息傳遞機制進行平臺無關的數據交流,并基于數據通信來進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下擴展進程間的通信。
消息中間件可以即支持同步方式,又支持異步方式。異步中間件比同步中間件具有更強的容錯性,在系統故障時可以保證消息的正常傳輸。異步中間件技術又分為兩類:廣播方式和發布/訂閱方式。由于發布/訂閱方式可以指定哪種類型的用戶可以接受哪種類型的消息,更加有針對性,事實上已成為異步中間件的非正式標準。目前主流的消息中間件產品有IBM的MQSeries,BEA的MessageQ和Sun的JMS等。
1.2.6 對象中間件
傳統的對象技術通過封裝、繼承及多態提供了良好的代碼重用功能。但這些對象只存在與一個程序中,外界并不知道它們的存在,也無法訪問它們。對象中間件提供了一個標準的構建框架,能使不同廠家的軟件通過不同的地址空間,網絡和操作系統實現交互訪問。對象中間件的目標是為軟件用戶及開發者提供一種應用級的即插即用的互操作性。目前主流的對象中間件有OMG的CORBA,Microsoft 的COM以及IBM的SOM,Sun的RMI等。
1.3 中間件的特點
一般來講,中間件具有以下一些特點:滿足大量應用的需求,運行于多種硬件和操作系統平臺,支持分布式計算,支持標準接口和協議。開發人員通過調用中間件提供的大量API,實現異構環境的通信,從而屏蔽異構系統中復雜的操作系統和網絡協議。
由于標準接口對于可移植性和標準協議對于互操作性的重要性,中間件已成為許多標準化工作的主要部分。分布式應用軟件借助中間件可以在不同的技術之間共享資源。
總的來說,中間件屏蔽了底層操作系統的復雜性,使程序開發人員面對一個簡單而統一的開發環境,減少了程序設計的復雜性,將注意力集中與自己的業務上,不必再為程序在不同軟件系統上的移植而重復工作,從而大大減少了技術上的負擔。
二、Java RMI簡介
Java RMI(Remote Method Invocation)是一種分布式對象技術,它允許一個Java虛擬機(JVM)調用運行在位于網絡中另一個地方的JVM上的對象方法。這種技術使得在多臺機器上分布資源和處理負載的想法成為可能。
分布式對象技術正在成為分布式計算環境發展的主流方向,可以說是伴隨著網絡發展起來的一種面向對象技術,其技術特點是:[2]
1) 主要針對異構環境下的應用互操作問題。
2) 系統核心的對象管理將客戶/服務器模型與面向對象技術結合在一起。
3) 提供面向對象的API。
4) 已經成為建立集成框架和軟件部件標準的核心技術。
目前主要的分布式互操作標準有OMG組織的CORBA標準,Sun公司的Java RMI標準和Microsoft的OLE/COM/DCOM標準。
2.1 Java 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基礎上,設計用于在客戶和服務器之間建立一條連接。
2.2 Java RMI與RPC,JMS的比較
遠程對象方法調用并不是新概念,遠程過程調用(RPC)已經使用很多年了。遠程過程調用被設計為在應用程序間通信的平臺中立的方式,它不理會操作系統之間以及語言之間的差異。即RPC支持多種語言,而RMI只支持Java寫的應用程序。[1]
另外RMI調用遠程對象方法,允許方法返回Java對象以及基本數據類型。而RPC不支持對象的概念,傳送到RPC服務的消息由外部數據表示(External Data Representation, XDR)語言表示,這種語言抽象了字節序類和數據類型結構之間的差異。只有由XDR定義的數據類型才能被傳遞,RPC不允許傳遞對象??梢哉fRMI是面向對象方式的Java RPC。
Java消息服務 ( Java Messaging Service, JMS )是一種允許應用程序創建、發送、接受和讀取消息的Java API。JMS與RMI的區別在于,采用JMS服務,對象是在物理上被異步從網絡的某個JVM上直接移動到另一個JVM上。而RMI對象是綁定在本地JVM中,只有函數參數和返回值是通過網絡傳送的。
2.3 Java RMI與CORBA,DCOM的比較
CORBA是90年代初有OMG組織提出的一個分布式互操作標準,屬于語言中立的。而RMI直接把分布式對象模型嵌入到Java語言的內部,使得Java程序員可以自然的編寫分布式程序,不必離開Java環境,或者涉及CORBA IDL以及Java到CORBA的類型轉換。然而RMI不遵守CORBA標準,基本上是Java-to-Java技術,難以實現與其他語言編寫的對象之間的互操作。[1]
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 語言推向了目前服務器端企業開發的主流語言的領先地位。
DCOM是從COM改造過來的,COM這一技術部分是作為規范,定義了對象實現的二進制標準,用于單機上應用之間的通信,對象實現與使用的語言無關。DCOM是COM的分布式擴展,在DCE RPC之上構造對象的遠程過程調用層支持對遠程對象的訪問。一個DCOM對象是支持一個或多個接口的組件。DCOM對象不支持對象ID,因此,客戶程序不能與某個特定的對象發生聯系。
Author: orangelizq
email: orangelizq@163.com
posted on 2007-12-01 20:45
桔子汁 閱讀(2038)
評論(0) 編輯 收藏 所屬分類:
J2SE