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