UML软件工程组织

 

 

SOA和契约式设计
作者:Bob Hensle 来自:dev2dev.bea.com.cn
 

很多人都记得以前的Reese花生酱黄油杯广告吧?其口号是“两种美食,美味加倍”,指得是花生酱和牛奶巧克力的结合。SOA和契约式设计这两大技术概念之间的关系就是如此。它们单独使用就很美妙,合在一起时更加美好。(如果您不喜欢Reese的甜点,可以替换成自己喜欢的美食组合:鲜草莓巧克力、茶味圆饼、干酪通心面等。)

众所周知,SOA中的“S”代表服务。但是组成服务的内容并没有明确定义。因此花点时间来明确定义SOA的服务。首先,谈论到SOA中的服务时,我们实际指的是可共享或可重用的服务。这是一项重要差别,因为可以轻易创建不可共享或可重用的服务,并且这很常见。开发人员借助目前的开发工具,仅仅通过右键单击就能创建web服务,使得创建这类服务尤其方便。“右键单击”过程确实创建了服务(也就是web服务),但是服务是不可共享或可重用的。因此不属于SOA的服务。反过来说,SOA的服务也不一定是web服务。

创建可共享或可重用的服务需要更多的努力。要可共享,必须有一些机制准确、详细地说明服务向其消费者提供的内容,以及要求消费者提供的内容(输入、规定的操作调用顺序等)。服务提供者和服务消费者之间的双向协议称为服务契约。服务契约不是使用当前的任何开发工具创建的。“右键单击”过程创建的是服务接口,而不是服务契约。服务契约是人类可读的工件,用于决定特定服务是否提供潜在服务消费者所需的功能。接口提供访问服务所需的技术绑定。

这有点理论化,因此下面列举一个大家都非常熟悉的具体例子。考虑一下Java消息服务(JMS)。“服务”这个令人苦恼的词又出现了。它是不是可共享/可重用的服务?明显,它是。什么使其可共享和可重用?有三个因素:

1. 契约 – JMS规范中明确指定了JMS提供的功能,因此潜在客户可以决定它是否满足需求。

2. 接口 – 消费者可以通过接口使用这些指定的功能。

3. 实现 – 接口背后的实现提供了规范中指定的功能。

JMS提供的服务是技术服务,而SOA中服务的实际意义是获得与提供业务价值的服务相同类型的可重用性的承诺。服务可以是提供对一些企业数据访问的简单服务,也可以是封装了整个企业活动的复杂服务。

不管封装的功能如何,服务要想成为可共享和可重用的服务,必须拥有服务契约、服务接口,当然还有实现。这就是SOA中服务的定义:由契约、接口和实现组成的服务。(这里我们没有使用术语可共享和可重用。后面用到的术语“服务”指的都是由契约、接口和实现组成的可共享、可重用的服务。)

实现必须满足服务契约的所有条款。这就是契约式设计的美妙所在。创建服务要求创建服务契约。首先创建契约,然后设计和实现服务以满足该契约(也就是契约式设计),这提供了合理的基础,您可以在该基础上构建一致的SOA服务工程。

在服务工程中使用契约式设计有很多优势,包括:

消费者和生产者平行开发

一旦编写好契约,服务的消费者就可以根据服务契约承诺提供的内容开始分析和设计工作。类似地,一旦创建了接口,消费者就可以根据该接口开始编写代码。

服务论证

服务论证是确定哪些服务有足够的商业价值,从而证明其构建、测试和试运行费用的合理性。一旦编写好契约,潜在的服务消费者可以确定它是否满足其需求。然后将该决策提供给论证过程,以确定是否构建该服务。还可能需要根据契约定义的功能,决定构建还是购买,或者是构建还是租用。

测试驱动开发

在测试驱动开发(Test Driven Development,TDD)中,单元测试用例是在开始开发代码之前编写的。一旦编写好契约,就可以根据契约和TDD开发单元测试用例,然后使用这些内容帮助确保服务实现的质量。

平行、独立的QA

一旦编写好契约,质量保证(QA)团队就可以为该服务编写测试规划和测试用例,该过程可以与服务实现工作平行进行。此外,QA团队不应该了解契约包含的内容,因此应保持QA测试完全独立于实现。这有助于确保契约的完整性和清晰度,还能确保真正的黑箱服务测试。

消除“右键单击”架构

由于契约是在服务实现之前创建的,因此不需要先编码,然后对web服务接口使用“右键单击”过程,并(错误地)声明存在新服务。

一致的服务文档

由于所有服务都必须有契约,所以创建标准契约模板用于提供所有服务的文档是有意义的。这样能保持服务的一致性,本身有助于共享和重用。契约模板还应该包括服务质量、延迟、吞吐量、成本、使用权以及除了操作和输入/输出消息以外的其他服务相关细节。

总之,SOA中的服务必须由契约、接口和实现组成。人们经常忽略或低估契约。但是,如果没有契约,则共享或重用的机会很少,因为服务消费者将必须直接与服务提供者交互,才能了解服务提供的功能以及如何正确地使用该功能。个体互动常常导致在无法满足期望时出现各说各话的情况。

由于契约是必需的,所以采用契约式设计(即在开始设计和实现服务之前创建契约)能带来相当多的好处。将SOA和契约式设计结合起来能提供美妙组合。

我很想知道,如果能在我儿时珍藏的复活节彩蛋糖果中尝出Reese的味道,该多么美妙。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号