Web服務是構建B2B應用最為重要的利器之一,使用它能夠構建、集成大型的系統。這一切都是通過發送XML消息給已定義的模塊化接口完成的。借助于無狀態會話Bean能夠構建Web服務。為實現Java客戶對Web服務的訪問,需要使用到JAX-RPC.Web服務是構建SOA的一種方式。SOA是架構方法,它能夠將各種異構應用集成起來,并組成更大的分布式應用,最后通過服務接口的形式將整個應用支撐起來。
服務提供者創建抽象服務定義,并將它發布到服務注冊器中。對于WEB服務而言,服務定義是通過WSDL文件給出的;服務注冊器需要遵循UDDI標準。服務請求者可以使用一套查詢機制從服務注冊器中查找到WSDL文件,如果找到合適的服務定義,請求者將綁定到服務提供者上。
服務接口類似于對象或EJB接口。但是對于WEB服務而言,服務接口更為靈活。比如服務實現和客戶處于松耦合的關系,而這在其他EJB應用或分布式應用中是實現不了的。這種松耦合使得客戶和服務實現能夠運行在不同平臺上,比如Microsoft.NET客戶能夠訪問到J2EE應用服務器中所運行的服務。另外,相比Java對象而言,Web服務實體的粒度更粗。
通過標準化接口,能夠加強SOA的模塊化;通過松耦合,能夠提高SOA的靈活性;通過XML,能夠增強SOA擴展性。在B2B場合,這些都是很重要的因素。WEB服務能夠在那些使用了多種異構平臺的企業應用中大顯身手。所有的WEB服務都是構建在XML和Internet協議上的。EJB只能夠采用Java開發。如果使用其他語言開發應用,互操作如何實現?
組成WEB服務的事實標準可以通過如下等式表達:
Web服務 = WSDL+SOAP+UDDI
1、WSDL語言比Java更抽象、廣度更大。HelloWorldWSDL中存在<service>標簽,它能夠在具體地址提供若干<port>.<port>代表了服務接口及對具體協議的綁定。
2、服務描述包含了Endpoint地址。WSDL是由Java接口和對象引用構成的。換句話說,Web服務不存在真正的實體,它們不是對象,因此必須將它們按照模塊化對待。
3、根據輸入、輸出定義操作。開發者需要將輸入、輸出消息表示為XML元素。
4、采用的綁定是SOAP綁定。到目前為止,只能采用SOAP綁定。也請注意,<soap:binding>標簽還存在style="rpc"屬性,因此可以看出style還存在其他取值,目前,用于交換SOAP消息的另一種風格是文檔風格(document-style)。文檔風格意味著在SOAP消息體中不在包含對具體操作的描述。
SOAP協議為Web服務和它們的客戶定義了XML消息格式。SOAP消息格式非常簡單。它實際包含兩部分內容:其一,HTTP POST請求頭信息。其二,XML文檔,這就是SOAP信封(Envelope)。另外,通過上述兩分SOAP消息,我們還想表達Web服務中的另一個重要概念。從SOAP協議的使用過程來看,它非常輕量,因為它對處于交互中的客戶和服務沒有任何限制。但是,從SOAP協議的大小、性能角度考慮,它并不輕量。如果不壓縮SOAP消息,則需要在網絡上傳遞大量的SOAP數據消息。因此,采用二進制更為明智,比如CORAB的IIOP協議。對于含有大量的SOAP數據消息進行壓包和解包操作將耗費大量的CPU時間。請不要忘記,WEB服務的誕生背景,它只是為集成應用而來的,而不是替換現有的高性能中間件平臺技術。否則,就不需要使用web服務了。
XML文檔和平臺無關性,借助于標準化的XML文檔,WEB服務能夠幫助集成異構的分布式系統。在實際應用開發過程中,它具有許多優勢,比如松耦合、平臺無關性、遵循XML方面的標準、能夠合并不同的XML技術等。借助于XML能夠實現應用和中間件平臺的松耦合,這是很重要的優勢。
比如在開發EJB組件時,客戶和服務器端同事需要使用組件接口。一旦組件接口發生變動,比如需要往方法簽名中新增參數,則EJB組件本身需要重新構建、集成、部署。當然,客戶也逃脫不了重新編譯的命運。因此,它們之間并沒有實現松耦合,開發者不能獨立的開發應用組件。否則,一旦某些組件發生變動,應用的其他部分也需要變動。我們都希望應用具有良好的擴展性。對基于IIOP的請求消息而言,所有的參與者必須使用相同的類型信息,否則不能夠正確對消息進行解包操作。而且,在IIOP技術領域中,應用必須能夠理解消息的所有內容。如果基于XML和XML消息開發應用,則這些限制將不復存在。
J2EE平臺技術對WEB服務提供了一流的支持能力。無論WEB服務實現,還是WEB服務客戶,都可以使用JAVA語言開發完成。在J2EE中,使用WEB服務同RMI、RMI-IIOP并沒有多大區別。他們都將具體傳輸層屏蔽掉,使得開發者能夠專注于業務邏輯。
JSR921規范,即實現企業WEB服務,定義了WEB服務編程模型。它使用術語port組件,描述web服務的服務器端視圖。它是服務接口的java實現。而且,它遵循服務接口到Java的映射,并提供了相應的Java實現。需要將它部署并運行在容器中。使用EJB開發WEB服務需要創建若干port組件。其中,還需要提供若干XML部署描述符。當然,直接基于EJB實現WEB服務是J2EE平臺中實現WEB服務的最大優勢。
JAX-RPC服務端點接口,現在,來開發另一遠程接口,它將企業Bean所提供的業務方法都列舉出來,我們稱之為服務Endpoint接口(Service Endpoint Interface,SEI),下面給出了代碼。
package com.testproject.ejb.web;


/**//*
* Hello服務Endpoint接口
* 需要注意的是,這里使用的是EJB2.1無狀態會話Bean,它作為WEB服務端點時可以不提供Home接口和Remote
* Locale接口,它提供的是web服務端點接口,這個接口擴展了Remote接口。
*/

public interface HelloInterface extends java.rmi.Remote
{
public String hello()throws java.rmi.RemoteException;
}

JAX-RPC要求WEB服務提供SEI,EJB容器同WEB服務交互時需要使用它。JAX-RPC規范要求SEI遵循如下規則:
1、接口必須間接或直接繼承java.rmi.Remote.
2、所有的方法必須拋出java.rmi.RemoteException.
3、方法參數和返回類型必須是JAX-RPC支持的JAVA類型。
4、SEI中不能包含敞亮。
在J2EE1.4平臺中,可以對EJB技術進行了升級,使得無狀態會話Bean可以直接部署為Web服務端點。這樣,在J2ee1.4平臺下,開發Web服務將更加簡單。這樣,EJB2.1中的無狀態會話Bean可以有3種不同的客戶端:本地接口的客戶端、遠程接口的客戶端和web服務客戶端。EJB的WEB服務客戶端視圖通過WSDL文檔描述。
待續......
posted on 2009-11-09 10:22
王永慶 閱讀(172)
評論(0) 編輯 收藏 所屬分類:
EJB學習筆記