WebService初探(推荐)
Web Service初探(推荐)<br>
<br>
<br>
<br>
简介<br>
<br>
回顾过去的六年,难以想象如果没有互联网的话,网络计算会变成什么样。更早的超文本模式失败了,而互联网成功了,这其中最基本的原因可以归结为:互联网简单且无处不在。从服务提供者(如网上商店)的角度来看,只要你会打字,你就可以接受服务。从服务API的角度来看,互联网上绝大多数的活动都可以由三种方法(GET, POST, 和PUT ) 以及一种标记语言来完成。Web Service的兴起正是基于这样一个事实:Web不仅可以作为一个信息平台 ,也可以作为一个服务平台。 <br>
这里的“Services”不是指Amazon.com提供的那种粗糙的服务,而是一种组件服务,其他人可以用来构造更强大的服务。例如,Microsoft提供了Passport服务,提供Web上的认证功能,所以,类似华盛顿邮报之类的电子报纸就不必自己开发认证服务,只要交给Passport做就可以了。当然,这只是一个假设。<br>
<br>
Oracle的动态服务白皮书(dynamic services whitepaper)提供了更多组件服务的例子:汇率转换,翻译,货物运输等等。IBM对Web Service有一个更为正式的定义:<br>
<br>
Web ervices 是一种新的web应用程序分支,他们是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。Web service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他web services应用程序可以发现并调用它部署的服务。<br>
<br>
IBM的Web Service指南接着说在几年前Web Service还是一个效率低下无法引起人们兴趣的概念。但是随着带宽和存储变的更为便宜,内容更为动态化,对不同平台上广泛而多样的计算设备的集成的要求也更为强烈,同时,也使得人们对代价(带宽和存储)不那么敏感。<br>
<br>
当我已经有了我中意的中间件平台(RMI, Jini, CORBA, DCOM 等等)时,为什么还要为Web而烦恼呢?中间件确实提供了强大的服务实现手段,但是,他们当中没有一个是绝对的胜利者。Web作为信息发布者的力量就在于简单且无处不在,这对解决现在这样一个分裂中间件世界很重要。Web通过在传统中间件平台上更有效实现的Services,来提供一个统一且广泛适用的接口,这样就改善了这个平台。<br>
<br>
从一个N层应用程序结构的角度来看,web service只是一个方便程序访问的包装,服务还是要靠中间件来实现。访问包括服务请求处理(监听者)和一个支持商业逻辑操作的接口,商业逻辑本身是由传统的中间件平台实现的。<br>
<br>
Web Services平台<br>
<br>
那么什么是web service 平台呢?最基本的平台是XML加HTTP。HTTP是一个在Internet上广泛使用的协议。XML是一种元语言,你可以用它书写特定的语言来描述客户和服务之间或者组件和复杂服务之间的交互。在web server之后,XML格式的消息被转变成中间件的请求,返回的结果也会转化成XML格式。 <br>
<br>
你可能会问,这与说CORBA是IDL加上RPC不是一样吗?这个平台到底如何支持service的发现,事务,安全,认证等等基本功能,以使它真正成为一个平台呢? 下面我们将讲述这一点。 <br>
<br>
有必要增加一些服务,同时保持简单性和普遍性,来把Web构建成一个功能更强大的平台。可以认为功能全面的web services平台是XML+HTTP+SOAP+WSDL+UDDI。在更高层次上,可能还要加上一些尚未广泛接受的技术如XAML,XLANG, XKMS,和XFS。<br>
<br>
以下是对这些平台要素的简要描述。需要指出的是,这些还是发展中的技术,很多时候对一个问题会有多种解决方案。<br>
<br>
SOAP (远程调用) <br>
UDDI (贸易,目录服务) <br>
WSDL (描述服务特征) <br>
XLANG/XAML (为包括多种web services的复杂web事务提供支持) <br>
XKMS (XML Key Management Specification) - 支持认证和注册,这个工作还在进展之中 <br>
<br>
SOAP<br>
<br>
SOAP是一个协议规范,定义了传递XML-encoded数据时的统一方式。它还定义了使用HTTP作为底层通信协议时执行远程调用(RPC)的方法。<br>
<br>
SOAP的兴起是基于这样一种认识,无论现在的中间件是如何的好,他们都需要一个WAN包装。以XML格式发送消息有很多好处,如能够确保互用性。中间件使用者看来愿意容忍解析和序列化XML文档的代价,因为这可以让他们的软件使用范围更宽。<br>
<br>
IBM, Microsoft, UserLand,和DevelopMentor在2000年向W3C提交了SOAP,并成为W3C的Note,SOAP更长远的发展规划现在是由W3C的XML协议工作组来制定。这有力的表明了直到W3C工作组交付规范为止,SOAP都将是一个稳定的规范。<br>
<br>
UDDI (Universal Description, Discovery and Integration Service)<br>
<br>
UDDI为客户提供了动态查找其它web <br>
<br>
services的机制。使用UDDI接口,商务处理可以动态的连接到外部的商务合作者提供的服务上。一个UDDI注册类似于CORBA的trader,也可以把它想象成商业应用程序的DNS服务。一个UDDI注册有两种客户:要发布一个服务(和使用接口)的商务应用,以及想要得到特定服务的客户。下表是UDDI提供服务的概述。UDDI层在SOAP层之上,并假定请求和应答都是以SOAP消息传送的UDDI对象。下面还包含了一个简单的查询。<br>
<br>
<br>
<br>
关于支持全方位的发现(full-featured discovery),UDDI没有一个近期的计划。UDDI希望能够成为支持其它标准的更高层服务的基础。UDDI计划支持更复杂的商务逻辑,包括层次型商业组织。UDDI有着广泛的支持,IBM, Ariba,和 <br>
<br>
Microsoft都全力推动它。到目前为止,它还不是一个开放的标准。<br>
<br>
<br>
<br>
UDDI 举例<br>
<br>
<br>
查询:下面在SOAP封装之内的查询,返回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>
结果: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为服务提供者提供了描述构建在不同协议或编码方式之上的web <br>
<br>
service请求基本格式的方法。WSDL用来描述一个web <br>
<br>
service能做什么,它的位置在哪里,如何调用它等等。在假定以SOAP/HTTP/MIME <br>
<br>
作为远程对象调用机制的情况下,WSDL会发挥最大作用。UDDI注册描述了web <br>
<br>
service的绝大多数方面,包括服务的绑定细节。WSDL可以看作是UDDI服务描述的子集。<br>
<br>
<br>
<br>
WSDL将服务定义为一个网络端点的集合,或者说端口的集合。在WSDL里面,端点及消息的抽象定义与它们具体的网络实现和数据格式绑定是分离的。这样就可以重用这些抽象定义:消息,需要交换的数据的抽象描述;端口类型,操作的抽象集合。针对一个特定端口类型的具体协议和数据格式规范构成一个可重用的绑定。一个端口定义成网络地址和可重用的绑定的联接,端口的集合定义为服务。因此一个WSDL文档在定义网络服务的时候使用如下的元素:<br>
类型-- <br>
<br>
使用某种的类型系统(比如XSD)定义数据类型的容器 <br>
消息-- 通讯数据抽象的有类型的定义 <br>
操作-- <br>
<br>
服务支持的动作的抽象描述 <br>
端口类型-- 一个操作的抽象集合,该操作由一个或多个端点支持 <br>
绑定-- <br>
<br>
针对一个特定端口类型的具体的协议规范和数据格式规范 <br>
端口-- 一个单一的端点,定义成一个绑定和一个网络地址的联接 <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>
数据库中的事务的传统概念是原子性,即要么不做,要么全做。在分布式的系统中维持这种原子性,一般采用一种代价昂贵的处理方式,即两相承诺。另一个相对优化的模型也在研究之中(最初叫做sagas,由Hector <br>
<br>
Garcia-Molina提出),即每个动作都有一个明确的互补动作,用以取消该动作产生的结果。在现实生活中,这种互补动作的例子很多,比如说,你在信用卡里取出$52,互补动作就是存入$52,你发出一封Email说“你将会在7天内拿到你预定的产品”,互补动作就是发Email说“哦,你还得多等几天”。XLang就是基于这样一个概念,用来表示任何要取消的请求的互补动作。而Web <br>
<br>
Service的分布式基础将推动XLang规范的发展,使之能完成复杂的撤销操作。 <br>
<br>
XAML<br>
<br>
Transaction Authority Markup Language (XAML)提供了传统的两相承诺事务语义。在XAML规范中有一个B2B事务的例子。XAML不完全局限于两相承诺,某些操作也可以象XLang一样有互补动作。两相承诺在企业集成中显然是很有效的,而大量的web事务(如B2C事务)在更便宜的互补动作模型中可以完成。除非XAML把互补动作放在第一位,否则还是XLang存在的的理由更充分。<br>
<br>
Scenario<br>
<br>
下面的场景演示了一个商业事务,包括一批web service,并将利用XAML。考虑一家公司在网上向一家化工厂购买苯。为了让买家能够购买,卖方必须有第三方提供的附加增值服务,如运货方式,付款方式,意外保险,安全运输执照等等。必须等到所有服务都就绪且满足他的要求,买方才会同意购买。他可以买或者不买,换句话说,必须满足所有的相关要求,才有可能完成这次商务活动。<br>
<br>
提供顶层商业事务功能的软件必须协调每个web service。包括(1)卖方存货系统;(2)保险服务确保产品能被运输;(3)财务服务确保依照卖方的形式付款;(4)运输服务保证按时发送货物;(5)协调服务确保与政府的安全要求一致。<br>
<br>
XKMS (XML Key Management Specification)<br>
<br>
XKMS是Microsoft和Verisign用XML应用程序集成PKI和数字认证(用于Internet事务安全性)的成果。关键的思想是将签名处理放到Web上的可信服务器(trust server)上,这样小客户就不必自己来做这些内容。XKMS依赖于XML数字签名规范和正在制定中的XML加密规范。现在的XKMS规范依赖于XML,SOAP,WSDL。<br>
<br>
其它例子<br>
<br>
Web service平台是一个发展的生态系统,达尔文主义还在起作用,这里有进化,有竞争,还有混乱。下面是一个小例子。<br>
<br>
XFS <br>
<br>
XMethods 文件系统服务让你能够通过SOAP接口读或贴文件。这个系统让开发者可以创建使用集中而稳定数据的服务。理想情况下,这种文件系统能够用来集中被多个节点访问的信息。例如,可以用它支持程序补丁的自动升级。XFS提供了一个客户端工具,在Windows Explorer中集成了XFS web service,这样Windows Explorer集成了基于XML-SOAP的文件系统。XFS是开放源码的,由xmethods.com始创,它的前景还不清楚,但是,这个想法在技术上是很有吸引力的。<br>
<br>
<br>
<br>