分布式對象和遠程調用_第1頁
分布式對象和遠程調用_第2頁
分布式對象和遠程調用_第3頁
分布式對象和遠程調用_第4頁
分布式對象和遠程調用_第5頁
已閱讀5頁,還剩105頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章分布式對象和遠程調用第4章:分布式對象和遠程調用n引言n分布式對象間的通信n遠程過程調用Remote procedure callnJava RMI 實例研究n總結分布對象技術要解決的基本問題 n分布對象技術要解決的基本問題n分布式系統的客戶/服務器模型 N層客戶/服務器模型分布對象技術要解決的基本問題 分布對象技術要解決的基本問題 分布對象技術要解決的基本問題n對象請求代理-支持客戶訪問異地分布對象的核心機制稱為對象請求代理ORB(Object Request Broker)分布對象技術要解決的基本問題 分布對象技術要解決的基本問題 分布式程序設計的模型n遠程過程調用(RPC-Remo

2、te Procedure Call )n不同進程之間的過程的調用,但是是相同的語言 環境。n遠程方法調用(RMI-Remote Method Invocation )n一個進程調用另一個進程中對象的方法,兩個進 程可以在同一臺主機,也可以在不同的主機。n事件驅動(Event-based model)n注冊一些感興趣的對象的事件n事件發生時會的到通知 中間件n中間件層n中間件是一種軟件,它提供基本的通信模塊和其他一些基礎服務模塊,使得應用程序開發提供平臺中間件要解決的問題n通信協議:n獨立于網絡底層的傳輸協議。n硬件:n數據類型在不同的硬件平臺上有不同的表示:bigendian,litteren

3、dian,可以通過mashell解決。n操作系統:n在操作系統層上提供更高級的抽象API,屏蔽操作系 統的異構n編程語言:nCORBA通過IDL,可以使得不同的語言寫的代碼互相 調用。n中間件技術提供了一個編程的抽象,來屏蔽上述的異質 問題。中間件-分布對象的核心技術n中間件的特性n位置透明(Location transparency)n通信協議(Communication protocols)n對計算機硬件層的支持n對操作系統層的支持n對程序設計語言層的支持接口(Interfaces)n接口n一個模塊的接口包含了其他模塊可訪問的方法 的定義(沒有實現)和變量。n有些情況,需要調用同一個方法,

4、但是的具體 實現的不同,接口可以做到這一點。n分布式系統中的接口n同一個地址空間,模塊之間的通信可以通過訪 問公共變量,但是遠程調用不能直接訪問變量n只能通過屬土參數和輸出參數n指針不能作為參數傳遞或者作為結果返回接口的實例nRPCs Service interfacen對服務器一組過程的說明,定義每個過 程的輸入輸出參數,供客戶端調用。nRMIs Remote interfacen對一個對象的方法的說明。n可以傳遞一個對象或者遠程對象的指針, 也可以返回這兩種類型,這是與過程調 用最大的不同。接口的實例n接口定義語言(IDLsInterface Definition Languages )n

5、 Java RMI中可以直接定義接口,只能 被java語言調用n其它中間件系統提供了IDLs. e.g. CORBA IDL (n1), DCE IDL and DCOM IDLn允許用其它語言實現的對象來調用, 具有跨平臺功能接口的實例 第 4章:分布式對象和遠程調用n引言n分布式對象間的通信n遠程過程調用Remote procedure calln事件與通知Events and notificationsnJava RMI 實例研究n總結分布式對象間的通信n對象模型(The object model)n分布式對象(Distributed objects)n分布式對象模型(The distr

6、ibuted object model)n設計問題n實現n分布式垃圾回收對象模型n對象的引用(object reference)n訪問對象,必須知道對象的引用。可以作為 參數的傳遞,也可以作為結果返回n接口(interface)n動作(Actions)n一個對象調用了另一個對象的方法則觸發一 個動作,兩個作用:n對象的狀態發生改變n生成一個新的對象n連鎖的調用n異常(Exceptions)n垃圾回收(Garbage collection)分布式對象n除了對象的屬性,分布式對象系統的關鍵是對象之間的通信n引入服務器和客戶端的概念n客戶/服務器模式,對象相當于server, 調用該對象方法的程序是

7、client.作為 server的對象需要訪問其它對象的方法 時,它就是client.分布式對象模型 n進程中可以包含多個對象,本地的和遠程的。調 用其它進程的對象叫遠程調用,即使在同一臺機 器上,不同的地址空間的調用也叫遠程調用.n提供可被遠程調用方法的對象叫遠程對象。 E.g. B & Fn調用遠程對象必須先獲得遠程對象的引用。E.g. C 必須有E的引用。n遠程對象通過遠程接口定義可被遠程訪問的方 法。E.g., B和 必須公布遠程接口。分布式對象模型分布式對象調用的語義(Invocation semantics)n分布對象的遠程調用不能保證每次調用都確定 被執行。nRRP協議通

8、常采用一些措施來保證所要求的消 息傳遞保障。n對于RRP協議,選擇不同的策略,以提供不同 的提交的保證。nRetry Request message:是否重發請求,直到 收到應答或者確信服務器已經不工作了。nDuplicate filtering:當有重復傳輸的情況下,是否在服務器端過濾掉重復的請求 nRetransmission of result:是否保存結果的歷 史記錄用于重發,以便在結果丟失的情況下 不需要重復執行請求分布式對象調用的語義(Invocation semantics)n本地調用一定會執行,且只執行一次。nexactly oncen遠程調用不能保證exactly once語

9、義, 遠程調用 使用RRP協議,它有三種語義形式:nMaybe 客戶端沒有接收到回復,客戶端能判 斷的結論是:請求可能被執行,返回結果丟 失;也可能沒有被執行,請求消息丟失或者遠 程對象的機器不宕機。n如果在設計上沒有考慮重發請求,則是mayben語義。n存在的問題:不能保證系統正確工作。分布式對象調用的語義(Invocation semantics)nAt-least-once 客戶端得到一個結果,說明請求 至少被執行了一次,也可能多于一次。在它收到 一個異常時,應該重發請求,直到得到結果。(Sun RPC)n存在問題:n任意故障:如果調用請求被重復發送,遠程 方法可能被執行一次,多次執行可

10、能引起錯誤 的結果。如果對象提供的操作是冪等操作, 就不存在任意故障。n增加消息量:當遠程服務器不工作,會導致 不斷重發請求,增加消息量。可以采用超時 判斷,來結束重發。分布式對象調用的語義(Invocation semantics)nAt-most-once 客戶端收到一個結果, 表明請求被執行了一次,并且只執行一 次;或者收到一個異常,表明方法沒有 被執行到(JavaRMI)。n有些應用不允許一次請求被執行多次, 需要這種語義。n措施:在服務器端過濾重復請求,或者 在在服務保存結果,可以保證方法不被 重復執行。n存在問題:增加服務器處理的負擔。調用的語義( failure model)基于

11、TCP/IP連接的調用語義:n當一個進程得知與對方的連接斷開了,以下 三種情況是可以推斷的:n某個進程退出或關閉了連接nexactly once.n服務器上的進程崩潰了nat most once.n網絡擁塞nat least once分布式對象調用的語義(Invocation semantics)n根據遠程調用的容錯手段,決定了調用 語義 遠程方法調用的結構1、翻譯本地對象引用和遠程對象引用;2、創建遠程對象引用。n每個進程都維護一個遠程對象表,記錄本地對象引用與遠程對象引用的對 應關系。n所有遠程對象,例如 server的表中要包含B,n所有本地對象,例如 client的表中要包含B的代理。

12、n當遠程對象第一次被傳輸,RRM為其創建一個遠程對象引用,并加到表中n當遠程對象引用到達接收方,RRM為其建立相應的本地引用,可能指向代 理或者指向遠程對象。如果遠程對象的引用不在表中,RMI軟件就創建一 個新的代理,并由RRM把它加到表中。n當軟件層進行外部數據的編碼解碼一個遠程引用時,調用RRM,例如,當 一個請求信息到達,表用來查找哪個對象要被調用。遠程方法調用的結構nRMI software 在應用層對象和通訊模塊與遠程 引用模塊之間的軟件模塊。由proxy, skeleton和 dispatcher組成。遠程方法調用的結構 nproxy的作用是讓客戶端能透明地調用遠程對象的方法。n在

13、客戶端,每個遠程對象都在代理,完成:n將要傳輸的參數或者對象進行編碼解碼。n傳遞請求n和proxy類似,在server端,一個skeleton和一個dispatcher代理一個遠程對象, dispatcher負責接受來自通訊模塊發來的請求, 給這個方法。n Proxy和dispatcher在根據methodId對應方法采用相同的規則。n 一個遠程對象的類有一個skeleton, 它實現了遠程接口的方法, 根據一個對象被調用的用途不同,遠程方法的實現也不同n Skeleton在server端完成編碼和解碼的功能。第 5章:分布式對象和遠程調用n引言n分布式對象間的通信n遠程過程調用Remote

14、Procedure Calln事件與通知Events and notificationsnJava RMI 實例研究n總結Sun RPC case studynRPC的目的是可以像程序調用一樣使用遠程 服務。RPC 使用的是客戶機/服務器模式。n服務程序就是一個服務器(server),nserver提供一個或多個遠程過程;n請求程序就是一個客戶機(client), clientn向server發出遠程調用。Sun RPC case study continuedn程序調用:如何使遠程的過程調用看起來 和本地的過程調用沒有區別的問題n網絡通信:調用進程和被調用進程間的網 絡比本地計算機有更復雜的

15、特性。例如, 它可能限制消息尺寸,并且有丟失和重排消息的可能,安全問題;n操作系統:運行調用和被調用進程的計算 機可能有明顯不同的體系結構和數據表示 格式;n編程語言:跨語言之間的互操作問題;Sun RPC case study continuednRPC引入了存根(Stub)的概念Sun RPC case study continuedn比如服務端有某個函數fn(),它為了能夠被遠程調 用,需要通過編譯器生成兩個stub:n客戶端的一個stub:c_fn()n服務器端的一個stub:s_fn()n在客戶端,一個進程在執行過程中調用到了函數 fn(),此函數的具體實現是在遠程的某臺機器上, 那

16、么n此進程實際上是調用了位于當地機器上的另外 一個版本的fn()(即c_fn())n當客戶端的消息發送到服務器端時,服務器端 也不是把消息直接就交給真正的fn(),而是同樣 先交給一個不同版本的fn()(即s_fn())Sun RPC case study continuednStub的主要功能是對要發送的參數進行 marshal(可理解成一種打包操作)和對接受 到的參數(或返回值)進行unmarshal(解 包)。nMarshal操作將要發送的數據制成一種標 準的格式(在DCE RPC系統中,此格式 稱做Network Data Representation(NDR)格式)nunmarsha

17、l再從NDR格式數據包中讀出所 需數據。Sun RPC case study continuednClient stub的功能:n收集調用遠程函數需要的參數n將這些參數marshal成消息,即把消息轉化 成標準的網絡數據表示(network data representation , NDR) 格式,用于在網絡上 傳遞n調用客戶端的運行時系統(Client runtime system)將此消息發送給服務器端。n當服務器端將結果消息返回后,將結果消息unmarshal,把結果返回給應用進程。 Sun RPC case study continuednServer stub的功能:n對發送給它的

18、參數消息unmarshal,收集 參數n調用位于本機上的過程n將此過程執行的結果marshal成消息,然 后調用服務器端的運行時系統將結果消 息發送給客戶端Sun RPC case study continuednIDL compiler的功能就是對編輯好的IDL 文件進行編譯,編譯后生成了下面的三 個文件:nHeader是一個頭文件,此頭文件包含 了此IDL文件中的全局唯一標示符,數 據類型定義,有關的常量定義,以及 函數原型。客戶代碼和服務器代碼中 包含都要包含header文件nClient stub即客戶端的stub程序。nServer stub即服務器端的stub程序。Sun RPC

19、case study continuednClient code和Server code就是由應用程 序開發人員所寫的客戶代碼和服務器代 碼,客戶代碼可能調用到各種各樣的過 程,服務器代碼就是這些過程的真正實 現。n客戶代碼和客戶stub代碼分別經過編 譯生成各自的目標文件,這些目標文 件再與運行時庫連接就生成了整個客 戶端可執行文件。服務器端也同理。Sun RPC case study continuedn運行時系統n客戶端的運行系統將客戶端stub產生的消 息可靠的傳送給servern運行時系統利用TCP/UDP等協議,將消 息發送到Servern服務端的運行時系統都偵聽某個眾所周 知的s

20、ocket端口,接受請求n服務端的運行系統調用Server Stub,處理nService interface: the procedures that are available for remote callingnInvocation semantics choice: at-least-once or at-most-oncenGenerally implemented over request-reply protocolnBuilding blocksnCommunication modulenClient stub procedure (as proxy in RMI): mar

21、shalling, sending, unmarshallingnDispatcher: select one of the server stub proceduresnServer stub procedure (as skeleton in RMI): unmarshalling, calling, marshallingSun RPC case studyn用于NFSnat-least-once semanticsnXDR - Interface definition languagenInterface name: Program number, version numbernPro

22、cedure identifier: procedure numbernRpcgen generator of RPC componentsnclient stub procedurenserver main procedurenDispatchernserver stub procedurenmarshalling and unmarshalling procedureSun RPC case study continuednBinding portmappernServer: register (program number, version number), port number)nC

23、lient: request port number by (program number, version number)nAuthenticationnEach request contains the credentials of the user, e.g. uid and gid of the usernAccess control according to the credential information/RPC 調用信息主體形式如下:nstruct call_body nunsigned int rpcvers; nunsigned int prog; nunsigned i

24、nt vers;unsigned int proc;nopaque_auth cred; nopaque_auth verf; nparameter 1 nparameter 2. . .n;Sun Microsystems Open Network Computing. The ONCuses XDR as the external data representation standardSun RPC case study 小結nRPC把通信接口抽象成程序調用,引入 Stub,使得調用遠程函數看起來就像本地函 數調用。nDCE RPC引入了IDL語言用于描述程序接 口,經過編譯之后得到st

25、ub,保證了接口的一致性。nRPC系統把參數和返回值編碼成用來傳輸的第 5章:分布式對象和遠程調用n引言n分布式對象間的通信n遠程過程調用Remote procedure calln事件與通知Events and notificationsnJava RMI 實例研究n總結事件與通知模型n目的n讓一個對象能夠對另一個對象發生的變化做出反應n舉例:n文件被修改了n一個電子書簽變化了位置n發布與訂閱(Publish/subscribe paradigm)n產生事件一方發布事件的類型n接收事件一方訂閱感興趣的事件類型n事件放生時,通知訂閱一方。n分布式事件驅動系統的兩個特性:n異構性:已有的分布式系

26、統的一些模塊原本不是為 了互操作而設計的,現在能夠讓他們協同工作,通 過接收方公布遠程接口。n異步性:不能要求發布程序和訂閱程序同步。事件與通知模型n舉例:交易所系統n任務:n讓交易者能夠查看他們交易的股票的最新市 場行情。n系統構成n信息提供者(Information provider)n接收新的交易信息n發布股票價格n股票價格變化通知n交易進程n訂閱股票價格事件事件與通知模型 事件與通知模型的結構n事件服務:維護一個發布的事件類型和訂閱 者興趣的數據庫,使得雙方能夠耦合起來。 事件與通知模型的結構n興趣對象n是一個對象,由于其方法被調用而改變自身的狀態,這 種改變會引起其他對象的興趣。n事

27、件n興趣對象的方法被執行的結果叫做事件。n通知n是一個對象,它包含關于事件的信息(屬性,類型 等)。n訂閱者n是一個對象,它訂閱另一個對象上發生的事件,并接收 通知。n觀察者對象n任務是將興趣對象和其訂閱者進行耦合.n分擔興趣對象的工作。n發布者n是一個對象,聲明它產生的一些事件的通知,他可以是 興趣對象,也可以是一個觀察者。事件與通知模型的結構n傳遞語義n和進程間消息傳遞的語義類似,取決于應用 需求和所采用的措施。n對可靠性要求較低的需求,一些網絡游戲 了解其它玩家的最新狀態,普通IP組播協 議。n對可靠性要求較高的需求,股票交易所系 統。需要采用可靠的組播協議。n實時要求。事件與通知模型的

28、結構n觀察者的作用n轉發n代替興趣對象發送通知。n通知過濾n減少通知的數量n事件模式n訂閱者可以定制若干事件之間的關 系,滿足這些關系時才發通知。n通知郵箱n異步傳輸事件與通知模型的結構nRSS 是一種用于共享新聞和其他Web內容的數據交換 規范,起源于 網景通訊公司 的推Push技術,將訂 戶訂閱的內容傳送給他們的 通訊協同格式 (Protocol)。RSS可以是以下三個解釋的其中一個:nReally Simple Syndication (真正簡單的整合)nRDF (Resource Description Framework) Site SummarynRich Site Summary

29、 (豐富站點摘要)n這三個解釋都是指同一種Syndication的技術。nRSS目前廣泛用于 blog 、 wiki 和網上新聞頻道,世 界多數知名新聞社網站都提供RSS訂閱支持。Jini規范 n什么是Jini?nJini是Sun公司的研究與開發項目,Jini技術 可使范圍廣泛的多種硬件和軟件-即可與網 絡相連的任何實體-能夠自主聯網。nJini技術可劃分為兩個范疇:n體系結構和分布式編程。n提供在Jini上運行的網絡服務。n基礎結構nJini基礎結構解決設備和軟件如何與網絡連 接并進行注冊等基本問題。Jini規范n基礎結構的第一種要素稱作Discovery and Join,它解決設備和應用

30、程序在對網絡一無所 知的情況下如何向網絡進行首次注冊這樣的難 題。n基礎結構的第二個要素是Lookup (搜索)。 Lookup可被看作網絡中所有服務的公告板。nNetwork Services -網絡服務nOther Services -其它服務nLeasing -租用nTransactions -交易nDistributed Event-分布式事件nOther OS -其它操作系統nOther CPU -其它CPU Jini規范nDiscovery and Joinn設備或應用程序插入網絡后需要完成的 第一個任務就是發現該網絡,它就通過 一個眾所周知的端口向網絡發送一個512 字節的多路廣

31、播Discovery包。在其它信 息中,該包包含對自己的引用。Jini規范nJini Lookup在眾所周知的端口上進行監聽。當接 收到Discovery包后,Lookup就利用該設備的接口 將Lookup的接口傳遞回插接的設備或應用程序。n現在,該設備或應用程序已經發現了該網絡,并 準備將其所有特性上載到Jini Lookup。上載特性 是Discovery and Join中Join這方面的特性。n現在該設備或應用程序使用在Discovery階段所接 收到的Lookup接口與網絡相連。上載到Lookup的 特性包括該設備或應用程序所提供的所有增值服 務(如驅動程序、幫助向導、屬性等)。nL

32、ookup是網絡上所有服務的網絡公告板。Lookup 不但存儲著指向網絡上服務的指針,而且還存儲 著這些服務的代碼和/或代碼指針。Jini規范n例如,當打印機向Lookup注冊時,打印機將打印機驅 動程序或驅動程序接口上載到Lookup。當客戶機需要 使用打印機時,該驅動程序和驅動程序接口就會從 Lookup下載到客戶機。這樣,就不必事先把驅動程序 裝載到客戶機上。n打印機還可能把其它增值服務裝載入Lookup。例如, 打印機可能存儲關于自己的屬性(如它是否支持 postscript,或它是否為彩色打印機)。打印機還可能存 儲可在客戶機上運行的幫助向導。n如果網絡上沒有Lookup,則網絡就會

33、使用一個Peer Lookup (對等Lookup )程序。當需要服務的客戶機在 網絡上找不到Lookup時,Peer Lookup就開始工作。在 這種情況下,客戶機可發送與Lookup所用的相同的 Discovery and Join包,并要求任何服務供應商進行注 冊。隨后,服務供應商就會在客戶機上注冊,Jini規范n分布式編程可提供租用、分布式交易和分布式 事件。n租用租用與租用一套公寓很類似。我們在租用 一套公寓時,一般會商定使用該公寓的時間。 類似地,在Jini中,對象彼此之間商定租期。 例如,當某設備使用Discovery and Join協議發 現網絡時,它就注冊一段租用時間。在租

34、約到 期之前,該設備必須重新商定租期。這樣,如 果租約到期或設備拔下后,該設備在Lookup中 的記錄就會被自動刪除。這就是分布式垃圾收 集的工作原理。Jini規范n分布式交易在分布式Java環境中,有時需要一種很簡 便的方法,來確保在整個交易完成之前,在該交易中 發生的所有事件都被真正提交了(兩階段提交)。n為便于進行此類分布式計算,Jini提供了一種簡單的 Java API。該API可使對象起動一個能管理交易的交易 管理器。每個參與交易的對象都向交易管理器注冊。n當交易發生時,如果某個參與的對象說,交易中的某 個事件沒有發生,則此信息就被送回交易管理器。隨 后,交易管理器就告訴所有參與的對

35、象回滾(rool back)到前一個已知狀態。類似地,如果所有對象都 完成了其交易的過程,則整個交易就向前進行。nJini上的網絡服務在Jini基礎結構和分布式編程之上, 可提供便于分布式計算的網絡服務。JavaSpace就是這 樣的一種網絡服務。Jini規范n分布式事件在單一的計算機中,事件肯定能被 接收方接收到,序列也肯定能按照順序進行。n但在分布式環境中,分布的事件可能不是按照 順序被接收,或者,某個事件還可能丟失。n為便于在Java環境中處理分布的事件,Jini為 分布的事件提供了一個簡單的Java API。例 如,當一個分布的事件發生時,該事件都帶有 一個事件號和序列號。利用這種信息

36、,接收方 就能檢查事件是否丟失(序列號丟失)或事件是 否按照順序接收(序列號順序不對)到。第 5章:分布式對象和遠程調用n引言n分布式對象間的通信n遠程過程調用Remote procedure calln事件與通知Events and notificationsnJava RMI 實例研究n總結Java RMI 實例研究nremote method invocation(RMI)n出現于Jdk1.1(1997.02),在Jdk1.2中改進n定位:nAccess to Remote ObjectsnClient-Server ProtocolnHigh-level APInJava-to-Jav

37、a onlynTransparentnLightweightJava RMI 實例研究n從RPC到RMIn變化:n從過程(靜態)-面向對象(動態)n從函數調用-對實例的操作n問題:n誰來創建實例對象?什么時候創建?如何取得 對象的引用?Java RMI 實例研究nRMI系統由以下幾個部分組成:n運行遠程服務的服務器n需要遠程服務的客戶端程序n遠程服務的接口定義(Remote Interface)n遠程服務的實現(Remote Service)nStub和Skeleton文件nRMI命名服務,使得客戶端可以發現遠 程服務Java RMI 實例研究nRMI編程n編寫并編譯接口的Java代碼n編寫并

38、編譯實現類的Java代碼n利用RMIC從實現類產生Stub和Skeleton類 文件n啟動注冊服務n編寫遠程服務主機(host)程序的Java代 碼,運行之n開發RMI客戶端程序的Java代碼,運行之Java RMI 實例研究nRMI應用通常由兩部分組成:server, clientn服務程序:創建遠程對象,建立這些對 象的引用,等待來自客戶端的調用n客戶端程序:取得遠程對象的遠程引 用,調用其方法.nRMI提供了server和client信息傳遞的機制nRMI的這種應用被稱為分布式對象應用Java RMI 實例研究-定義接口遠程接口:public interface compute exte

39、nds Remote public int add(int x, int y)throws RemoteException;Java RMI 實例研究-開發遠程對象public class AdderImpl extends UnicastRemoteObjectimplements Compute public AdderImpl() throws RemoteException public int add(int x, int y)throws RemoteException return x + y;Java RMI 實例研究-編譯遠程類Java RMI 實例研究-生成stubs和sk

40、eletonnStubs和skeletons 利用rmic編譯器產生nStub和skeleton類是在運行時確定,并動態加載的Java RMI 實例研究-參數的類型n基本類型n值傳遞n遠程對象n傳遞引用n非遠程對象n值傳遞n對象序列化(Object Serialization)n把對象寫成字節序列n寫入流( Stream)n在另一端重建n根據舊的數據創建一個全新的對象Java RMI 實例研究-注冊n命名和查找遠程對象n服務器可以注冊它們的對象n客戶端可以發現服務對象并且獲取遠程 引用n注冊器是運行在主機上的進程Java RMI 實例研究-注冊nRMI包含了一個簡單的目錄服務,稱為 RMI R

41、egistry, 它n運行在每個有遠程服務對象的主機上n接受服務查詢請求,缺省端口是1099.(object servers will bedynamically assigned ports by theRMI runtime)n支持stub代碼的動態下載Java RMI 實例研究-注冊nServer-siden創建一個實現遠程服務的本地對象n導出該對象給RMI (創建一個偵聽服 務,等待客戶端的連接).n用一個公開的名稱,將該對象注冊到 RMI Registry中Java RMI 實例研究-注冊nClient-siden使用方法lookup()查詢注冊器,參數是 URL:rmi:/:/該方

42、法返回服務對象的遠程引用Java RMI 實例研究-工作過程Java RMI 實例研究-工作過程 Java RMI 實例研究-工作過程Java RMI 實例研究-工作過程 一個RMI的分布式應用的實例n一個分布式計算引擎提供計算能力,客戶端將計算任務提交給引擎計算,提交的任務要包括:計算步驟,計算引擎將計算結果返回。一個RMI的分布式應用的實例用RMI編寫一個分布式應用, 有以下三個核心問題:n定位遠程對象1. 一個應用可以利用RMI的名字服務功能注冊其遠程 對象。2. 可以象操作普通對象一樣傳送并返回一個運程對象 的引用。n與遠程對象通信:n底層的通信由RMI實現,對于系統開發人員來說, 遠

43、程調用和標準的Java方法調用沒有什么區別。n為需要傳遞的對象裝載類的字節碼nRMI允許調用者向遠程對象傳遞一個對象,因此 RMI提供這種裝載對象的機制。一個RMI的分布式應用的實例n分布特性:nEngin獨立開發,并運行,task后定義.寫engin時不對 執行什么任務作任何規定.任務可以是任意定制的.n前提條件:n定義任務的類,要規定任務的實現步驟,使得這個任 務能夠提交給engin去執行.使用server上的 CPU 資 源.n技術支持:RMI的動態裝載功能.一個RMI的分布式應用的實例n設計一個服務器n核心協議:提交任務,執行任務,返回結果n協議的表現形式: engin taskn不同

44、類型的任務,只要他們實現了Task類 型,就可以在engin上運行.n實現這個接口的類,可以包含任何任務計 算需要的數據以及和任何任務計算需要 的方法一個RMI的分布式應用的實例nCompute engin的設計要考慮以下問題:1. compute engine是一個類 ComputeEngine ,它實現 了 Compute接口,只要調用該類的方法 executeTask, 任務就能提交上來.2. 提交任務的Client 端程序并不知道任務是被下載 到engin上執行的.因此client在定義任務時并不需 要包含如何安裝的server端的代碼.3. 返回類型是對象,如果結果是基本類型,需要轉

45、化成 相應的對等類.4. 用規定任務如何執行的代碼填寫execute方法.一個RMI的分布式應用的實例 一個RMI的分布式應用的實例一般說來,實現一個遠程接口的類至少有以 下步驟:1. 聲明遠程接口2. 為遠程對象定義構造函數3. 實現遠程方法4. engin中端創建對象的工作可以在實現遠程接口類的main函數中實現:n創建并安裝安全管理器n創建一個或更多的遠程對象的實例n至少注冊一個遠程對象npackage engine;npublic class ComputeEngine extends UnicastRemoteObject implements Computen public Com

46、puteEngine() throws RemoteExceptionn super(); npublic Object executeTask(Task t)n return t.execute(); npublic static void main(String args)n if (System.getSecurityManager() = null)n System.setSecurityManager(new RMISecurityManager(); String name = /host/Compute;n一個RMI的分布式應用的實例n在構造函數中,通過super(), a Un

47、icastRemoteObject 被啟動,即它可以偵聽客戶端來的請求輸入n只有一個遠程方法,參數是客戶端遠程調用這個方法 時傳來的任務.這個任務被下載到engin,遠程方法的 內容就是調用客戶端任務的方法,并把結果回送給調 用者.實際上這個結果是在客戶的任務的方法中體現 的.一個RMI的分布式應用的實例n參數傳遞規則:1. 遠程對象通常通過引用傳遞.一個遠程對 象的引用是一個stub,它是客戶端的代理. 它實現遠程對象中的遠程接口的內容2. 本地對象通過串行化拷貝到目的. 如果不 作制定,對象的所有成員都將被拷貝.一個RMI的分布式應用的實例 一旦服務器用日RMI注冊了,main方法 就存在

48、了,不需要一個守護線程工作維 護服務器的工作狀態,只要有一個computer engin的引用在另一個虛擬機,computer engin就不會關閉一個RMI的分布式應用的實例n實現一個客戶程序n目標:創建一個任務,并規定如何執行這個任務。ntask不是遠程接口,但是需要傳遞到服務 器,因此用序列化。 一個RMI的分布式應用的實例ncomputePi的作用1. 調用遠程方法,獲得這個方法的引用2. 生成一個任務3. 要求任務被執行npackage client;npublic class ComputePi npublic static void main(String args) nif (

49、System.getSecurityManager() = null)n System.setSecurityManager(new RMISecurityManager(); ntry String name = / + args0 + /Compute;nCompute comp = (Compute) Naming.lookup(name);nPi task = new Pi(Integer.parseInt(args1);nBigDecimal pi = (BigDecimal) (comp.executeTask(task);n catch (Exception e) ne.prin

50、tStackTrace();nn一個RMI的分布式應用的實例npackage client;npublic class Pi implements Task nprivate static final BigDecimal ZERO = BigDecimal.valueOf(0);nprivate static final BigDecimal ONE = BigDecimal.valueOf(1);nprivate static final BigDecimal FOUR = BigDecimal.valueOf(4);nprivate static final int roundingMo

51、de = BigDecimal.ROUND_HALF_EVEN;npublic Pi(int digits)n this.digits = digits; npublic Object execute()n return computePi(digits); n*n* pi/4 = 4*arctan(1/5) - arctan(1/239)n*npublic static BigDecimal computePi(int digits) nint scale = digits + 5;nBigDecimal arctan1_5 = arctan(5, scale);nBigDecimal arctan1_239 = arctan(239, scale);nBigDec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論