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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

20、ocket端口,接受請求n服務(wù)端的運行系統(tǒng)調(diào)用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 調(diào)用信息主體形式如下: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 小結(jié)nRPC把通信接口抽象成程序調(diào)用,引入 Stub,使得調(diào)用遠程函數(shù)看起來就像本地函 數(shù)調(diào)用。nDCE RPC引入了IDL語言用于描述程序接 口,經(jīng)過編譯之后得到st

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

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

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

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

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

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

31、播Discovery包。在其它信 息中,該包包含對自己的引用。Jini規(guī)范nJini Lookup在眾所周知的端口上進行監(jiān)聽。當(dāng)接 收到Discovery包后,Lookup就利用該設(shè)備的接口 將Lookup的接口傳遞回插接的設(shè)備或應(yīng)用程序。n現(xiàn)在,該設(shè)備或應(yīng)用程序已經(jīng)發(fā)現(xiàn)了該網(wǎng)絡(luò),并 準備將其所有特性上載到Jini Lookup。上載特性 是Discovery and Join中Join這方面的特性。n現(xiàn)在該設(shè)備或應(yīng)用程序使用在Discovery階段所接 收到的Lookup接口與網(wǎng)絡(luò)相連。上載到Lookup的 特性包括該設(shè)備或應(yīng)用程序所提供的所有增值服 務(wù)(如驅(qū)動程序、幫助向?qū)А傩缘?。nL

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

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

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

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

36、,接收方 就能檢查事件是否丟失(序列號丟失)或事件是 否按照順序接收(序列號順序不對)到。第 5章:分布式對象和遠程調(diào)用n引言n分布式對象間的通信n遠程過程調(diào)用Remote procedure calln事件與通知Events and notificationsnJava RMI 實例研究n總結(jié)Java RMI 實例研究nremote method invocation(RMI)n出現(xià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從過程(靜態(tài))-面向?qū)ο螅▌討B(tài))n從函數(shù)調(diào)用-對實例的操作n問題:n誰來創(chuàng)建實例對象?什么時候創(chuàng)建?如何取得 對象的引用?Java RMI 實例研究nRMI系統(tǒng)由以下幾個部分組成:n運行遠程服務(wù)的服務(wù)器n需要遠程服務(wù)的客戶端程序n遠程服務(wù)的接口定義(Remote Interface)n遠程服務(wù)的實現(xiàn)(Remote Service)nStub和Skeleton文件nRMI命名服務(wù),使得客戶端可以發(fā)現(xiàn)遠 程服務(wù)Java RMI 實例研究nRMI編程n編寫并編譯接口的Java代碼n編寫并

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

39、nds Remote public int add(int x, int y)throws RemoteException;Java RMI 實例研究-開發(fā)遠程對象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編譯器產(chǎn)生nStub和skeleton類是在運行時確定,并動態(tài)加載的Java RMI 實例研究-參數(shù)的類型n基本類型n值傳遞n遠程對象n傳遞引用n非遠程對象n值傳遞n對象序列化(Object Serialization)n把對象寫成字節(jié)序列n寫入流( Stream)n在另一端重建n根據(jù)舊的數(shù)據(jù)創(chuàng)建一個全新的對象Java RMI 實例研究-注冊n命名和查找遠程對象n服務(wù)器可以注冊它們的對象n客戶端可以發(fā)現(xiàn)服務(wù)對象并且獲取遠程 引用n注冊器是運行在主機上的進程Java RMI 實例研究-注冊nRMI包含了一個簡單的目錄服務(wù),稱為 RMI R

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

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

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

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

45、化成 相應(yīng)的對等類.4. 用規(guī)定任務(wù)如何執(zhí)行的代碼填寫execute方法.一個RMI的分布式應(yīng)用的實例 一個RMI的分布式應(yīng)用的實例一般說來,實現(xiàn)一個遠程接口的類至少有以 下步驟:1. 聲明遠程接口2. 為遠程對象定義構(gòu)造函數(shù)3. 實現(xiàn)遠程方法4. engin中端創(chuàng)建對象的工作可以在實現(xiàn)遠程接口類的main函數(shù)中實現(xiàn):n創(chuàng)建并安裝安全管理器n創(chuàng)建一個或更多的遠程對象的實例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的分布式應(yīng)用的實例n在構(gòu)造函數(shù)中,通過super(), a Un

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

48、了,不需要一個守護線程工作維 護服務(wù)器的工作狀態(tài),只要有一個computer engin的引用在另一個虛擬機,computer engin就不會關(guān)閉一個RMI的分布式應(yīng)用的實例n實現(xiàn)一個客戶程序n目標:創(chuàng)建一個任務(wù),并規(guī)定如何執(zhí)行這個任務(wù)。ntask不是遠程接口,但是需要傳遞到服務(wù) 器,因此用序列化。 一個RMI的分布式應(yīng)用的實例ncomputePi的作用1. 調(diào)用遠程方法,獲得這個方法的引用2. 生成一個任務(wù)3. 要求任務(wù)被執(zhí)行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的分布式應(yīng)用的實例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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論