對象中間件之Java RMI
作者:orangelizq
一、中間件簡介
1.1 中間件的定義
中間件(middleware)是基礎(chǔ)軟件的一大類,屬于可復(fù)用的軟件范疇。中間件在操作系統(tǒng)軟件,網(wǎng)絡(luò)和數(shù)據(jù)庫之上,應(yīng)用軟件之下,總的作用是為處于自己上層的應(yīng)用軟件提供運行于開發(fā)的環(huán)境,幫助用戶靈活、高效的開發(fā)和集成復(fù)雜的應(yīng)用軟件。[1]
IDC對中間件的定義為:中間件是一種獨立的系統(tǒng)軟件或服務(wù)程序,分布式應(yīng)用軟件借助這種軟件在不同的技術(shù)之間共享資源,中間件定位于客戶機(jī)服務(wù)器的操作系統(tǒng)之上,管理計算機(jī)資源和網(wǎng)絡(luò)通信。
因而中間件是指一類軟件,是基于分布式處理的軟件,最突出的特點是其網(wǎng)絡(luò)通信功能。也可認(rèn)為中間件是位于平臺和應(yīng)用之間的通用服務(wù),這些服務(wù)具有標(biāo)準(zhǔn)的程序接口和協(xié)議。針對不同的操作系統(tǒng)和硬件平臺,可以有符合接口和協(xié)議的多種實現(xiàn)。
圖1.1 中間件
1.2 中間件的分類
按照IDC的分類方法,中間件可分為六類:[1]
1) 終端仿真/屏幕轉(zhuǎn)換
2) 數(shù)據(jù)訪問中間件(UDA)
3) 遠(yuǎn)程過程調(diào)用中間件(RPC)
4) 消息中間件(MOM)
5) 交易中間件(TPM)
6) 對象中間件
然而在實際應(yīng)用中,一般將中間件分為兩大類:一類是底層中間件,用于支撐單個應(yīng)用系統(tǒng)或解決一類問題,包括交易中間件、應(yīng)用服務(wù)器、消息中間件、數(shù)據(jù)訪問中間件等;另一類是高層中間件,更多的用于系統(tǒng)整合,包括企業(yè)應(yīng)用集成中間件、工作流中間件、門戶中間件等,他們通常會與多個應(yīng)用系統(tǒng)打交道,在系統(tǒng)中層次較高,并大多基于前一類的底層中間件運行。
1.2.1 終端仿真/屏幕轉(zhuǎn)換
此類中間件用于實現(xiàn)客戶機(jī)圖形用戶接口與已有的字符接口方式的服務(wù)器應(yīng)用程序之間的互操作,應(yīng)用與早期的大型機(jī)系統(tǒng),現(xiàn)在已很少使用。
1.2.2 數(shù)據(jù)訪問中間件
此類中間件是為了建立數(shù)據(jù)應(yīng)用資源互操作的模式,對異構(gòu)環(huán)境下的數(shù)據(jù)庫或文件系統(tǒng)實現(xiàn)聯(lián)接。
1.2.3 遠(yuǎn)程過程調(diào)用中間件
此類中間件可以使開發(fā)人員在需要時調(diào)用位于遠(yuǎn)端服務(wù)器上的過程,屏蔽了在調(diào)用過程中的通信細(xì)節(jié)。一個應(yīng)用程序使用RPC來遠(yuǎn)程執(zhí)行一個位于不同地址空間里的過程,在效果上看和執(zhí)行本地調(diào)用相同。
1.2.4 交易中間件
此類中間件是專門針對聯(lián)機(jī)交易系統(tǒng)而設(shè)計的。聯(lián)機(jī)交易系統(tǒng)需要處理大量并發(fā)進(jìn)程,處理并發(fā)涉及到操作系統(tǒng),文件系統(tǒng),編程語言,數(shù)據(jù)通信,數(shù)據(jù)庫系統(tǒng),系統(tǒng)管理,應(yīng)用軟件等。而交易中間件根據(jù)分布式交易處理的標(biāo)準(zhǔn)及參考模型,對資源管理,交易管理和應(yīng)用進(jìn)行了實現(xiàn),從而使得基于交易中間件開發(fā)應(yīng)用程序更為簡單。交易中間件基本上只適用于聯(lián)機(jī)交易系統(tǒng),是一種較為專用的中間件。
1.2.5 消息中間件
此類中間件是指利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。
消息中間件可以即支持同步方式,又支持異步方式。異步中間件比同步中間件具有更強(qiáng)的容錯性,在系統(tǒng)故障時可以保證消息的正常傳輸。異步中間件技術(shù)又分為兩類:廣播方式和發(fā)布/訂閱方式。由于發(fā)布/訂閱方式可以指定哪種類型的用戶可以接受哪種類型的消息,更加有針對性,事實上已成為異步中間件的非正式標(biāo)準(zhǔn)。目前主流的消息中間件產(chǎn)品有IBM的MQSeries,BEA的MessageQ和Sun的JMS等。
1.2.6 對象中間件
傳統(tǒng)的對象技術(shù)通過封裝、繼承及多態(tài)提供了良好的代碼重用功能。但這些對象只存在與一個程序中,外界并不知道它們的存在,也無法訪問它們。對象中間件提供了一個標(biāo)準(zhǔn)的構(gòu)建框架,能使不同廠家的軟件通過不同的地址空間,網(wǎng)絡(luò)和操作系統(tǒng)實現(xiàn)交互訪問。對象中間件的目標(biāo)是為軟件用戶及開發(fā)者提供一種應(yīng)用級的即插即用的互操作性。目前主流的對象中間件有OMG的CORBA,Microsoft 的COM以及IBM的SOM,Sun的RMI等。
1.3 中間件的特點
一般來講,中間件具有以下一些特點:滿足大量應(yīng)用的需求,運行于多種硬件和操作系統(tǒng)平臺,支持分布式計算,支持標(biāo)準(zhǔn)接口和協(xié)議。開發(fā)人員通過調(diào)用中間件提供的大量API,實現(xiàn)異構(gòu)環(huán)境的通信,從而屏蔽異構(gòu)系統(tǒng)中復(fù)雜的操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議。
由于標(biāo)準(zhǔn)接口對于可移植性和標(biāo)準(zhǔn)協(xié)議對于互操作性的重要性,中間件已成為許多標(biāo)準(zhǔn)化工作的主要部分。分布式應(yīng)用軟件借助中間件可以在不同的技術(shù)之間共享資源。
總的來說,中間件屏蔽了底層操作系統(tǒng)的復(fù)雜性,使程序開發(fā)人員面對一個簡單而統(tǒng)一的開發(fā)環(huán)境,減少了程序設(shè)計的復(fù)雜性,將注意力集中與自己的業(yè)務(wù)上,不必再為程序在不同軟件系統(tǒng)上的移植而重復(fù)工作,從而大大減少了技術(shù)上的負(fù)擔(dān)。
二、Java RMI簡介
Java RMI(Remote Method Invocation)是一種分布式對象技術(shù),它允許一個Java虛擬機(jī)(JVM)調(diào)用運行在位于網(wǎng)絡(luò)中另一個地方的JVM上的對象方法。這種技術(shù)使得在多臺機(jī)器上分布資源和處理負(fù)載的想法成為可能。
分布式對象技術(shù)正在成為分布式計算環(huán)境發(fā)展的主流方向,可以說是伴隨著網(wǎng)絡(luò)發(fā)展起來的一種面向?qū)ο蠹夹g(shù),其技術(shù)特點是:[2]
1) 主要針對異構(gòu)環(huán)境下的應(yīng)用互操作問題。
2) 系統(tǒng)核心的對象管理將客戶/服務(wù)器模型與面向?qū)ο蠹夹g(shù)結(jié)合在一起。
3) 提供面向?qū)ο蟮?span lang="EN-US">API。
4) 已經(jīng)成為建立集成框架和軟件部件標(biāo)準(zhǔn)的核心技術(shù)。
目前主要的分布式互操作標(biāo)準(zhǔn)有OMG組織的CORBA標(biāo)準(zhǔn),Sun公司的Java RMI標(biāo)準(zhǔn)和Microsoft的OLE/COM/DCOM標(biāo)準(zhǔn)。
2.1 Java RMI的體系結(jié)構(gòu)
RMI的基本體系結(jié)構(gòu),概括起來說,由三個抽象層組成:
1. 存根/框架層(Stubs/Skeletons Layer)
RMI為我們引入了兩種特殊類型的對象,稱為存根(Stub)和框架(Skeleton),它們組成了RMI的第一層。
在遠(yuǎn)程通信的時候,要利用TCP/IP協(xié)議,做很多底層數(shù)據(jù)的打包傳輸。運用Java技術(shù),我們先要把數(shù)據(jù)或者對象轉(zhuǎn)換成字節(jié)流(byte stream),便于網(wǎng)絡(luò)傳輸,這個過程叫匯集(marshaling);當(dāng)收到遠(yuǎn)程傳來的字節(jié)流后,我們要把流信息轉(zhuǎn)換成對象或者數(shù)據(jù),這個過程叫解讀(unmarshaling),它與匯集剛好相反。
Stub和Skeleton層位于實際應(yīng)用程序之下,建立在Proxy(代理)設(shè)計方案之上。Stub類的作用是遠(yuǎn)程服務(wù)器實現(xiàn)的代理的角色,Stub是客戶方對象;Skeleton類用于幫助對象通過RMI鏈接與Stub通信,它從鏈路中讀取方法調(diào)用的參數(shù),向遠(yuǎn)程服務(wù)實現(xiàn)對象進(jìn)行調(diào)用,接受返回值,然后再把返回值寫回到Stub。
2. 遠(yuǎn)程引用層(Remote Reference Layer)
遠(yuǎn)程引用層定義和支持著RMI連接的調(diào)用語義(semantics)。
RMI進(jìn)行遠(yuǎn)程訪問要用到JRMP(Java Remote Method Protocol,即Java遠(yuǎn)程方法協(xié)議),
這一層提供專用于JRMP的RemoteRef對象,它位于java.rmi.server包內(nèi),代表著遠(yuǎn)程對象的一個句柄。RemoteRef使用遠(yuǎn)程引用來執(zhí)行遠(yuǎn)程對象的一個遠(yuǎn)程方法調(diào)用。
3. 傳輸層(Transport Layer)
傳輸層在JVM之間建立基于流的網(wǎng)絡(luò)連接,并且負(fù)責(zé)設(shè)置和管理這些連接。這時候,RMI使用一種線級(wire-level)協(xié)議進(jìn)行基于TCP/IP的連接,該協(xié)議就是Java遠(yuǎn)程方法協(xié)議(JRMP,即Java Remote Method Protocol)。
在JDK版本1.2開始,JRMP不再需要Skeleton,而是使用reflection來建立與遠(yuǎn)程服務(wù)的連接。為了生成Stub,我們須用rmic。
當(dāng)前的RMI實現(xiàn)中,傳輸層建立在TCP/IP基礎(chǔ)上,設(shè)計用于在客戶和服務(wù)器之間建立一條連接。
2.2 Java RMI與RPC,JMS的比較
遠(yuǎn)程對象方法調(diào)用并不是新概念,遠(yuǎn)程過程調(diào)用(RPC)已經(jīng)使用很多年了。遠(yuǎn)程過程調(diào)用被設(shè)計為在應(yīng)用程序間通信的平臺中立的方式,它不理會操作系統(tǒng)之間以及語言之間的差異。即RPC支持多種語言,而RMI只支持Java寫的應(yīng)用程序。[1]
另外RMI調(diào)用遠(yuǎn)程對象方法,允許方法返回Java對象以及基本數(shù)據(jù)類型。而RPC不支持對象的概念,傳送到RPC服務(wù)的消息由外部數(shù)據(jù)表示(External Data Representation, XDR)語言表示,這種語言抽象了字節(jié)序類和數(shù)據(jù)類型結(jié)構(gòu)之間的差異。只有由XDR定義的數(shù)據(jù)類型才能被傳遞,RPC不允許傳遞對象。可以說RMI是面向?qū)ο蠓绞降?/span>Java RPC。
Java消息服務(wù) ( Java Messaging Service, JMS )是一種允許應(yīng)用程序創(chuàng)建、發(fā)送、接受和讀取消息的Java API。JMS與RMI的區(qū)別在于,采用JMS服務(wù),對象是在物理上被異步從網(wǎng)絡(luò)的某個JVM上直接移動到另一個JVM上。而RMI對象是綁定在本地JVM中,只有函數(shù)參數(shù)和返回值是通過網(wǎng)絡(luò)傳送的。
2.3 Java RMI與CORBA,DCOM的比較
CORBA是90年代初有OMG組織提出的一個分布式互操作標(biāo)準(zhǔn),屬于語言中立的。而RMI直接把分布式對象模型嵌入到Java語言的內(nèi)部,使得Java程序員可以自然的編寫分布式程序,不必離開Java環(huán)境,或者涉及CORBA IDL以及Java到CORBA的類型轉(zhuǎn)換。然而RMI不遵守CORBA標(biāo)準(zhǔn),基本上是Java-to-Java技術(shù),難以實現(xiàn)與其他語言編寫的對象之間的互操作。[1]
RMI 和 CORBA 常被視為相互競爭的技術(shù),因為兩者都提供對遠(yuǎn)程分布式對象的透明訪問。但這兩種技術(shù)實際上是相互補充的,一者的長處正好可以彌補另一者的短處。RMI 和 CORBA 的結(jié)合產(chǎn)生了 RMI-IIOP,RMI-IIOP 是企業(yè)服務(wù)器端 Java 開發(fā)的基礎(chǔ)。
1997 年,IBM 和 Sun Microsystems啟動了一項旨在促進(jìn) Java 作為企業(yè)開發(fā)技術(shù)的發(fā)展的合作計劃。兩家公司特別著力于如何將 Java 用作服務(wù)器端語言,生成可以結(jié)合進(jìn)現(xiàn)有體系結(jié)構(gòu)的企業(yè)級代碼。所需要的就是一種遠(yuǎn)程傳輸技術(shù),它兼有 Java 的 RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)較少的資源占用量和更成熟的 CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結(jié)構(gòu))技術(shù)的健壯性。出于這一需要,RMI-IIOP問世了,它幫助將 Java 語言推向了目前服務(wù)器端企業(yè)開發(fā)的主流語言的領(lǐng)先地位。
DCOM是從COM改造過來的,COM這一技術(shù)部分是作為規(guī)范,定義了對象實現(xiàn)的二進(jìn)制標(biāo)準(zhǔn),用于單機(jī)上應(yīng)用之間的通信,對象實現(xiàn)與使用的語言無關(guān)。DCOM是COM的分布式擴(kuò)展,在DCE RPC之上構(gòu)造對象的遠(yuǎn)程過程調(diào)用層支持對遠(yuǎn)程對象的訪問。一個DCOM對象是支持一個或多個接口的組件。DCOM對象不支持對象ID,因此,客戶程序不能與某個特定的對象發(fā)生聯(lián)系。
Author: orangelizq
email: orangelizq@163.com
|
|