【IT168 技术文档】
第一部分:新方法的商业驱动力
虽然 IT 经理一直面临着削减成本和最大限度地利用现有技术的难题,但是与此同时,他们还必须不断地努力,以期更好地服务客户,更快地响应企业战略重点,从而赢得更大的竞争力。
在所有这些压力之下,有两个基本的主题:异构和改变。现在,大多数企业都有各种各样的系统、应用程序以及不同时期和技术的体系结构。集成来自多个厂商跨不同平台的产品简直就像一场噩梦。但是我们也不能单单使用一家厂商的产品,因为改变应用程序套件和支持基础设施是如此之难。
在当今 IT 经理面临的问题之中,改变是第二个主题。全球化和电子商务加快了改变的步伐。全球化带来了激烈的竞争,产品周期缩短了,每个公司都想赢得超过竞争对手的优势。在竞争产品和可以从 Internet 上获得的大量产品信息的推动下,客户要求更快速地进行改变。因而,在改进产品和服务方面展开的竞争进一步加剧了。
为了满足客户提出的越来越多的新要求,技术方面的改进也在不断地加快。企业必须快速地适应这种改变,否则就难以生存,更别提在这个动荡不安竞争激烈的环境中取得成功了,而 IT 基础设施必须支持企业提高适应能力。
因此,企业组织正在从上世纪八十年代或更早的时期的相互隔离的垂直业务部门,到上世纪八十年代和九十年代关注业务流程的水平结构,向新的生态系统业务范例发展。重点是扩展供应链,支持客户和合作伙伴访问业务服务。图 1 展示了企业的这种发展。

图 1: 企业的发展
我如何使我的 IT 环境更灵活且更快地响应不断改变的业务需求呢? 我们如何使这些异构系统和应用程序尽可能无缝地进行通信呢?我们如何达到企业目标而不使企业走向破产的深渊呢?
IT 响应者/支持者是随着企业的这种发展而并行发展的,如图 2 所示。现在,许多 IT 经理和专业人员都同样相信,我们真的快找到了一种满意的答案——面向服务的体系结构。

图 2: 体系结构的发展
为了减少异构性、互操作性和不断改变的要求的问题,这样的体系结构应该提供平台来构建具有下列特征的应用程序服务:
松散耦合
位置透明
协议独立
基于这样的面向服务的体系结构,服务使用者甚至不必关心与之通信的特定服务,因为底层基础设施或服务“总线”将代表使用者做出适当的选择。基础设施对请求者隐藏了尽可能多的技术。特别地,来自不同实现技术(如 J2EE 或 .NET)的技术规范不应该影响 SOA 用户。如果已经存在一个服务实现,我们就还应该重新考虑用一个“更好”的服务实现来代替,新的服务实现必须具有更好的服务质量。
第二部分:作为解决方案的面向服务体系结构
自从“软件危机”促进软件工程的开创以来,IT 界一直在努力寻求解决上述问题的方案。在过去几年里,下面简要概述的核心技术进展使我们走到了今天。我们将简要讨论这些核心技术,而我们重点关注的将是这些技术如何帮助解决 IT 问题。
一.面向对象的分析和设计
在“Applying UML and Patterns - An Introduction to Object-Oriented Analysis and Design”中,Larman 将面向对象的分析和设计的本质描述为“从对象(物体、概念或实体)的角度考虑问题域和逻辑解决方案”。在“Object-Oriented SoftwareEngineering: A Use Case Driven Approach”中,Jacobson 等将这些对象定义为“特点在于具有许多操作和状态(记忆这些操作的影响)的物体”。
在面向对象的分析中,这样的对象是用问题域来标识和描述的,而在面向对象的设计中,它们转变成逻辑软件对象,这些对象最终将用面向对象的编程语言进行实现。
通过面向对象的分析和设计,可以封装对象(或对象组)的某些方面,以简化复杂业务场景的分析。为了降低复杂性,也可以抽象对象的某些特征,这样就可以只捕获重要或本质的方面。
基于组件的设计并不是一种新技术。它是从对象范例中自然发展而来的。在面向对象的分析和设计的早期,细粒度的对象被标榜为提供“重用”的机制,但是这样的对象的粒度级别太低了,没有适当的标准可以用来使重用广泛应用于实践之中。在应用程序开发和系统集成中,粗粒度组件越来越成为重用的目标。这些粗粒度对象通过内聚一些更细粒度的对象来提供定义良好的功能。通过这种方式,还可以将打包的解决方案套件封装成这样的“组件”。
一旦组织在更高层次上实现了基于完全独立的功能组件的完备体系结构,就可以将支持企业的应用程序划分成一组粒度越来越大的组件。可以将组件看作是打包、管理和公开服务的机制。它们可以共同使用一组技术:实现企业级用况的大粒度企业组件可以通过更新的面向对象的软件开发与遗留系统相结合来实现
二.面向服务的设计
在“Component-Based Development for Enterprise Systems”中,Allen 涉及了服务的概念,“它是将组件描述成提供相关服务的物理黑盒封装的可执行代码单元。它的服务只能通过一致的已发布接口(它包括交互标准)进行访问。组件必须能够连接到其他组件(通过通信接口)以构成一个更大的组”。服务通常实现为粗粒度的可发现软件实体,它作为单个实例存在,并且通过松散耦合的基于消息通信模型来与应用程序和其他服务交互。图3 展示了重要的面向服务术语:
服务:逻辑实体,由一个或多个已发布接口定义的契约。
服务提供者:实现服务规范软件实体。
服务使用者(或请求者):调用服务提供者的软件实体。传统上,它称为“客户端”。服务使用者可以是终端用户应用程序或另一个服务。
服务定位器:一种特殊类型的服务提供者,它作为一个注册中心,允许查找服务提供者接口和服务位置。
服务代理:一种特殊类型的服务提供者,它可以将服务请求传送到一个或多个其他的服务提供者。

图 2:面向服务的术语
三.基于接口的设计
在组件和服务开发中,都需要进行接口设计,这样软件实体就可以实现和公开其定义的关键部分。因此,在基于组件和面向服务的系统中,“接口”的概念对于成功的设计非常关键。下面是一些与接口有关的重要定义:
接口:定义一组公共方法签名,它按照逻辑分组但是没有提供实现。接口定义服务的请求者和提供者之间的契约。接口的任何实现都必须提供所有的方法。
已发布接口:一种可唯一识别和可访问的接口,客户端可以通过注册中心来发现它。
公共接口:一种可访问的接口,可供客户端使用,但是它没有发布,因而需要关于客户端部分的静态知识。
双接口:通常是成对开发的接口,这样,一个接口就依赖于另一个接口;例如,客户端必须实现一个接口来调用请求者,因为该客户端接口提供了某些回调机制。
客户关系管理 (CRM) 服务的 UML 定义,它表示为一个 UML 组件,实现接口 AccountManagement、ContactManagement 和 SystemsManagement。在这些接口中只有头两个接口是已发布接口,不过,后者是公共接口。注意,SystemsManagement 接口和 ManagementService 接口构成了双接口。CRMservice 可以实现许多这样的接口,但是它以多种方式行为的能力取决于客户端在行为的实现方面是否允许有大的灵活性。甚至有可能给特定类型的客户端提供不同或附加的服务。在一些运行时环境中,这样的功能也用于在单个组件或服务上支持相同接口的不同版本。