Posted on 2006-01-17 16:05
JDeodar 閱讀(482)
評(píng)論(0) 編輯 收藏 所屬分類:
J2EE
Remoting -- 遠(yuǎn)程調(diào)用
分布式計(jì)算第一法則:不要分布你的對(duì)象--Martin Fowler《企業(yè)應(yīng)用架構(gòu)模式》
經(jīng)典的Java遠(yuǎn)程方案的根源,RMI(Remote Method Invocation)是JDK1.1中引入的。基于Java的序列化機(jī)制通信協(xié)議時(shí)可接插的。
所有的RMI服務(wù)必須要實(shí)現(xiàn)某個(gè)繼承自java.rmi.Remote的接口。
保持遠(yuǎn)程通信無狀態(tài)——這也是任何遠(yuǎn)程調(diào)用應(yīng)該謹(jǐn)記的法則。如果真需要有狀態(tài)的會(huì)話,可以考慮用EJB的有狀態(tài)的Session Beans,或是具備HttpSession功能的web service。
一、經(jīng)典的J2SE遠(yuǎn)程方案:RMI
A、訪問和曝露RMI服務(wù)
訪問RMI服務(wù),只需通過java.rmi.Naming查找一個(gè)RMI的URL地址即可。每次查找都將返回一個(gè)服務(wù)器端RMI服務(wù)實(shí)例的一個(gè)代理:和EJB不同,沒有組件池的概念。
Spring環(huán)境中的設(shè)置
在Spring的bean工廠或應(yīng)用上下文中,可以用RmiProxyFactoryBean類來定義RMI服務(wù)的客戶端代理。
也可以借助RmiServiceExporter類曝露為RMI服務(wù),不過被曝露的bean組件必須遵循RMI服務(wù)的實(shí)現(xiàn)要求。
為了避免讓客戶端直接針對(duì)RMI接口編程,RMI服務(wù)的實(shí)現(xiàn)類在實(shí)現(xiàn)RMI服務(wù)接口之外,也可以實(shí)現(xiàn)與RMI無關(guān)的業(yè)務(wù)接口(business interface)[同樣方法的業(yè)務(wù)接口]。這樣,客戶端只需要依賴普通的業(yè)務(wù)接口,不需要依賴RMI接口。
壞處:必須時(shí)刻保持“業(yè)務(wù)接口”與“遠(yuǎn)程接口”之間的同步。
B、用RMI調(diào)用器實(shí)現(xiàn)透明遠(yuǎn)程調(diào)用
借助Java反射機(jī)制,通過RMI調(diào)用器(RMI invoker)發(fā)送方法調(diào)用。
二、經(jīng)典的J2EE遠(yuǎn)程機(jī)制:EJB
三、基于WSDL的web Services:JAX-RPC
J2EE1.4版本最大的進(jìn)步就在于對(duì)web services的支持,其下的基礎(chǔ)規(guī)則是WSDL(Web Service Description Lanuage,web service描述語言)和SOAP(Simple Object Access Protocol,簡單對(duì)象訪問協(xié)議)。
WSDL是一種XML格式,用于將網(wǎng)絡(luò)服務(wù)描述為一組對(duì)消息的端點(diǎn)操作,消息中包含面向文檔或者面向過程的信息。操作和消息都將被抽象地描述,并隨后被綁定到具體的網(wǎng)絡(luò)協(xié)議和消息格式,用于定義一個(gè)端點(diǎn)。彼此連接的具體端點(diǎn)就可以組合為抽象端點(diǎn)(服務(wù))。
--WSDL就是對(duì)遠(yuǎn)程服務(wù)的平臺(tái)無關(guān)的描述。
A、訪問web service
每個(gè)基于WSDL的web service都由一個(gè)服務(wù)(service)構(gòu)成,其中定義了一個(gè)或者多個(gè)端口(port)。每個(gè)端口對(duì)應(yīng)服務(wù)器上的一個(gè)服務(wù)端點(diǎn)(service endpoint),一個(gè)由WSDL定義的web service中可以匯聚多個(gè)端點(diǎn)。這與經(jīng)典的遠(yuǎn)程服務(wù)(EJB)不同,后者不支持這樣的分隔。
為了訪問一個(gè)服務(wù),JAX-RPC需要下列參數(shù):
1、WSDL文檔的URL
2、WSDL服務(wù)的命名空間URL
3、WSDL服務(wù)的名稱
JAX-RPC提供了三種訪問服務(wù)端點(diǎn)的途徑:
1、靜態(tài)存根:--不推薦
2、動(dòng)態(tài)代理:--一種通過Java接口訪問遠(yuǎn)程服務(wù)的有效途徑,并且是可配置的。
3、動(dòng)態(tài)調(diào)用接口(DII):--提供了最大限度的解耦。
B、Spring環(huán)境中的配置
曝露一個(gè)JAX-RPC服務(wù)
C、Servlet和EJB端點(diǎn)
JAX-RPC規(guī)范描述了兩種服務(wù)端點(diǎn)的實(shí)現(xiàn):servlet端點(diǎn)(Servlet endpoint)模型和EJB端點(diǎn)(EJB endpoint)模型。
四、輕量級(jí)遠(yuǎn)程方案:Hessian和Burlap
RMI環(huán)境的配置相當(dāng)麻煩,并且使用的網(wǎng)絡(luò)端口常常被防火墻禁止?;赪SDL和SOAP的web service又很難以一種可移植的方式導(dǎo)出,并且由于它們的協(xié)議臃腫冗長,會(huì)浪費(fèi)大量的帶寬?;贖TTP的輕量級(jí)遠(yuǎn)程調(diào)用協(xié)議解決了上述兩個(gè)問題:它們可以在任何標(biāo)準(zhǔn)的servlet容器之上運(yùn)行,并且可以穿越任何防火墻。
1、訪問和曝露Hessian和Burlap服務(wù)
2、在Spring環(huán)境中的配置
--JPetStore展示Spring環(huán)境中使用Hessian和Burlap、RMI和JAX-RPC(借助Apache Axis)來曝露遠(yuǎn)程服務(wù),同時(shí)提供遠(yuǎn)程服務(wù)客戶端的示例。
Replacing Other EJB Services -- 替換其他的EJB服務(wù)
1、持久化
2、遠(yuǎn)程調(diào)用機(jī)制
3、CMT
4、線程管理
5、SLSB實(shí)例池
6、聲明性、基于角色的安全性