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。