Web Service初探(推薦)<br>
<br>
<br>
<br>
簡介<br>
<br>
回顧過去的六年,難以想象如果沒有互聯(lián)網(wǎng)的話,網(wǎng)絡計算會變成什么樣。更早的超文本模式失敗了,而互聯(lián)網(wǎng)成功了,這其中最基本的原因可以歸結(jié)為:互聯(lián)網(wǎng)簡單且無處不在。從服務提供者(如網(wǎng)上商店)的角度來看,只要你會打字,你就可以接受服務。從服務API的角度來看,互聯(lián)網(wǎng)上絕大多數(shù)的活動都可以由三種方法(GET, POST, 和PUT ) 以及一種標記語言來完成。Web Service的興起正是基于這樣一個事實:Web不僅可以作為一個信息平臺 ,也可以作為一個服務平臺。 <br>
這里的“Services”不是指Amazon.com提供的那種粗糙的服務,而是一種組件服務,其他人可以用來構造更強大的服務。例如,Microsoft提供了Passport服務,提供Web上的認證功能,所以,類似華盛頓郵報之類的電子報紙就不必自己開發(fā)認證服務,只要交給Passport做就可以了。當然,這只是一個假設。<br>
<br>
Oracle的動態(tài)服務白皮書(dynamic services whitepaper)提供了更多組件服務的例子:匯率轉(zhuǎn)換,翻譯,貨物運輸?shù)鹊取BM對Web Service有一個更為正式的定義:<br>
<br>
Web ervices 是一種新的web應用程序分支,他們是自包含、自描述、模塊化的應用,可以發(fā)布、定位、通過web調(diào)用。Web service可以執(zhí)行從簡單的請求到復雜商務處理的任何功能。一旦部署以后,其他web services應用程序可以發(fā)現(xiàn)并調(diào)用它部署的服務。<br>
<br>
IBM的Web Service指南接著說在幾年前Web Service還是一個效率低下無法引起人們興趣的概念。但是隨著帶寬和存儲變的更為便宜,內(nèi)容更為動態(tài)化,對不同平臺上廣泛而多樣的計算設備的集成的要求也更為強烈,同時,也使得人們對代價(帶寬和存儲)不那么敏感。<br>
<br>
當我已經(jīng)有了我中意的中間件平臺(RMI, Jini, CORBA, DCOM 等等)時,為什么還要為Web而煩惱呢?中間件確實提供了強大的服務實現(xiàn)手段,但是,他們當中沒有一個是絕對的勝利者。Web作為信息發(fā)布者的力量就在于簡單且無處不在,這對解決現(xiàn)在這樣一個分裂中間件世界很重要。Web通過在傳統(tǒng)中間件平臺上更有效實現(xiàn)的Services,來提供一個統(tǒng)一且廣泛適用的接口,這樣就改善了這個平臺。<br>
<br>
從一個N層應用程序結(jié)構的角度來看,web service只是一個方便程序訪問的包裝,服務還是要靠中間件來實現(xiàn)。訪問包括服務請求處理(監(jiān)聽者)和一個支持商業(yè)邏輯操作的接口,商業(yè)邏輯本身是由傳統(tǒng)的中間件平臺實現(xiàn)的。<br>
<br>
Web Services平臺<br>
<br>
那么什么是web service 平臺呢?最基本的平臺是XML加HTTP。HTTP是一個在Internet上廣泛使用的協(xié)議。XML是一種元語言,你可以用它書寫特定的語言來描述客戶和服務之間或者組件和復雜服務之間的交互。在web server之后,XML格式的消息被轉(zhuǎn)變成中間件的請求,返回的結(jié)果也會轉(zhuǎn)化成XML格式。 <br>
<br>
你可能會問,這與說CORBA是IDL加上RPC不是一樣嗎?這個平臺到底如何支持service的發(fā)現(xiàn),事務,安全,認證等等基本功能,以使它真正成為一個平臺呢? 下面我們將講述這一點。 <br>
<br>
有必要增加一些服務,同時保持簡單性和普遍性,來把Web構建成一個功能更強大的平臺。可以認為功能全面的web services平臺是XML+HTTP+SOAP+WSDL+UDDI。在更高層次上,可能還要加上一些尚未廣泛接受的技術如XAML,XLANG, XKMS,和XFS。<br>
<br>
以下是對這些平臺要素的簡要描述。需要指出的是,這些還是發(fā)展中的技術,很多時候?qū)σ粋€問題會有多種解決方案。<br>
<br>
SOAP (遠程調(diào)用) <br>
UDDI (貿(mào)易,目錄服務) <br>
WSDL (描述服務特征) <br>
XLANG/XAML (為包括多種web services的復雜web事務提供支持) <br>
XKMS (XML Key Management Specification) - 支持認證和注冊,這個工作還在進展之中 <br>
<br>
SOAP<br>
<br>
SOAP是一個協(xié)議規(guī)范,定義了傳遞XML-encoded數(shù)據(jù)時的統(tǒng)一方式。它還定義了使用HTTP作為底層通信協(xié)議時執(zhí)行遠程調(diào)用(RPC)的方法。<br>
<br>
SOAP的興起是基于這樣一種認識,無論現(xiàn)在的中間件是如何的好,他們都需要一個WAN包裝。以XML格式發(fā)送消息有很多好處,如能夠確保互用性。中間件使用者看來愿意容忍解析和序列化XML文檔的代價,因為這可以讓他們的軟件使用范圍更寬。<br>
<br>
IBM, Microsoft, UserLand,和DevelopMentor在2000年向W3C提交了SOAP,并成為W3C的Note,SOAP更長遠的發(fā)展規(guī)劃現(xiàn)在是由W3C的XML協(xié)議工作組來制定。這有力的表明了直到W3C工作組交付規(guī)范為止,SOAP都將是一個穩(wěn)定的規(guī)范。<br>
<br>
UDDI (Universal Description, Discovery and Integration Service)<br>
<br>
UDDI為客戶提供了動態(tài)查找其它web <br>
<br>
services的機制。使用UDDI接口,商務處理可以動態(tài)的連接到外部的商務合作者提供的服務上。一個UDDI注冊類似于CORBA的trader,也可以把它想象成商業(yè)應用程序的DNS服務。一個UDDI注冊有兩種客戶:要發(fā)布一個服務(和使用接口)的商務應用,以及想要得到特定服務的客戶。下表是UDDI提供服務的概述。UDDI層在SOAP層之上,并假定請求和應答都是以SOAP消息傳送的UDDI對象。下面還包含了一個簡單的查詢。<br>
<br>
<br>
<br>
關于支持全方位的發(fā)現(xiàn)(full-featured discovery),UDDI沒有一個近期的計劃。UDDI希望能夠成為支持其它標準的更高層服務的基礎。UDDI計劃支持更復雜的商務邏輯,包括層次型商業(yè)組織。UDDI有著廣泛的支持,IBM, Ariba,和 <br>
<br>
Microsoft都全力推動它。到目前為止,它還不是一個開放的標準。<br>
<br>
<br>
<br>
UDDI 舉例<br>
<br>
<br>
查詢:下面在SOAP封裝之內(nèi)的查詢,返回Microsoft的詳細信息。<br>
<br>
<br>
<br>
<find_business <br>
<br>
generic="1.0" xmlns="urn:uddi-org:api"> <br>
<br>
<br>
<br>
<br>
face=Arial,Helvetica> <br>
<br>
<name>Microsoft</name> <br>
<br>
<br>
<br>
<br>
face=Arial,Helvetica></find_business><br>
<br>
<br>
<br>
結(jié)果:businessInfo元素中包含了Microsoft注冊的服務信息,也包括這個UDDI服務本身。<br>
<br>
<businessList generic="1.0"<br>
operator="Microsoft Corporation"<br>
truncated="false"<br>
xmlns="urn:uddi-org:api"><br>
<businessInfos><br>
<businessInfo<br>
businessKey="0076B468-EB27-42E5-AC09-9955CFF462A3"><br>
<name>Microsoft Corporation</name><br>
<description xml:lang="en"><br>
Empowering people through great software -<br>
any time, any place and on any device is Microsoft’s <br>
vision. As the worldwide leader in software for personal<br>
and business computing, we strive to produce innovative <br>
products and services that meet our customer’s<br>
</description><br>
<serviceInfos><br>
<serviceInfo<br>
businessKey="0076B468-EB27-42E5-AC09-9955CFF462A3" <br>
serviceKey="1FFE1F71-2AF3-45FB-B788-09AF7FF151A4"><br>
<name>Web services for smart searching</name><br>
</serviceInfo><br>
<serviceInfo<br>
businessKey="0076B468-EB27-42E5-AC09-9955CFF462A3"<br>
serviceKey="8BF2F51F-8ED4-43FE-B665-38D8205D1333"><br>
<name>Electronic Business Integration Services</name><br>
</serviceInfo><br>
<serviceInfo<br>
businessKey="0076B468-EB27-42E5-AC09-9955CFF462A3"<br>
serviceKey="611C5867-384E-4FFD-B49C-28F93A7B4F9B"> <br>
<name>Volume Licensing Select Program</name> <br>
</serviceInfo><br>
<serviceInfo<br>
businessKey="0076B468-EB27-42E5-AC09-9955CFF462A3"<br>
serviceKey="A8E4999A-21A3-47FA-802E-EE50A88B266F"><br>
<name>UDDI Web Sites</name><br>
</serviceInfo> <br>
</serviceInfos><br>
</businessInfo><br>
</businessInfos><br>
</businessList><br>
<br>
WSDL :Web服務定義語言<br>
<br>
WSDL為服務提供者提供了描述構建在不同協(xié)議或編碼方式之上的web <br>
<br>
service請求基本格式的方法。WSDL用來描述一個web <br>
<br>
service能做什么,它的位置在哪里,如何調(diào)用它等等。在假定以SOAP/HTTP/MIME <br>
<br>
作為遠程對象調(diào)用機制的情況下,WSDL會發(fā)揮最大作用。UDDI注冊描述了web <br>
<br>
service的絕大多數(shù)方面,包括服務的綁定細節(jié)。WSDL可以看作是UDDI服務描述的子集。<br>
<br>
<br>
<br>
WSDL將服務定義為一個網(wǎng)絡端點的集合,或者說端口的集合。在WSDL里面,端點及消息的抽象定義與它們具體的網(wǎng)絡實現(xiàn)和數(shù)據(jù)格式綁定是分離的。這樣就可以重用這些抽象定義:消息,需要交換的數(shù)據(jù)的抽象描述;端口類型,操作的抽象集合。針對一個特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范構成一個可重用的綁定。一個端口定義成網(wǎng)絡地址和可重用的綁定的聯(lián)接,端口的集合定義為服務。因此一個WSDL文檔在定義網(wǎng)絡服務的時候使用如下的元素:<br>
類型-- <br>
<br>
使用某種的類型系統(tǒng)(比如XSD)定義數(shù)據(jù)類型的容器 <br>
消息-- 通訊數(shù)據(jù)抽象的有類型的定義 <br>
操作-- <br>
<br>
服務支持的動作的抽象描述 <br>
端口類型-- 一個操作的抽象集合,該操作由一個或多個端點支持 <br>
綁定-- <br>
<br>
針對一個特定端口類型的具體的協(xié)議規(guī)范和數(shù)據(jù)格式規(guī)范 <br>
端口-- 一個單一的端點,定義成一個綁定和一個網(wǎng)絡地址的聯(lián)接 <br>
<br>
<br>
服務-- 相關的端點的集合 <br>
<br>
<br>
<br>
所以,可以這樣說,WSDL給客戶提供了一個模板,方便他們描述和綁定服務。<br>
<br>
<br>
<br>
下面是一個簡單的例子,例子中的服務用來查找Motorala股票的價格。<br>
<br>
服務描述:<br>
<br>
<?xml version="1.0"?><br>
<definitions name="StockQuote"<br>
targetNamespace="http://example.com/stockquote.wsdl"<br>
xmlns:tns="http://example.com/stockquote.wsdl"<br>
xmlns:xsd1="http://example.com/stockquote.xsd"<br>
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"<br>
xmlns="http://schemas.xmlsoap.org/wsdl/"><br>
<types><br>
<schema targetNamespace="http://example.com/stockquote.xsd"<br>
xmlns="http://www.w3.org/1999/XMLSchema"> <br>
<element name="TradePriceRequest"><br>
<complexType><br>
<all><br>
<element name="tickerSymbol" type="string"/><br>
</all> <br>
</complexType> <br>
</element><br>
<element name="TradePrice"> <br>
<complexType> <br>
<all><br>
<element name="price" type="float"/> <br>
</all> <br>
</complexType> <br>
</element> <br>
</schema><br>
</types><br>
<br>
<message name="GetLastTradePriceInput"><br>
<part name="body" element="xsd1:TradePrice"/><br>
</message><br>
<message name="GetLastTradePriceOutput"><br>
<part name="body" element="xsd1:TradePriceResult"/><br>
</message><br>
<br>
<portType name="StockQuotePortType"><br>
<operation name="GetLastTradePrice"><br>
<input message="tns:GetLastTradePriceInput"/><br>
<output message="tns:GetLastTradePriceOutput"/><br>
</operation><br>
</portType><br>
<br>
<binding name="StockQuoteSoapBinding"<br>
type="tns:StockQuotePortType"><br>
<soap:binding style="document"<br>
transport="http://schemas.xmlsoap.org/soap/http"/><br>
<operation name="GetLastTradePrice"><br>
<soap:operation<br>
soapAction="http://example.com/GetLastTradePrice"/> <br>
<input><br>
<soap:body use="literal" <br>
namespace="http://example.com/stockquote.xsd"<br>
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/><br>
</input> <br>
<output><br>
<soap:body use="literal" <br>
namespace="http://example.com/stockquote.xsd"<br>
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
</output> <br>
</operation><br>
</binding><br>
<br>
<service name="StockQuoteService"><br>
<documentation>My first service</documentation><br>
<port name="StockQuotePort" binding="tns:StockQuoteBinding"> <br>
<soap:address location="http://example.com/stockquote"/><br>
</port><br>
</service><br>
<br>
</definitions><br>
<br>
<binding name="StockQuoteServiceBinding" <br>
type="StockQuoteServiceType"> <br>
<soap:binding style="rpc"<br>
transport="http://schemas.xmlsoap.org/soap/http"/><br>
<operation name="getQuote"> <br>
<soap:operation <br>
soapAction="http://www.getquote.com/GetQuote"/><br>
<input><br>
<soap:body type="InMessageRequest"<br>
namespace="urn:live-stock-quotes" <br>
encoding="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
</input><br>
<output><br>
<soap:body type="OutMessageResponse"<br>
encoding="http://schemas.xmlsoap.org/soap/encoding/"/><br>
</output><br>
</operation> <br>
</binding><br>
<service name="StockQuoteService"><br>
<documentation>My first service<br>
</documentation><br>
<port name="StockQuotePort"<br>
binding="tns:StockQuoteBinding"><br>
<soap:address location="http://example.com/stockquote"/><br>
</port><br>
</service><br>
</definitions><br>
<br>
SOAP請求:<br>
<br>
POST /StockQuote HTTP/1.1<br>
Host: www.stockquoteserver.com<br>
Content-Type: text/xml;<br>
charset="utf-8"<br>
Content-Length: nnnn<br>
SOAPAction: "Some-URI"<br>
<br>
<SOAP-ENV:Envelope<br>
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" <br>
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <br>
<SOAP-ENV:Body><br>
<m:GetLastTradePrice<br>
xmlns:m="Some-URI"><br>
<symbol>MOT</symbol><br>
</m:GetLastTradePrice> <br>
</SOAP-ENV:Body><br>
</SOAP-ENV:Envelope><br>
<br>
SOAP應答:<br>
<br>
HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8"<br>
Content-Length: nnnn<br>
<br>
<SOAP-ENV:Envelope<br>
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"<br>
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <br>
<SOAP-ENV:Body><br>
<m:GetLastTradePriceResponse<br>
xmlns:m="Some-URI"><br>
<Price>14.5</Price><br>
</m:GetLastTradePriceResponse><br>
</SOAP-ENV:Body><br>
</SOAP-ENV:Envelope><br>
<br>
XLANG<br>
<br>
<br>
數(shù)據(jù)庫中的事務的傳統(tǒng)概念是原子性,即要么不做,要么全做。在分布式的系統(tǒng)中維持這種原子性,一般采用一種代價昂貴的處理方式,即兩相承諾。另一個相對優(yōu)化的模型也在研究之中(最初叫做sagas,由Hector <br>
<br>
Garcia-Molina提出),即每個動作都有一個明確的互補動作,用以取消該動作產(chǎn)生的結(jié)果。在現(xiàn)實生活中,這種互補動作的例子很多,比如說,你在信用卡里取出$52,互補動作就是存入$52,你發(fā)出一封Email說“你將會在7天內(nèi)拿到你預定的產(chǎn)品”,互補動作就是發(fā)Email說“哦,你還得多等幾天”。XLang就是基于這樣一個概念,用來表示任何要取消的請求的互補動作。而Web <br>
<br>
Service的分布式基礎將推動XLang規(guī)范的發(fā)展,使之能完成復雜的撤銷操作。 <br>
<br>
XAML<br>
<br>
Transaction Authority Markup Language (XAML)提供了傳統(tǒng)的兩相承諾事務語義。在XAML規(guī)范中有一個B2B事務的例子。XAML不完全局限于兩相承諾,某些操作也可以象XLang一樣有互補動作。兩相承諾在企業(yè)集成中顯然是很有效的,而大量的web事務(如B2C事務)在更便宜的互補動作模型中可以完成。除非XAML把互補動作放在第一位,否則還是XLang存在的的理由更充分。<br>
<br>
Scenario<br>
<br>
下面的場景演示了一個商業(yè)事務,包括一批web service,并將利用XAML。考慮一家公司在網(wǎng)上向一家化工廠購買苯。為了讓買家能夠購買,賣方必須有第三方提供的附加增值服務,如運貨方式,付款方式,意外保險,安全運輸執(zhí)照等等。必須等到所有服務都就緒且滿足他的要求,買方才會同意購買。他可以買或者不買,換句話說,必須滿足所有的相關要求,才有可能完成這次商務活動。<br>
<br>
提供頂層商業(yè)事務功能的軟件必須協(xié)調(diào)每個web service。包括(1)賣方存貨系統(tǒng);(2)保險服務確保產(chǎn)品能被運輸;(3)財務服務確保依照賣方的形式付款;(4)運輸服務保證按時發(fā)送貨物;(5)協(xié)調(diào)服務確保與政府的安全要求一致。<br>
<br>
XKMS (XML Key Management Specification)<br>
<br>
XKMS是Microsoft和Verisign用XML應用程序集成PKI和數(shù)字認證(用于Internet事務安全性)的成果。關鍵的思想是將簽名處理放到Web上的可信服務器(trust server)上,這樣小客戶就不必自己來做這些內(nèi)容。XKMS依賴于XML數(shù)字簽名規(guī)范和正在制定中的XML加密規(guī)范。現(xiàn)在的XKMS規(guī)范依賴于XML,SOAP,WSDL。<br>
<br>
其它例子<br>
<br>
Web service平臺是一個發(fā)展的生態(tài)系統(tǒng),達爾文主義還在起作用,這里有進化,有競爭,還有混亂。下面是一個小例子。<br>
<br>
XFS <br>
<br>
XMethods 文件系統(tǒng)服務讓你能夠通過SOAP接口讀或貼文件。這個系統(tǒng)讓開發(fā)者可以創(chuàng)建使用集中而穩(wěn)定數(shù)據(jù)的服務。理想情況下,這種文件系統(tǒng)能夠用來集中被多個節(jié)點訪問的信息。例如,可以用它支持程序補丁的自動升級。XFS提供了一個客戶端工具,在Windows Explorer中集成了XFS web service,這樣Windows Explorer集成了基于XML-SOAP的文件系統(tǒng)。XFS是開放源碼的,由xmethods.com始創(chuàng),它的前景還不清楚,但是,這個想法在技術上是很有吸引力的。<br>
<br>
<br>
<br>