分布式计算将网络上分布的软件资源看作是各种服务。面向服务架构是一种不错的解决方案。但这种架构不是什么新思想;corba和dcom就很类似,但是,这些过去的面向服务架构都受到一些难题的困扰:首先,它们是紧密耦合的,这就意味着如分布计算连接的两端都必须遵循同样api的约束。打比方说,如果一个com对象的代码有了更改,那么访问该对象的代码也必须作出相应更改。其二,这些面向服务架构受到厂商的约束。microsoft控制dcom自不必说,corba也只是一个伪装的标准化努力,事实上,实现一个corba架构,经常都是在某个厂商对规范的实现上进行工作。
web services是在改进dcom和corba缺点上的努力。今天应用web services的面向服务架构与过去不同的特点就在于它们是基于标准以及松散耦合的。广泛接受的标准(如xml和soap)提供了在各不同厂商解决方案之间的交互性。而松散耦合将分布计算中的参与者隔离开来,交互两边某一方的改动并不会影响到另一方。这两者的结合意味着公司可以实现某些web services而不用对使用这些web services的客户端的知识有任何了解。我们将这种基于标准的、松散耦合的面向服务的架构简称为soa。
soa的强大和灵活性将给企业带来巨大的好处。如果某组织将其it架构抽象出来,将其功能以粗粒度的服务形式表示出来,每种服务都清晰地表示其业务价值,那么,这些服务的顾客(可能在公司内部,也可能是公司的某个业务伙伴)就可以得到这些服务,而不必考虑其后台实现的具体技术。更进一步,如果顾客能够发现并绑定可用的服务,那么在这些服务背后的it系统能够提供更大的灵活性。但是,要得到种强大和灵活性,需要有一种实现架构的新方法,这是一项艰巨的任务。企业架构设计师必须要变成“面向服务的架构设计师”,不仅要理解soa,还要理解soa的实践。在架构实践和最后得到的架构结果之间的区别非常微妙,也非常关键。本文将讨论soa的实践,即:面向架构的设计师在构建soa时必须要做的事情。
soa的原则
要满足这种业务敏捷性,soa的实践必须遵循以下原则:
* 业务驱动服务,服务驱动技术
从本质上说,在抽象层次上,服务位于业务和技术中间。面向服务的架构设计师一方面必须理解在业务需求和可以提供的服务之间的动态关系,另一方面,同样要理解服务与提供这些服务的底层技术之间的关系。
* 业务敏捷是基本的业务需求
soa考虑的是下一个抽象层次:提供响应变化需求的能力是新的“元需求”,而不是处理一些业务上的固定不变的需求。从硬件系统而上的整个架构都必须满足业务敏捷的需求,因为,在soa中任何的瓶颈都会影响到整个it环境的灵活性。
* 一个成功的soa总在变化之中
soa工作的场景,更象是一个活的生物体,而不是象传统所说的“盖一栋房子”。it环境唯一不变的就是变化,因此面向服务架构设计师的工作永远不会结束。对于习惯于盖房子的设计师来说,要转向设计一个活的生物体要求崭新的思维方式。如下文所写的,soa的基础还是一些类似的架构准则。
soa基础
在it行业有两个越来越普遍的发展方向,一个是架构方面的,一个是方法学方面的,面向服务的架构设计师可以从中有所收获。第一个就是mda(模型驱动架构),由提出corba的omg模型提出。mda认为架构设计师首先要对待创建的系统有一个形式化的uml(也是由omg提出)的模型。mda首先给出一个平台无关的模型来表示系统的功能需求和use cases,根据系统搭建的平台,架构设计师可以由这个平台无关的模型得到平台相关的模型,这些平台相关模型足够详细,以至于可以用来直接生成需要的代码。
mda的核心就在于在设计阶段系统就已经完全描述,这样,在创建系统的时候,几乎就没有错误解释的可能,模型也就可以直接生成代码。但mda有一些局限性:首先,mda假设在创建模型之前,业务需求已经全部描述,而这一点,在当前典型的动态业务环境中几乎是不可能的。第二,mda没有一个反馈机制。如果开发人员对模型有需要改动的地方,并没有提供给他们这么一个途径。
soa的另一个基础是敏捷方法(am),其中非常有名的方法是极限编程(xp)。象xp这样的am提供了在需求未知或者多变的环境中创建软件系统的过程。xp要求在开发团队中要有一个用户代表,他帮助书写测试来指导开发人员的日常工作。开发团队中的所有成员都参与到设计之中,并且设计要尽量小并且非形式化。am的目标是仅仅创建用户想要的,而不是在一些形式化模型上耗费工作量。am的核心思想就在于其敏捷性-处理需求变更的敏捷性。am的主要弱点是其规模上的限制,例如,xp在一个小团队和中型项目中效果不错,但是当项目规模增大时,如果没有一个一致的清晰的计划,项目成员很难把握项目中的方方面面。
从表面看来,mda和am似乎是相对立的-mda假定需求是固定的,而am恰恰相反。mda的中心是形式化的模型,而am恰恰要避开它们。但是,我们还是决定冒险把这些不同方法中的一些元素提取出来,放入到一个一致的架构实践中。
在soa中有三个抽象层次,按照soa的第一条准则:业务驱动服务、服务驱动技术。am将业务模型直接和实践连接起来,表现在平台相关的模型之中。mda并没有把业务模型和平台无关模型分开来,而是把平台无关模型做为起点。soa必须连接这些模型,或者说抽象层次,得到单一的架构方法。我们将从五个视图的架构实现方法来实现这个连接。
soa的五视图实现方法
企业架构设计师发现他们的职业非常有竞争力并且值得骄傲,因为他们要从很多方面来通盘考虑it系统。kruchten(rup的开发负责人)将这些方面提取出来,在应用到soa时,我们称为五视图实现方法(five-view approach)。
四个方框表示对一个架构的不同审视方法,分别代表不同的涉众(stakeholder)。弟五个视图,use-case视图涵盖了其它视图,在架构中扮演的是一个特殊的角色。部署视图将软件映射到底层平台和相关硬件上,是系统部署人员对架构的视图;实现视图描述了软件代码的组织,是从开发人员角度出发的视图;业务分析人员则利用过程视图进行工作,它描述的是软件系统的运行时特性。最后,逻辑视图表示的是用户的功能需求。在soa中,面向服务的架构必须能够以use-case视图中的用例将用户连接到服务,将服务连接到底层的技术。
为了表示面向对象的架构是如何工作在这些视图之上,让我们将他们置于soa元模型的上下文之中。soa中两个领域存在重叠:由业务模型和服务模型表示的业务领域和由服务模型及平台相关模型表示的技术领域(两个领域共享服务模型)。业务用户通过逻辑视图和过程视图处理粗粒度的业务服务,根据变化的业务需求,按照需要将它们安排在过程之中。另一方面,技术专家的工作是创建并维护服务和地层技术之间的抽象层。表示这些服务的中间模型,起到的是轴心的作用,业务以它为中心进行。
soa元模型从mda中继承平台无关模型和平台相关模型,但是添加了am和用户交互以及敏捷的反馈这两部分,后者通过椭圆之间的双向箭头来表现。类似地,元模型通过引入由中心的服务模型提供的中间层抽象解决了am在伸缩性方面的问题。这样,服务模型中的任何需求的变化,都会反映到用户每天的业务处理中。同样,由于底层技术是模型驱动的,技术专家也可以根据这些变化的需求迅速而有效地作出应变。
soa实践和过去解决企业架构传统方式的不同之处就在于其对敏捷性的支持。如前所说,soa的第三条原则就在于它总在变化之中。这种恒在的变化性环境是soa实践的基石。如图所示,涉众(stakeholders,译者注:rup中也有这个词,表示软件开发中涉及到的各种角色如:用户、设计人员、开发人员乃至测试人员等等。)在一个必需的基础上影响到整个架构的变化。在当技术专家在每天的日常工作中不断对变化的业务需求作出响应的这种情况下,设计阶段和运行阶段之间的界限变得模糊起来,很难清晰地分离这两个阶段。
剩下的部分
我们已经为面向服务的架构提供了一个高层次的框架,其中mda和am的元素帮助工具的使用者来创建和维护soa。但是,soa中还缺少一些内容-那就是软件开发商和专业的服务组织必需提供的。理想情况下,开发商必需提供面向服务的业务流程、工作流以及服务的协调工具和服务;另外,能够以一种敏捷的、平台无关的方式充分反映业务服务的建模工具也是必须的;技术专家必须配备可以从模型中自动生成代码,并在代码变化时更新模型的工具,最后,开发商必须提供支持soa的软件,帮助面向服务的架构设计师以一种可信并且可伸缩的方式创建位于服务和底层技术之间的抽象层次。幸运的是,这方面的产品即将上市。
另外,最重要的就是贯穿本文的自顶而下的soa实现方法了。今天关于web services的大部分思考都是自底而上的:“这是如何创建web services的方法,现在,我们来使用它们集成吧”,对web services技术的这种方法是伟大的第一步,因为它可以惊人地降低集成的开销,这是现在的技术管理人员最乐意见到的了。但当经济进一步发展,it走出低谷,企业会寻求it的帮助来提高组织战略意义上的核心价值。使用面向服务的架构,it可以提供给企业实现业务敏捷性的这样一个框架。
