Web服务系列计划由大约十篇帖子组成,目的是介绍各种概念,以及开发Web服务的工具。在这第一篇里我会简单介绍一下Web服务的概念,并演示一个Web服务的具体应用场景。文章的篇幅不会太长,因为那样会看得很累,反正我是个“没有耐心”的人,呵呵。
Web服务(Web Services)在很多人眼里还是个十分神秘的概念,究其根源,我想主要是由于Web服务被宣传得很多,但实际应用却鲜见,给人一种很复杂和难以理解的感觉。另外,Web服务是基于XML的,不少人对XML本身也缺乏理解,虽然他们可能每天都在写XML格式的配置文件。
提到Web服务的起源就一定要先说一说SOA(面向服务的体系结构),和很多具有划时代意义的软件技术一样,SOA的出现根本上也是为了解决软件危机问题。做过项目的人都有过这种感受,随着项目推进,模块之间关系越来越紧密,任何一个小的修改都可能引起整个系统的不稳定,而客户需求偏偏总是在改变,结果是项目以差不多失败的结果告终。
从(分布式)软件发展的趋势来看,C/S->B/S->SOA,模块之间的耦合度是由紧密到松散的,松散的耦合有利于修改。我们常说的各种设计模式,其中大部分不也是为了降低类之间的耦合度吗。
这里我引用一下IBM网站上对SOA的定义:面向服务的体系结构(service-oriented architecture)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。(全文)
说得通俗一点就是,系统中分为三种角色:服务提供者、服务使用者和注册中心,提供者发布服务到注册中心,使用者通过注册中心发现所需服务,然后与该服务的提供者绑定,并调用服务。
那么Web服务和SOA是什么关系呢,可以这样说,Web服务是SOA的一种实现,有点像Tomcat和JSP/Servlet规范的关系。SOA是一个比较虚的概念,例如它只提出定义一些接口和协议,那么这些东西具体应该怎样定义呢,Web服务就将它们具体化了:Web服务使用的协议都是基于XML的;SOA只说应该有三种角色,而Web服务里这三种角色都有具体的实现方式。看到这里你应该会问,那么SOA还有哪些实现呢?CORBA、DCOM和J2EE都可以算是,但我认为它们不能算很纯粹,至少它们并不都具有中立的协议。
现在该用一个具体的例子来说明一下Web服务了,假设我们的系统中需要一项功能是查询当地的天气情况(世界时间、货币汇率等等,都一样),显然我们不会自己做一个从气象部门数据库中查找数据的程序,这需要很多手续也没有必要,更要命的是,这样做会增加我们与气象部门的耦合度。试想某一天气象部门的数据库结构改变了,我们将不得不修改自己的代码,如果他们忘记通知我们这一改变,想象一下客户会看到什么?
为了利用Web服务,我们从某一注册中心查找和天气有关的服务,在结果中也许我们会选择收费较低,或者收费稍高但更稳定和准确的服务。从注册中心我们能够得到所选服务的完整描述,其中包含了各种数据类型和调用方式,利用这些信息,可以使用工具生成这些必要的类,以及客户端Stub,利用这个Stub就可以调用远程的Web服务了。在我们的例子中,调用后服务提供者会返回一个含有结果的消息,在我们的系统中可以从这个消息里得到所要的结果,并显示给客户。这样就形成一个完整的Web服务调用。这种调用方式被称为静态调用,因为在Stub里服务提供者的地址(被称为调用端点endpoint)是写定的,还有另外一种方式被称为动态调用,以后会讲到。
那么Web服务和以前的RPC(远程过程调用)有什么分别呢?RPC通常要求调用者和被调用者是同构的,即使用同样的语言编写,而Web服务没有这个要求(诀窍在于使用了XML封装消息),这就大大增加了灵活程度;另外,Web服务的调用除这种类似RPC的方式外,还可以是基于消息的方式,服务使用者可以只接收消息,或是只发送消息,在一些应用中这种方式十分有用。
好了,把这次讲的内容总结一下就是:Web服务是SOA的实现,Web服务不是RPC。
下次将稍微详细点说说Web服务的结构和协议栈,第三篇文章开始会陆续讲些与Web服务关系非常紧密的几个概念。本人水平有限,如果存在错误欢迎指出,转载请注明出处。最后推荐一个学习Web服务的好地方,IBM开发者SOA与Web服务专区,适合各种水平的读者阅读,同时有很多最新应用,绝对值得一去。在http://www.xmethods.net/有很多Web服务的演示,有兴趣也可以看看。