讀《J2EE Development without EJB》 筆記六

          Posted on 2006-01-17 16:05 JDeodar 閱讀(485) 評論(0)  編輯  收藏 所屬分類: J2EE
          Remoting -- 遠(yuǎn)程調(diào)用

          分布式計(jì)算第一法則:不要分布你的對象--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)要求。
          為了避免讓客戶端直接針對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)步就在于對web services的支持,其下的基礎(chǔ)規(guī)則是WSDL(Web Service Description Lanuage,web service描述語言)和SOAP(Simple Object Access Protocol,簡單對象訪問協(xié)議)。

          WSDL是一種XML格式,用于將網(wǎng)絡(luò)服務(wù)描述為一組對消息的端點(diǎn)操作,消息中包含面向文檔或者面向過程的信息。操作和消息都將被抽象地描述,并隨后被綁定到具體的網(wǎng)絡(luò)協(xié)議和消息格式,用于定義一個(gè)端點(diǎn)。彼此連接的具體端點(diǎn)就可以組合為抽象端點(diǎn)(服務(wù))。
          --WSDL就是對遠(yuǎn)程服務(wù)的平臺(tái)無關(guān)的描述。

          A、訪問web service
          每個(gè)基于WSDL的web service都由一個(gè)服務(wù)(service)構(gòu)成,其中定義了一個(gè)或者多個(gè)端口(port)。每個(gè)端口對應(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)模型。

          四、輕量級遠(yuǎn)程方案:Hessian和Burlap

          RMI環(huán)境的配置相當(dāng)麻煩,并且使用的網(wǎng)絡(luò)端口常常被防火墻禁止。基于WSDL和SOAP的web service又很難以一種可移植的方式導(dǎo)出,并且由于它們的協(xié)議臃腫冗長,會(huì)浪費(fèi)大量的帶寬。基于HTTP的輕量級遠(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

          主站蜘蛛池模板: 濮阳县| 鄂托克旗| 山东| 隆尧县| 阿克苏市| 普宁市| 丹凤县| 南丹县| 宜川县| 榆中县| 日土县| 元谋县| 阆中市| 蒙山县| 武冈市| 绥芬河市| 淄博市| 乌兰浩特市| 顺义区| 汕尾市| 江都市| 吴堡县| 东安县| 秦皇岛市| 尖扎县| 沙洋县| 北安市| 建水县| 开原市| 西贡区| 明光市| 桃江县| 宁夏| 郓城县| 米脂县| 南涧| 巍山| 林西县| 宁武县| 新绛县| 永济市|