一切福田,不離方寸,從心而覓,感無不通。
SOA 项目交叉学科建模方法
Olaf Zimmermann, Pal Krogdahl, 和 Clive Gee
2004 年 6 月 01 日发布
面向服务的体系结构(SOA)和 Web 服务的基本观念是成为我们日常语言的一部分,并可看作是适于设计现代企业应用程序的体系结构形式。在这种背景下, 什么构成好的服务这个基本问题就成为确保成功实现 SOA 的关键。
像 面向对象的分析与设计(Object-Oriented Analysis and Design,OOAD)、 企业体系结构(Enterprise Architecture,EA)框架和 业务流程建模(Business Process Modeling,BPM)这样的现有建模规则为我们提供了高质量的实践,可以长期帮助标识和定义体系结构内的适当抽象。然而经验表明,这些实践各自单独应用时达不到要求。
在本文中,我们将研究 OOAD、EA 和 BPM 中的适当原理。我们还将推动对混合方法的需求,这种方法把所有这些规则中的原理与许多独特的新原理组合起来。这样得到的交叉学科 OOAD 方法使成功地进行 SOA 开发更容易,我们称之为 面向服务的分析与设计(Service-Oriented Analysis and Design,SOAD),它还有待正式定义。我们还只是刚刚跨入 SOAD 的殿堂。
在发现新的商机或威胁的预期下,SOA 体系结构形式旨在提供企业业务解决方案,这些业务解决方案可以 按需扩展或改变。SOA 解决方案由可重用的服务组成,带有定义良好且符合标准的已发布接口。SOA 提供了一种机制,通过这种机制,可以集成现有的遗留应用程序,而不管它们的平台或语言。
从概念上讲,SOA 中有三个主要的抽象级别:
从建模的观点来看,由此带来的挑战是如何描述设计良好的操作、服务和流程抽象的特征以及如何系统地构造它们。这些相关问题都是当前行业内和学术界最常讨论的问题。据我们所知,最近几乎所有的 SOA 项目或专题研讨会都将这样的服务建模方面作为重要的主题,并引起了许多的争论。因此,让我们更近地作一番审视。
早期的 SOA 实现项目经验表明,诸如 OOAD、EA 和 BPM 这样的现有开发流程和表示法仅仅涵盖支持 SOA 范式所需的部分要求。SOA 方法在加强已经制定的良好通用软件体系结构原则(如信息隐藏、模块化和问题分离)的同时,还增添了附加的主题,例如, 服务编排、 服务库和 服务总线中间件模式,在建模时需要对它们给予特别的关注。
图 1展示了现有的 EA、BPM 和 OOAD 建模方法的主要应用领域,也是我们随后讨论 SOAD 的出发点。图中的水平轴表示 项目生命周期阶段;垂直轴表示不同抽象层或 领域之间的区别,而建模活动通常就是在其上进行的。
SOA 的远景是相当容易理解的,因为它的技术基础众所周知。例如,在任何 SOA 工作中,应用通用的软件体系结构原则和 OO 技术都是一个有效的开端。然而,正如我们已经提到的,早期采用者最常询问的问题是如何标识正确的服务。如前所述,OOAD、EA 和 BPM 在各自独立地应用时不能提供满意的答案,而这正是我们现在要说明的。
在由 Booch 和 Jacobson撰写的开创性的书(大约 10 年前出版的)中介绍的 OOAD 方法在定义 SOA 方面提供了非常好的起点。同样地,虽然许多年来在体系结构层次中应用 OOAD 技术和统一建模语言(Unified Modeling Language,UML)表示法是一个常见的实践,但是 OOAD 还是与像类和单独的对象实例这样的微观层次的抽象有关。由于每个问题域常常都创建单独的用况模型,因此,应用程序开发项目,这个企业的大方向在许多情况下变得模糊。此外,由于种种原因,用况模型并不总是与其对等的 BPM 保持同步。
诸如 Treasury 企业体系结构框架(Treasury Enterprise Architecture Framework,TEAF)、 面向特征的领域分析(Feature-Oriented Domain Analysis,FODA)和 Zachman这样的 EA 方法都将城市规划级的观点加在解决方案体系结构之上,但是并没有解决如何找到易于重用且具有持久性的高质量企业抽象的问题。
虽然 BPM 方法(如 BPMI)在功能工作单元之上提供了端到端视图,但是它们通常都没有触及体系结构和实现领域。例如,在像 用于 Web 服务的业务流程执行语言(Business Process Execution Language for Web Services,BPEL)这样的语言出现之前,BPM 表示法缺少操作语义。此外,我们还看到了许多流程建模与开发活动彼此分离的情况。
最后,现有的规则中没有一个可以解决如何为 SOA 启用 现有的应用程序的问题;大部分时间都采用自顶向下流程。现有的系统通常都存放有大量的重要数据和业务逻辑,并且不能简单地加以替代。因此,为了研究包装和重构策略,必须对这些系统进行自底向上的分析。因此,对现有应用程序的考虑会将我们带到中间相遇的流程。
由于这些原因的存在,所以需要混合 SOAD 建模方法。这种方法以最佳的方式组合了 OOAD、BPM 和 EA 中的原理,并且融入了一些具有创新性的原理。 图 2展示了这种新的方法的 SOAD 资源(原理和技术):
将企业应用程序和 IT 基础设施发展成 SOA 可能是一个大的负担,会影响多个业务线和组织单元。因此,需要应用 EA 框架和参考体系结构(如 开放组织体系结构框架(The Open Group Architecture Framework,TOGAF))以及 Zachman,以努力实现单独的解决方案之间体系结构的一致性。
根据过去的经验,大多数现有的 EA 框架都在一个或多个方面有限制。例如,如果主要的问题是表示技术设备的低级构块如何在宏观层次互连,则无法获得业务层流程或服务视图。然而,在 SOA 的背景下,这种考虑问题的方式必须转换为以表示业务服务的逻辑构件为中心,并且集中于定义服务之间的接口和 服务级协定(Service Level Agreements,SLA)。
此外,许多企业级参考体系结构和框架是相当普通的,并没有触及设计领域。这样的高级体系结构无法为架构师和开发人员提供具体的战术意见,并且常常导致企业体系结构和解决方案体系结构之间出现根本性的分歧。
SOAD 必须帮助 SOA 架构师定义服务前景的整体业务级视图。这是当今的 EA 框架所无法提供的,它们需要未来特定于 SOA 的增强; 按需操作系统(On Demand Operating Environment,ODOE)是 IBM 针对这种趋势制定的主要战略。
BPM 是一个不完整的规则,其中有许多不同的形式、表示法和资源。另一种常用的技术是定义表示概念性流程流的 事件驱动流程链,正如 Barker 和 Longman所定义的。这第二种技术使用了不同于 UML 的表示法。
此外,还有许多专用方法(如 BPM 技术)可能被咨询公司和企业资源规划(Enterprise Resource Planning,ERP)软件包厂商视为具有竞争优势。ARIS Implementation Platform 就是这样的产品的一个例子。其他的方法包括: Line of Visibility Enterprise Modeling(LOVEM) 和 IBM 的组件业务建模(Component Business Modeling,CBM)战略。
最近的趋势是定义表示可执行流模型(如 用于 Web 服务的业务流程执行语言(Business Process Execution Language for Web Services,BPEL))的标准方法。BPEL 将流程的范围从分析扩展到实现。这样的可执行模型引发了一系列的新问题,其中包括:
必须利用所有现有的 BPM 方法作为 SOAD 的起点;然而,必须使用流程模型中用于驱动 候选服务和它们的操作的附加技术来对其加以补充。此外,SOAD 中的流程建模必须与设计层用况建模保持同步,并且必须给出与 BPEL 有关的问题的答案。
OO 分析是一种非常强大且广为赞誉的方法,同样,SOAD 应该尽可能多地利用 OO 分析技术。要将 OO 分析成功地应用于 SOA 项目,您就必须一次分析多个系统。用况模型必须继续扮演重要的角色。然而,SOAD 必须主要是 流程,而不是 用户驱动的。因此,SOAD 需要 BPM 和用况建模活动之间的强链接。
在 设计层,OO 的目标是能够进行快速而有效的设计、开发以及执行灵活且可扩展的应用程序。对象是软件构造,其行为就像它们建模的真实世界的实体。例如,顾客 (Customer) 将有名称和联系信息,并且还可能有一个或多个与之相关的帐户对象。从 OO 的角度看,每件事情都是对象。
OO的基本原则是:
经常帐户(CheckingAccount)
、 储蓄帐户(SavingsAccount)
和 贷款帐户(LoanAccount)
这样的对象。如果您看得更仔细一点(请参见 图 3),您将发现这些类共享许多属性,比如都有收支平衡帐户、借方帐户和贷方帐户等等
与其重复定义和管理这些属性的代码,不如创建一个通用的 帐户(Account)
类,该类具有现金收支平衡并且可以处理借贷事务。所有其他的类都是这个 帐户(Account)
对象的专门形式。例如, 贷款帐户(LoanAccount)
将在零和某个约定的最大值之间具有负平衡,而 储蓄帐户(SavingsAccount)
将具有负平衡,并且将展示增加利息的行为,等等。
经常帐户(CheckingAccount)
实例,并且将相应的 贷消息发送到 储蓄帐户(SavingsAccount)
实例。当实例接收消息时,它执行相应的功能,称为 方法,它有与消息相同的名称。自由经常帐户(FreeCheckingAccount)
实例和 经常帐户(CheckingAccount)
实例将响应 借 ($100)
消息,但是 自由经常帐户(FreeCheckingAccount)
实例将正好 $1000 记入它的帐户平衡的借方,而 经常帐户(CheckingAccount)
实例将 $1000 加上交易费记入它的帐户平衡的借方。OO 支持应用程序分析、设计和开发的完整生命周期:
目前与 SO 有关的 OO 设计实践的主要问题在于,它的粒度级别集中在类级,对于业务服务建模来说,这样的抽象级别太低了。诸如继承这样的强关联产生了相关方之间一定程度的 紧耦合(因而具有依赖性)。与此相反,SO 范式试图通过 松耦合来促进灵活性和敏捷性。目前,在 SOA 中还没有服务 实例的跨平台继承支持和一流的表示法来避免需要处理服务生命周期维护管理问题(如远程垃圾收集)。
这些考虑事项使 OO 难以与 SO 体系结构样式直接保持一致。然而,对于设计已定义的服务中的底层类和组件结构,OO 仍然是一种有价值的方法。此外,许多 OOAD 技术(例如类、责任、协作(CRC)卡)也可以用于服务建模(如果它们提升到更高层次的抽象的话)。在本文后面,我们将回过头来讨论这一点。
图 4展示了可见性层次和 OO、 面向组件和 SO 设计提供的重点之间的对应关系。它还展示了在 SOA 和 SOAD 背景中它们之间的相互关系。
至于表示法,统一建模语言(Unified Modeling Language,UML)——通过一些附加的定型(Stereotype)和概要加以增强——自然成为 SOAD 的重要基础。
在使用 Rational Unified Process (RUP)——被认为是支持迭代软件开发的分析与设计的主流 OOAD 流程之一——的流程方面,使用 UML 模型具有首要价值。然而,RUP 以 OOAD 的原则为基础,因而使其不容易与 SOA 设计保持一致。从 RUP 的角度来看,系统的体系结构是其通过已定义接口交互的主要组件的体系结构。此外,这些组件还由逐渐减小到类级粒度的更小组件组成。相反,在 SOA 中,系统的体系结构通常包括满足普通 业务服务需要的无状态、全封装且自描述的服务组成,它更接近于映射到 BPM,如 图 5所示。
这些服务可能包括许多协作或编排服务。这并没有排除 RUP 采用的 OO 观点,而是在其上实现了另一个抽象层。这个超层的作用是封装作为正式的跨层接口结构中的 RUP 构件( 软件服务)设计的组件。
在这一部分中,我们将更详细地描述 SOAD 的需求,并且开始确定它的主题和原理。目的是将关于这个主题的讨论引到进一步的设计工作。进一步的工作无疑需要形式化 SOAD 方法。
已经为 SOAD 确定了下列需求:
一些通用原则或品质因素已经确定,并且可以作为 SOAD 中的设计基准:
自顶向下的业务级建模技术(如 CBM)可以为 SOA 建模活动提供起点。但是正如我们在前面提到的,SOA 实现很少是在全新的项目中开始的;创建 SOA 解决方案几乎总需要涉及集成现有的遗留系统,方法是将它们分解成服务、操作、业务流程和业务规则(同时参见 图 6):
所有的 OOAD 都同标识和定义服务有关;但是还需要具有更高层的观点。此外,当 SOA 致力于比经典开发项目层次更高的开发时,就有了发挥其他创造性思维的空间。
直接和间接业务分析
通过项目相关人员的会谈和 CBM 来进行 BPM 和 直接需求分析是一个容易理解且非常合适的标识候选服务的方法。
过去的经验表明,这条主要的途径应该通过补充 间接技术来加以改进。在选择候选服务时,产品经理和其他业务领导应该进行协商。例如,什么是计划付款和开票模型?应该商议假定使用正在构建中的系统的企业的组织结构图。建议还考虑一下非 SOA 项目中任何现有的用况模型。用于对正在构造的系统进行营销介绍的术语是另一个很好的关于服务操作候选者的来源(特别是动词,很少关注营销动词!)。
域分解
在 Endrei中定义的域分解、子系统分析、目标模型创建和相关技术是 SOA 流程构造方法或 服务概念化框架(它是基于 Levi and Arsanjani先前完成的工作构建的)最有希望的提议。来自 SEI的 FODA 工作也为这方面的讨论做出了贡献。
服务粒度
选择正确的抽象级别是服务建模的一个关键问题。您常常会听到 进行粗粒度建模的建议。这有点过于简单化了。您应该将其改为在不损失或损害相关性、一致性和完整性的情况下 尽可能地进行粗粒度建模。在任何 SOA 中,都有细粒度服务抽象的空间(假定有业务要求的话)。由于 SOA 并不等同于 Web 服务和 SOAP,因此可以使用不同的协议绑定来访问抽象级别不同的服务。另一种选择就是将一些相关的服务捆绑成粗粒度的服务定义,这是门面模式的变种。
命名约定
应该定义企业命名模式(XML 名称空间、Java 包名、Internet 域)。简单的例子就是始终用名词来命名服务,而用动词来命名操作。这种最佳实践来源于 OOAD 空间。
除了组合 OOAD、BPM 和 EA 技术之外,还有几个重要的 SOAD 概念和方面有待充实:
服务分类和聚合
服务有不同的用法和用途;例如,软件服务可以不同于业务服务(如前面的 图 5所示)。此外,还可以将原子服务编排成级别更高、功能齐全的服务。
服务组合可以通过可执行模型(如 BPEL 建模的模型)来加以简化;这是传统的建模工具和方法不能处理的事情。
策略和方面
服务具有语法、语义和 QoS 特征,所有这些都必须进行建模;正式的接口契约必须涵盖的比 Web 服务描述语言(Web Services Description Language,WSDL)的多。因此, Web 服务策略(WS-Policy) 框架是一个重要的相关规范。
除了已经制定的良好 体系结构可跟踪性原则之外, 业务可跟踪性也是一个理想的品质:应该有可能将所有的运行时构件直接与非技术领域专家可以理解的语言联系起来。这对于直接在业务和服务层公开的抽象非常重要。Sarbanes-Oxley (SOX) 法案是需要这种业务可跟踪性的业务驱动程序的一个例子。
流程:中间相遇
在真实世界中,并没有全新的项目,必须始终考虑遗留系统( 遗留系统是现有系统的同义词)。因此,需要 中间相遇的方法,而不是单纯的自顶向下或自底向上的流程。
在设计取决于现有的 IT 环境而不是现在和将来的业务需要的情况下,自底向上的方法往往会导致不好的业务服务抽象。而自顶向下的方法可能会产生不足的非功能性需求特征,并且损害其他的体系结构品质因素(例如因域模型中缺乏标准化而导致的性能问题),另外,也会在服务和组件中产生不匹配的不良问题。
服务获取和知识代理
这是一个知识管理和生命周期问题:如何成功地准备好服务并且使其在概念化之后可以重用?
应该将重用看作是标识和定义服务最主要的推动标准之一。如果组件(或服务)不可能重用,就不无法将其作为服务进行部署。它可以连接到另一个与企业体系结构相关的服务,但是不能单独作为一个服务而存在。
然而,即使从开始就计划好了重用,还必须形式化服务获取流程。由多个使用者使用服务是明确的 SOA 设计目标。构建时服务注册中心(例如企业 UDDI 目录)可能能够解决部分问题。
汽车工作订单(Automotive Work Order)描述了一家汽车维修公司管理其顾客运营的流程。我们将通过这个领域中的问题来阐述 SOAD 的观点。
工作订单代表汽车服务公司和顾客之间的约定,以进行一系列例行维修或应急维修,例如例行 50,000 英里服务,更换刹车片或轮胎,或者换油。
业务场景(如 图 7所示)如下:
如果您将此作为一个独立的应用程序从头开始创建,您就可能创建一组如 图 8所示的类。
如果您将工作订单构造为一个 OO 应用程序,这些软件对象将包含所有必需的业务规则,并且理解应该遵循的业务流程。
然而,这种方法在实践方面存在着一些缺点:
SOAD 为这些问题提供了极好的解决方案。由于它基于相关的行为对服务进行分组,而不是进行封装(行为及数据),所以这组服务与业务对象略有不同。
例如,您可能将工作订单(Work Order)和工作订单项(Work Order Item)一起分到工作订单服务(Work Order Services),并且创建日程安排(Scheduling)、目录(Catalog)和库存(Inventory)服务。另外,因为没有服务实例,所以没有与服务之间的关系等价的东西。工作订单的服务模型可能看起来如 图 9所示。
与 OO 范式不同,这个模型并不表示功能系统。既没有考虑流,也没有描述业务事件或规则。在 SOA 范式中,在服务外面维护的业务流程编排决定了执行服务调用的顺序和时间。
从概念上讲,从第一次顾客联系到完成工作和帐单支付的整个业务表示单个宏观层次的工作单元,并具有数天到数周不等的生命周期。毕竟,从企业的角度来看,工作单元会产生收入。
然而,实际出现的情况是在一段相对长的时间内单独发生的一系列集中活动,例如,定义活动、安排预约、选择零件和备件、进行维修活动等等。在 IT 系统中,没有实际的 流程会持续几分钟以上;事件之间的业务流程状态以数据的形式保存在数据库中。
这种类型的流程可以用状态转换模型(例如 UML 中可用的)很好地进行表示。 图 10显示了用有限状态机(finite-state machine)方法如何对业务流进行建模的示例。它是在业务流程进行时工作订单的状态如何改变的高级视图。
业务流程编排集中于状态之间的这些转变。单独的操作永久地记录相关的状态改变。
图 11显示了部分编排的示例,其中包括 图 10所示的业务场景中的步骤 1 到 5(例如,顾客定义他们的交通工作所需的工作,并且安排预约以进行实施)。
在本文中,我们已经讨论和激发了对创新的中间相遇的方法的需求,这种方法搭建了业务和 IT 之间的桥梁,并且支持 SOA 项目的分析和设计阶段。我们还提议将这种新的交叉学科的 SOAD 方法作为一个整体的建模规则,它以现在构建良好且广为赞誉的 OOAD、EA、和 BPM 为基础。
在详细定义 SOAD 表示法和流程的同时,还确定了关键的原理,比如服务概念化(或标识)、服务分类或聚合、策略和方面、中间相遇流程、语义代理和服务获取(以供重用)。
SOAD 需要增强现有的软件开发方法,进一步提高企业应用程序开发项目的可用性和适用性。随着时间的推移,还将发展相关的最佳实践。
我们还认识到,UML 在流程的表示法选择方面将继续占支配地位;可能需要进行增强以满足更广泛的 SOAD 的要求。
完成 SOAD 方法的下一步就是定义所需的端到端流程和表示法,复审活动中的角色和它们的责任,并且继续检查所提议的方法在项目中的有效性。
from:https://www.ibm.com/developerworks/cn/webservices/ws-soad1/