14.1 XML和Web Service

Web Service用于消除不同平台、不同语言之间的实现差异,将现有的应用程序发布成开放式服务,从而允许互联网上任何地方、任何平台和任何语言的应用程序来访问该服务。通过使用Web Service,我们可以将应用程序转换为网络应用程序,从而使本地的应用程序可以向全世界发布信息或提供某种服务。

从表面上看,Web Service只是一个基于Web的应用程序,它向外界暴露出了一个允许通过Web调用的API。

对于Web Service使用者而言,Web Service API既与任何操作平台无关,也与任何编程语言无关,它只使用XML作为服务描述语言,以及使用XML作为数据交换格式。因此,不管Web Service使用者使用何种操作平台,使用何种编程语言,只要权限允许,都可以调用Web Service暴露出来的服务。至于Web Service底层如何实现,以怎样的平台和怎样的技术来实现这些服务,对Web Service使用者而言完全透明。

对于Web Service服务提供者而言,他们既可以为Web Service服务重新提供实现,也可以直接将已有的应用程序包装成Web Service。由于Web Service本身可以说只是一种思想,并不是一种特有的技术,因此各种编程语言都有自己的Web Service实现,不管现有的应用程序建立在哪种操作平台上,也不管现有的应用程序以哪种编程语言实现,都可以将其暴露成与平台和语言无关的Web Service。

14.1.1 Web Service概述

Web Service主要的设计思想是:充分利用Web分布式编程模型的松散耦合性,允许各种平台和各种编程语言的应用彼此交换数据,从而将其无缝地整合在一起。也就是说,Web Service提供了一种建立分布式应用的平台,使得不同操作平台上由不同语言实现的,所有已开发、部署的软件,都可以充分利用这个平台实现分布式计算。

总结起来,Web Service有如下特点:

alt 自包含性:Web Service是自包含的,Web Service使用者无须安装任何附加软件,只需一种支持Web和XML的编程语言即可;Web Service服务提供者则只需要Web服务器和SOAP服务器。

alt 自描述性:Web Service是自描述的,客户端和服务器都无须关心除请求和响应消息的内容和格式之外的任何内容,消息格式与消息内容一起传播,无须外部程序辅助。

alt 封装性:Web Service是一种部署在Web应用上的对象,具备良好的封装性。对使用者而言,仅能看到服务描述,而该服务的具体实现、运行平台则都是透明的,调用者无须关心,也无法关心。Web Service作为整体提供服务。

alt 可编程性:Web Service并不提供图形用户界面,而只提供编程访问的API,Web Service调用者只需知道Web服务器的API接口,即可使用任何平台上的任何编程语言来调用Web Service。

alt 松散耦合:当Web Service的实现发生改变时,调用者是无法感受到这种改变的。对调用者而言,只要服务实现的接口没有变化,具体实现的改变是完全透明的。

alt 高度的开放性:Web Service可以与其他的Web Service进行交互,具有语言和平台无关性,支持CORBA、EJB和DCOM等多种组件标准,支持HTTP、SMTP、FTP和RMI等各种通信协议。

alt 使用标准协议:Web Service所有的公共协议都使用标准协议描述、传输和交换,这些标准协议在各种平台上完全相同。使用Web Service完全可以在不同供应商之间实现互操作。

alt 高度整合的能力:由于Web Service采用简单的、易理解的标准Web协议作为通信协议,完全屏蔽了不同平台之间的差异,无论是CORBA、DCOM还是EJB,都可以通过这种标准的协议进行互操作,实现系统的高度可整合性。

14.1.2 Web Service平台概述

Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocol,即简单对象访问协议)、WSDL(Web Service Description Language,即Web Service描述语言)和UDDI(Universal Description Discovery and Integration,即统一描述、发现和整合协议)。

14.1.2.1 SOAP(简单对象访问协议)

SOAP(Simple Object Access Protocol,即简单对象访问协议)是一种具有扩展性的XML消息协议。SOAP协议允许一个应用程序向另一个应用程序发送XML消息,SOAP消息是从SOAP发送者传至SOAP接收者的单路消息,任何应用程序均可作为发送者或接收者。SOAP仅定义消息结构和消息处理的协议,与底层的传输协议独立。因此,SOAP消息底层可通过HTTP、JMS或SMTP协议传输。目前,大多采用HTTP传输SOAP消息。SOAP包括如下4个部分:

alt SOAP封装结构:该结构定义消息的整体框架,确定消息中的内容、内容的处理者,以及内容中哪些部分是可选的,哪些部分是必需的。

alt SOAP编码规则:定义应用程序之间的数据交换机制。

alt SOAP RPC表示:定义远程过程调用相互应答的协议。

alt SOAP绑定:SOAP绑定使用底层协议交换信息,主要描述如何通过HTTP格式来传递SOAP消息。除此之外,还描述了在无HTTP扩展框架的情况下,如何传递SOAP消息。

14.1.2.2 WSDL(Web Service描述语言)

WSDL(Web Service Description Language,即Web Service描述语言)使用XML描述Web Service,包括访问和使用Web Service所必需的信息,定义该Web Service的位置、功能及如何通信等描述信息。WSDL文件包含以下3个部分:

alt WHAT部分:用于定义Web Service所提供的操作(或方法),由WSDL中的<types…/>、<message…/>和<portType…/>元素定义,它们定义了客户端和服务器端交互的消息及数据类型。

alt HOW部分:用于定义如何访问Web Service,包括数据格式详情和访问Web Service操作的必要协议。

alt WHERE部分:用于定义Web Service位于何处,使用特定协议决定的网络地址(如URL)指定。该部分使用<service…/>元素定义,可在WSDL文件的最后部分看到<service…/>元素。

Web Service的提供者使用WSDL描述自身提供的服务,描述Web Service的WSDL文档允许互联网上的其他用户自由访问,Web Service使用者根据该WSDL文档来调用由服务方式所提供的服务。

14.1.2.3 UDDI(统一描述、发现和整合协议)

UDDI(Universal Description Discovery and Integration,即统一描述、发现和整合协议)是一套信息注册规范,它具有如下特点:

alt 基于Web

alt 分布式

UDDI包括一组允许企业向外注册Web Service以使其他企业发现、访问的实现标准。UDDI的核心组件是UDDI注册中心,它使用XML文件来描述企业及其提供的Web Service。

通过使用UDDI,Web Service提供者可以对外注册Web Service,从而允许其他企业来调用该企业注册的Web Service。Web Service提供者通过UDDI注册中心的Web界面,将它所提供的Web Service的信息加入UDDI注册中心,然后该Web Service就可以被发现和调用。

Web Service使用者也通过UDDI注册中心查找、发现自己所需的服务,当Web Service使用者找到自己所需的服务之后,他可以将自己绑定到指定的Web Service提供者,再根据该Web Service对应的WSDL文档来调用对方的服务。

根据上面的介绍,Web Service大致的运行模式如图14.1所示。

alt

图14.1 Web Service大致的运行模式

14.1.3 Web Service的广泛应用

Web Service将传统Web应用提升到了更高的层次。通过使用Web Service,可以将现有的应用程序通过Web Service暴露出来,从而可以向全世界发布功能或消息。

Web Service的目标是跨平台、跨语言的相互调用。为了达到这一目标,Web Service采用XML作为数据交换方式,因此独立于软件供应商的标准,是创建可互操作的分布式应用程序的新平台。Web Service主要用于以下4个方面。

14.1.3.1 复用已有的应用程序组件

如果应用程序有成千上万的用户,而且分布在世界各地,运行在完全不同的平台上,那么各个组件之间的通信将是个非常棘手的问题。因为,客户端和服务器之间通常会有防火墙或者代理服务器,并且程序运行在不同的平台上。

传统的解决方案是通过Web服务器对外提供服务,比如Servlet技术。但Servlet在生成界面上花费了太多的精力,其实组件之间的通信完全不需要界面部分,而只依赖于服务的互相引用。

如果将中间层组件转换成Web Service,这样就允许其他应用直接调用这些Web Service组件,从而省掉建立Servlet的表现层。由Web Service组成的中间层,完全可以在异构系统整合或其他场合下重用。最后,通过Web Service把应用的逻辑和数据“暴露”出来,可以让其他平台上的客户重用这些应用。

14.1.3.2 应用程序集成

企业里经常需要整合不同语言的、运行在不同平台上的应用程序,这种整合将耗费很大的开发力量。应用程序经常需要从UNIX主机上获取数据,或者把数据发送到Windows应用程序中去。即使在同一个平台上,不同软件厂商的各种软件也常常需要整合。通过使用Web Service,应用程序可以以标准方式“暴露”功能和数据,供其他应用程序使用。

例如,有这样的一个订单登记程序,用于登记客户发来的新订单,包括客户信息、发货地址、数量、价格和付款方式等内容;还有一个订单执行程序,用于管理实际的货物发送。而两个应用程序来自不同的软件厂商。新订单进入系统之后,订单登记程序应通知订单执行程序发送货物。

此时就可以在订单执行程序外包装一层Web Service,将“addOrder”函数“暴露”出来。订单登记程序可以调用这个函数来发送货物,而无须理会该程序的运行平台和具体实现等细节。

14.1.3.3 B2B的整合

Web Service可用来整合应用,从而使公司内部的业务处理更加智能化。整合跨公司业务交易称为B2B整合。

通过Web Service,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,将电子下单系统和电子发票系统“暴露”出来,客户就可以发送电子订单,而供应商则可以发送电子采购发票。当然,Web Service只是B2B整合的关键部分,此外还需要许多其他部分才能实现整合。

用Web Service来实现B2B整合的好处在于:可以实现跨平台的互操作性。只要把业务逻辑“暴露”成Web Service,就可以让任何指定的合作伙伴调用这些逻辑,而不用管他们的系统在什么平台上运行、使用什么开发语言。这样一来可以大大减少B2B整合的时间和成本。

14.1.3.4 重用系统数据

软件重用是一个很大的主题,重用的形式很多,重用的程度各有不同。基本的形式是源代码模块或者类一级的重用,还有就是二进制形式的组件重用。

现有的重用存在一个很大的限制:重用仅限于代码,数据不能重用。原因在于,发布组件甚至源代码都比较容易,但要发布数据就没那么容易,除非是不需要经常变化的静态数据。

Web Service既允许重用代码,又允许重用数据。通过使用Web Service,客户也不必像从前那样,先从第三方购买、安装组件,再通过应用程序调用组件;客户端可以直接调用远端的Web Service。Web Service提供商可以按时间或使用次数来对服务收费。

在这种情形下,软件本身和数据作为整体对外提供服务。对服务的使用者而言,他们无须关心软件本身和数据的差别,在他们眼里,系统提供的就是整体的服务。而对软件服务的提供者而言,整个软件以“面向服务架构”(SOA)来构建。SOA架构改变了软件行业传统的赢利模式,不再单纯地靠软件产品赢利,而是改为主要依靠数据赢利,而数据正是IT(Information & Technology)行业的重心——信息(Information)。

在这种模式下,软件供应商不再单纯地提供软件,而是将软件和数据作为整体对外提供服务,从而降低了用户安装、学习和维护软件的使用成本,直接使用软件供应商提供的软件服务即可。这就引出了软件行业的另一个全新的概念——SaaS(Software as a Service,软件即服务)。

另一种软件重用的情况是,整合多个应用程序的功能。例如,要建立门户站点应用,让用户既可以查看股市行情,浏览国际新闻,又可以管理自己的日程安排,还可以在线购买电影票。现在Web上有很多供应商,他们分别在各自的应用中实现了这些功能。如果他们把这些功能通过Web Service“暴露”出来,开发者就可以非常容易地将这些功能集成到你的门户站点中,为用户提供统一的、友好的界面。