复合服务的设计和实现2010-03-01 infoq Boris Lublinsky当前大多数SOA方面的文章书籍都集中在个别的业务服务的定义和实现。构建企业的解决方案通常都需要结合多个现有的企业服务。这些复合而成的服务又可以与其他服务再次复合成更高级的解决方案。这种业务服务的递归复合是SOA最重要的特性之一,它使我们可以快速地在现有业务服务的基础上构建新的解决方案。随着业务服务(及其复合)的数量增长,要实现新的企业解决方案也变得更加容易。按照《Toward a pattern language for Service-Oriented Architecture and Integration 》的定义,产生复合服务的主要推动力来自以下方面:简化使用。当若干业务服务同时被多个消费者使用时,要向所有消费者披露其中每个服务及它们之间协作的规则等信息,这会令消费者的实现更加复杂。而当创造复合服务时,封装参与其中的服务以及强制对它们的调用规则,都能显著简化使用上的复杂性。提升重用性。原先没有计划到的新方案经常都可以用现有的服务组装出来。即使这些服务是为构造特定的方案而设计的,我们仍然能够以不同的组合方式用这些业务服务来实现原先没有预料到的方案。而且,手上可用的服务会促使我们想到前所未有的新方案。这些新方案常常可以由相对较少的服务发展或增强而产生,既低成本又快速。方案的配分、可见度、控制和变更管理。复合服务可以看作是整体方案的一种配分机制。跟EJB的本地和远程接口的情况类似,引入复合服务,并且只对外部用户暴露部分接口,使我们能够控制什么是对消费者可见的。这使得底层软件架构(复合服务的实现)有能力对需求变化做出快速反应,每当需求变化,底层软件架构就调整它的下一级服务的实现以及它们之间的相互联系,而对消费者没有或者只有轻微影响。。复合服务有两个方面(按照《Tools for Composite Web Services: A Short Overview》的说法):复合设计,关注的是综合的规范,来确定如何协调各组件服务(Component Service)去满足客户请求;复合的实现,即如何执行由复合设计产生的规范,以实际达成各服务之间的协调。在本文中,我们将分别从设计和实现两方面讨论复合服务的主要方式。复合设计复合设计是关于如何在一组现有服务的基础上设计出一个解决方案。它要做的是确定复合设计中用到的各个服务、它们之间交互的方式、以及复合的拓扑。服务的交互根据《Service–Oriented Composition in BPEL4WS》,复合的交互主要有两种设计方式:分层复合会话复合对于分层复合,复合服务的实现对于服务的消费者是完全不透明的(黑盒)。调用服务的消费者一直等待到执行完成,然后(直接或间接地)使用执行的输出结果(图1)。

图1 分层服务复合这种复合方式对于实现逐层分解的系统来说非常自然。每个层次被实现成一个独立的复合服务,并协调低一层的(符合)服务的执行。这也是工作流系统中对高层方案通常采用的建模方式——对一系列活动进行组合,而每个活动可对应一个低层的业务过程、或者由人或程序执行的一项任务。虽然任意复合服务可被使用它的外部系统监控和中断,但除了最初的调用之外,复合服务并不与服务的消费者发生任何其它功能性的交互1。虽然黑盒复合方式(分层复合)是对付复杂性的强有力工具,但在某些情况下消费者仍然需要根据执行的即时结果来控制复合服务的执行。会话复合可以完成这种功能。在会话复合的情形中,复合服务的实现对于服务的消费者仍然是完全不透明的,但特定的即时执行结果可被暴露给消费者(灰盒)。这是通过支持显式的会话状态来实现的(会话状态和执行状态的区别请见[4])——复合服务然后向消费者暴露出多个接口:一个用作原来的服务调用,其他的用作获取即时结果以及依此控制服务的执行(图2)。

图2 会话服务复合