全文于2008年9月8日发布于InfoQ中文站上:http://www.infoq.com/cn/articles/consumer-driven-contracts 摘要 向SOA过渡给软件开发生命周期带来了许多新的挑战:机构只有形成一种明确面向服务的开发能力,才能战胜这些挑战。 本文为提高机构的服务开发能力提供了一些实践性建议。本文将先概述SOA给软件开发生命周期带来的一些挑战,然后讲述以“服务故事(stories for services)”和服务开发线(service development streams)间交换的单元测试为形式的消费者驱动的契约(consumer-driven contracts)何以能够增强面向服务开发的生命周期。 SOA给开发带来的挑战 面向服务(service orientation)不仅仅是采纳一种新的架构这么简单。若机构仅使其架构变得更加面向服务、而不对其开发技术作相应改变的话,那么SOA行动肯定要失败。 在启动、构建及运营服务方面的一些挑战包括: 在启动阶段,服务功能的描述必须能在多种场合下被重用:粒度既不能粗到仅在一种特定场合下能被重用,也不能细到要做大量补充工作方可在不同场合下被重用。 在构建服务时,我们必须确保提供者与消费者可彼此独立地进行演化。如果一项服务功能的消费者们必须随提供者改变而改变,那么该服务就不是真正松耦合的。 在运营服务时,我们需要理解各个服务之间的关系,以便我们可以诊断问题、评估服务可用性(availability)发生变化(常常是去除)时将产生的影响、并为各服务针对新的或变化的业务需求而演化设计计划。 从整体资产的角度来看,各服务的具体开发生命周期必须彼此协调一致,且没有不恰当地将各方拴在一个一体的、极其缓慢的、最终无法实行的活动时间表之上。 SOA给软件开发生命周期带来的挑战源于服务资产的联邦特性。有价值的业务成果不再是由那些“具有单向时间活动表,以及所有权、预算和运营边界都分散”彼此相隔的应用实现了;相反,它们是通过那些“拥有各自独特的服务开发生命周期的”服务之间的交互实现的。然而,协调好这些生命周期并不是一次搞定就完事了的。相反,正如我们将看到的,我们需要识别出一组代表着“对交付一个共同结果的承诺”的协作活动与制品(collaborative activities and artefacts)。这些活动与制品为时刻(若简单地看)将各条开发线联合起来提供了基础。 用敏捷方法实现SOA,意味着及早交付高价值业务成果且常常需要频繁地发布版本。若机构试图采用这种方法,那只会进一步加剧开发挑战。尽管其名称如此,但许多人认为敏捷的软件交付方式对与SOA相关的机构敏捷效益是不利的。由于在一个服务间存在着很多已知关联的环境中发布新版本的服务会有运营风险,所以敏捷方法频繁发布版本这一做法常被免去。而且,虽然敏捷鼓励各方进行密切及时地协作,但这种活动难以跨越多个不同服务及其生命周期进行协调。 联邦期望 传统的烟囱式应用开发把