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


/**//*
* Hello服務(wù)Endpoint接口
* 需要注意的是,這里使用的是EJB2.1無狀態(tài)會(huì)話Bean,它作為WEB服務(wù)端點(diǎn)時(shí)可以不提供Home接口和Remote
* Locale接口,它提供的是web服務(wù)端點(diǎn)接口,這個(gè)接口擴(kuò)展了Remote接口。
*/

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

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