一、RMI概述 Java Remote Method Invocation ( RMI -- Java遠(yuǎn)程方法調(diào)用)為采用Java對(duì)象的分布式計(jì)算提供了簡單而直接的 途徑。這些對(duì)象可以是新的Java對(duì)象,也可以是圍繞現(xiàn) 有API的簡單的Java包裝程序。Java體現(xiàn)了“編寫一次就 能在任何地方運(yùn)行的模式。而RMI可將Java模式進(jìn)行擴(kuò)展 ,使之可在任何地方運(yùn)行”。 RMI可利用標(biāo)準(zhǔn)Java本機(jī)方法接口JNI與現(xiàn)有的和原有的 系統(tǒng)相連接。RMI還可利用標(biāo)準(zhǔn)JDBC包與現(xiàn)有的關(guān)系數(shù)據(jù) 庫連接。RMI/JNI和RMI/JDBC相結(jié)合,可幫助您利用RMI與目 前使用非Java語言的現(xiàn)有服務(wù)器進(jìn)行通信,而且在您需 要時(shí)可擴(kuò)展Java在這些服務(wù)器上的使用。RMI可幫助您在 擴(kuò)展使用時(shí)充分利用Java的強(qiáng)大功能。
二、RMI的優(yōu)點(diǎn) 從最基本的角度看,RMI是Java的遠(yuǎn)程過程調(diào)用(RPC)機(jī) 制。與傳統(tǒng)的RPC系統(tǒng)相比,RMI具有若干優(yōu)點(diǎn),因?yàn)樗?是Java面向?qū)ο蠓椒ǖ囊徊糠?。傳統(tǒng)的RPC系統(tǒng)采用中性 語言,所以是最普通的系統(tǒng)--它們不能提供所有可能的 目標(biāo)平臺(tái)所具有的功能。 RMI以Java為核心,可與采用本機(jī)方法與現(xiàn)有系統(tǒng)相連 接。這就是說,RMI可采用自然、直接和功能全面的方式 為您提供分布式計(jì)算技術(shù),而這種技術(shù)可幫助您以不斷 遞增和無縫的方式為整個(gè)系統(tǒng)添加Java功能。 其主要優(yōu)點(diǎn) 1、面向?qū)ο螅篟MI可將完整的對(duì)象作為參數(shù)和返回值進(jìn)行傳 遞,而不僅僅是預(yù)定義的數(shù)據(jù)類型。也就是說,您可以 將類似Java哈希表這樣的復(fù)雜類型作為一個(gè)參數(shù)進(jìn)行傳 遞。而在目前的RPC系統(tǒng)中,您只能依靠客戶機(jī)將此類對(duì) 象分解成基本數(shù)據(jù)類型,然后傳遞這些數(shù)據(jù)類型,最后 在服務(wù)器端重新創(chuàng)建哈希表。RMI則不需額外的客戶程序 代碼(將對(duì)象分解成基本數(shù)據(jù)類型),直接跨網(wǎng)傳遞對(duì)象 。 2、可移動(dòng)屬性:RMI可將屬性(類實(shí)現(xiàn)程序)從客戶機(jī)移動(dòng) 到服務(wù)器,或者從服務(wù)器移到客戶機(jī)。例如,您可以定 義一個(gè)檢查雇員開支報(bào)告的接口,以便察看雇員是否遵 守了公司目前實(shí)行的政策。在開支報(bào)告創(chuàng)建后,客戶機(jī) 就會(huì)從服務(wù)器端獲得實(shí)現(xiàn)該接口的對(duì)象。如果政策發(fā)生 變化,服務(wù)器端就會(huì)開始返回使用了新政策的該接口的 另一個(gè)實(shí)現(xiàn)程序。您不必在用戶系統(tǒng)上安裝任何新的軟 件就能在客戶端檢查限制條件--從而向用戶提供更快的 反饋,并降低服務(wù)器的工作量。這樣就能具備最大的靈 活性,因?yàn)檎吒淖儠r(shí)只需要您編寫一個(gè)新的Java類, 并將其在服務(wù)器主機(jī)上安裝一次即可。 3、設(shè)計(jì)方式:對(duì)象傳遞功能使您可以在分布式計(jì)算中充分 利用面向?qū)ο蠹夹g(shù)的強(qiáng)大功能,如二層和三層結(jié)構(gòu)系統(tǒng) 。如果您能夠傳遞屬性,那么您就可以在您的解決方案 中使用面向?qū)ο蟮脑O(shè)計(jì)方式。所有面向?qū)ο蟮脑O(shè)計(jì)方式 無不依靠不同的屬性來發(fā)揮功能,如果不能傳遞完整的 對(duì)象--包括實(shí)現(xiàn)和類型--就會(huì)失去設(shè)計(jì)方式上所提供的 優(yōu)點(diǎn)。 4、安全:RMI使用Java內(nèi)置的安全機(jī)制保證下載執(zhí)行程序時(shí) 用戶系統(tǒng)的安全。RMI使用專門為保護(hù)系統(tǒng)免遭惡意小應(yīng) 用程序侵害而設(shè)計(jì)的安全管理程序,可保護(hù)您的系統(tǒng)和 網(wǎng)絡(luò)免遭潛在的惡意下載程序的破壞。在情況嚴(yán)重時(shí), 服務(wù)器可拒絕下載任何執(zhí)行程序。 5、便于編寫和使用:RMI使得Java遠(yuǎn)程服務(wù)程序和訪問這些 服務(wù)程序的Java客戶程序的編寫工作變得輕松、簡單。 遠(yuǎn)程接口實(shí)際上就是Java接口。服務(wù)程序大約用三行指 令宣布本身是服務(wù)程序,其它方面則與任何其它Java對(duì) 象類似。這種簡單方法便于快速編寫完整的分布式對(duì)象 系統(tǒng)的服務(wù)程序,并快速地制做軟件的原型和早期版本 ,以便于進(jìn)行測試和評(píng)估。因?yàn)镽MI程序編寫簡單,所以 維護(hù)也簡單。 6、可連接現(xiàn)有/原有的系統(tǒng):RMI可通過Java的本機(jī)方法接 口JNI與現(xiàn)有系統(tǒng)進(jìn)行進(jìn)行交互。利用RMI和JNI,您就能 用Java語言編寫客戶端程序,還能使用現(xiàn)有的服務(wù)器端 程序。在使用RMI/JNI與現(xiàn)有服務(wù)器連接時(shí),您可以有選擇 地用Java重新編寫服務(wù)程序的任何部分,并使新的程序 充分發(fā)揮Java的功能。類似地,RMI可利用JDBC、在不修 改使用數(shù)據(jù)庫的現(xiàn)有非Java源代碼的前提下與現(xiàn)有關(guān)系 數(shù)據(jù)庫進(jìn)行交互。 7、編寫一次,到處運(yùn)行:RMI是Java“編寫一次,到處運(yùn)行 ”方法的一部分。任何基于RMI的系統(tǒng)均可100%地移植到 任何Java虛擬機(jī)上,RMI/JDBC系統(tǒng)也不例外。如果使用RMI/JNI 與現(xiàn)有系統(tǒng)進(jìn)行交互工作,則采用JNI編寫的代碼可與任 何Java虛擬機(jī)進(jìn)行編譯、運(yùn)行。 8、分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不 再被網(wǎng)絡(luò)中任何客戶程序所引用的遠(yuǎn)程服務(wù)對(duì)象。與Java 虛擬機(jī)內(nèi)部的垃圾收集類似,分布式垃圾收集功能允許 用戶根據(jù)自己的需要定義服務(wù)器對(duì)象,并且明確這些對(duì) 象在不再被客戶機(jī)引用時(shí)會(huì)被刪除。 9、并行計(jì)算:RMI采用多線程處理方法,可使您的服務(wù)器利 用這些Java線程更好地并行處理客戶端的請(qǐng)求。 Java分布式計(jì)算解決方案:RMI從JDK 1.1開始就是Java平臺(tái) 的核心部分,因此,它存在于任何一臺(tái)1.1 Java虛擬機(jī)中 。所有RMI系統(tǒng)均采用相同的公開協(xié)議,所以,所有Java 系統(tǒng)均可直接相互對(duì)話,而不必事先對(duì)協(xié)議進(jìn)行轉(zhuǎn)換。
三、RMI 體系結(jié)構(gòu) 為了實(shí)現(xiàn)位置透明性,RMI 引入了兩種特殊類型的對(duì)象:存根(stub)和框架(skeleton)。存根是代表遠(yuǎn)程對(duì)象的客戶機(jī)端對(duì)象。存根具有和遠(yuǎn)程對(duì)象相同的接口或方法列表,但當(dāng)客戶機(jī)調(diào)用存根方法時(shí),存根通過 RMI 基礎(chǔ)結(jié)構(gòu)將請(qǐng)求轉(zhuǎn)發(fā)到遠(yuǎn)程對(duì)象,實(shí)際上由遠(yuǎn)程對(duì)象執(zhí)行請(qǐng)求。在服務(wù)器端,框架對(duì)象處理“遠(yuǎn)方”的所有細(xì)節(jié),因此實(shí)際的遠(yuǎn)程對(duì)象不必?fù)?dān)心這些細(xì)節(jié)。也就是說,您完全可以象編碼本地對(duì)象一樣來編碼遠(yuǎn)程對(duì)象??蚣軐⑦h(yuǎn)程對(duì)象從 RMI 基礎(chǔ)結(jié)構(gòu)分離開來。在遠(yuǎn)程方法請(qǐng)求期間,RMI 基礎(chǔ)結(jié)構(gòu)自動(dòng)調(diào)用框架對(duì)象,因此它可以發(fā)揮自己的作用。關(guān)于這種設(shè)置的最大的好處是,您不必親自為存根和框架編寫代碼。JDK 包含工具 rmic,它會(huì)為您創(chuàng)建存根和框架的類文件。 (備注:此處應(yīng)該還有一個(gè)圖的,可圖沒傳好,跑到下面去了) RMI 應(yīng)用程序通常包括兩個(gè)獨(dú)立的程序:服務(wù)器程序和客戶機(jī)程序。典型的服務(wù) 器應(yīng)用程序?qū)?chuàng)建多個(gè)遠(yuǎn)程對(duì)象,使這些遠(yuǎn)程對(duì)象能夠被引用,然后等待客戶機(jī) 調(diào)用那些遠(yuǎn)程對(duì)象上的方法。而典型的客戶機(jī)程序則從服務(wù)器中得到一個(gè)或多個(gè) 遠(yuǎn)程對(duì)象的引用,然后調(diào)用遠(yuǎn)程對(duì)象的方法。RMI 為服務(wù)器和客戶機(jī)進(jìn)行通訊 和信息傳遞提供了一種機(jī)制。這樣的應(yīng)用程序有時(shí)被稱為分布式對(duì)象應(yīng)用程序。 分布式對(duì)象應(yīng)用程序需要: 1、定位遠(yuǎn)程對(duì)象 應(yīng)用程序可使用兩種機(jī)制中的一種得到對(duì)遠(yuǎn)程對(duì)象的引用。它既可用 RMI 的簡 單命名工具 rmiregistry 來注冊它的遠(yuǎn)程對(duì)象;也可將遠(yuǎn)程對(duì)象引用作為常規(guī) 操作的一部分來進(jìn)行傳遞和返回。 2、與遠(yuǎn)程對(duì)象通訊 遠(yuǎn)程對(duì)象間通訊的細(xì)節(jié)由 RMI 處理;對(duì)于程序員來說,遠(yuǎn)程通訊看起來就象標(biāo) 準(zhǔn)的 Java 方法調(diào)用。給作為參數(shù)或返回值傳遞的對(duì)象加載類字節(jié)碼因?yàn)?RMI 允許調(diào)用程序?qū)⒓?Java 對(duì)象傳給遠(yuǎn)程對(duì)象,所以 RMI 將提供必要的機(jī)制, 既可以加載對(duì)象的代碼又可以傳輸對(duì)象的數(shù)據(jù)。 服務(wù)器調(diào)用注冊服務(wù)程序以使名字與遠(yuǎn)程對(duì)象相關(guān)聯(lián)??蛻魴C(jī)在服務(wù)器注冊服務(wù) 程序中用遠(yuǎn)程對(duì)象的名字查找該遠(yuǎn)程對(duì)象,然后調(diào)用它的方法。RMI 能用 Java 系統(tǒng)支持的任何 URL 協(xié)議(例如 HTTP、FTP、file 等)加載類字節(jié)碼。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。