紧密耦合也有存在的道理
在 SOA 环境中,应用程序组件被描述为 “松散耦合的(loosely coupled)”。松散耦合是指使用另一个组件提供服务的一个组件对前者的依赖性不强:它是语言独立的、平台独立的事务。
然而,这不是说 SOA 在结构上有缺陷。这些松散耦合的应用程序组件之间的交互是由契约来定义的,一个严密的契约就是一个好的契约。在 SOA 上下文中,契约是一个应用程序服务的消费者与提供者之间的契约:“你给我发送一条包含所需格式的客户号码的消息,我为你提供与那个客户号码相关的以下各项信息 ...”
当然,这种契约不同于您在买房子时签的那种契约。它必须以一种不同应用程序系统都能理解的语言来表达。在 SOA 中,这种通用语言就是 XML。
服务!从这里获得您的 Web 服务!
在 SOA 环境中,服务是用一种特定格式的 XML 来描述的,这种特定格式的 XML 就是 Web 服务描述语言(Web Services Description Language),简称 WSDL(发音为 WIZ-duhl)。在参考资料部分列出的 W3C 网页上,可以学到关于 WSDL 的详尽知识。这里我只给出一个概述。
WSDL 通过 XML 模式的方式描述与一个服务相关的契约:它接受什么数据类型,它返回什么,等等。这个模式包含在一个称做 XML 模式定义的文档中(后缀为 “.xsd” 的一个文件)。契约的 WSDL 描述实际上可能指向一些 .xsd 文件;其中一个 .xsd 文件可能描述一个对象(例如一个 customer),其他一些 .xsd 文件可能描述与服务有关的一些操作(例如 GetCustomer 或 GetCustomerResponse)。契约描述还可以包括绑定,绑定与调用服务的格式有关。SOAP 就是这样一种格式,不过它与我们在沐浴时用的肥皂可没什么关系。
SOAP 是简单对象访问协议(Simple Object Access Protocol)的缩写。同样,W3C 上的热心人已经提供了一个网页,上面有大量关于这方面的信息,在此我就不多费口舌了。我的一个同事把 SOAP 比作一种 XML 方言。虽然对 Web 服务的 SOAP 调用通常要借助 HTTP,但是 SOAP 并不是一定要使用这种特定的通信协议。例如,如果要按照异步的、消息驱动的模式来开发应用程序,那么我们可能选择使用消息队列,而不是 HTTP。
我在这一节中安排了 “Web 服务” 这个术语,这可能导致您认为我正要谈到像您公司通过 Internet 公开给外面世界的那种服务。然而实际上,虽然服务是可以那样使用,但是更稳妥的说法是,大多数 Web 服务是部署在企业的 intranet 中。不要以为 Web 服务的使用就等于 SOA 的实现。企业架构设计师喜欢这样来形容应用程序系统的特征:程序之间以及程序与数据库表之间存在各种类型的点对点连接,就像一个 “毛团”。您可以通过 Web 服务实现所有这些连接,但是这样无法得到一个 SOA — 您只不过是有了一个 CPU 效率更低的毛团。
什么是代理?
您可能已经听到某个开发人员在讨论 SOA 时提到了代理。我比较喜欢我们一个企业架构师给这个术语下的定义:“代理是一块非常低调的代码,它只调用一个服务。” 她还将代理称作 “业务管道(business-to-plumbing)” 接口。前面提到,SOA 的主要优势是它让程序员可以在概念层次上与信息处理服务打交道。每个 Web 服务都有一个 HTTP 地址与之相关联,在使用服务之前,必须打开到该服务的一个连接。在此基础上,Web 服务消费程序的开发人员很可能更愿意面对一个对象,而不是一个 XML 模式。打开连接,将 XML 模式映射到一个对象,等等之类的 “脏活” 是由代理来执行的。
服务消费程序和代理是紧密耦合的。服务的 WSDL 描述可能发生变化,这时我们可以只修改代理 — 而不必修改服务消费程序。而且,如果 WSDL 根据服务的一个新功能作出了调整,而服务消费程序不需要那样的服务,那么甚至连代理都不需要修改。
我喜欢把代理比作我的侄子,他知道他家附近有一家骑自行车就能找到的书店。我知道那家书店有一本有用的书,我也知道这本书的价格。于是我告诉我侄子这本书的书名和作者,再给他买书的钱,然后让他去帮我把那本书买回来。他是如何去那家书店的?当他到了那家书店时,他如何找到那本书?他如何把那本书带回来?这些我统统不知道,我也不关心这些 — 我甚至不知道这家书店在哪儿。我只是想要这本书,我让我侄子去处理把这本书带回给我这中间的细节。(顺便说一句,之前我曾经把代理比作 “一块非常低调的代码”,这种比喻现在可以退役了。我有好几个侄子,他们都是很聪明的家伙。) 上一页 [1] [2] [3] 下一页
|