什么是SOA,谈谈你的SOA的理解(ZZ)

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。

reference:

  1. http://my.oschina.net/u/1042978/blog/127169

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注