讀《J2EE Development without EJB》 筆記六

          Posted on 2006-01-17 16:05 JDeodar 閱讀(486) 評(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ò)端口常常被防火墻禁止。基于WSDL和SOAP的web service又很難以一種可移植的方式導(dǎo)出,并且由于它們的協(xié)議臃腫冗長,會(huì)浪費(fèi)大量的帶寬。基于HTTP的輕量級(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、聲明性、基于角色的安全性

          posts - 10, comments - 2, trackbacks - 0, articles - 0

          Copyright © JDeodar

          主站蜘蛛池模板: 静乐县| 绥芬河市| 达尔| 醴陵市| 全南县| 天津市| 建水县| 和林格尔县| 商都县| 盐津县| 徐水县| 武宁县| 沛县| 内乡县| 巢湖市| 丹江口市| 邹城市| 潮州市| 孝义市| 永寿县| 威远县| 泰顺县| 高清| 洞口县| 齐齐哈尔市| 武乡县| 习水县| 靖宇县| 垫江县| 承德县| 武宁县| 吉首市| 务川| 汉寿县| 洛川县| 客服| 马边| 华池县| 和林格尔县| 定远县| 诸暨市|