浅谈面向构件的SOA架构
 

2010-02-04 作者:长风 来源:IT168

 

概述

面向服务架构(Service-oriented Architecture,SOA)描述了一种架构方法,它依赖于将业务流程和底层活动分解为基于标准的服务。在基于SOA架构的系统中,系统功能是由一些松耦合并且具有统一接口定义方式的服务(Service)组合构建起来的。显然,服务是SOA架构体系的核心。与此同时,构件技术再次引起了人们的关注,面向构件的思想源自那个困扰软件工程领域三十多年的难题—软件复用。当人们在研究如何实现SOA架构时,不约而同地将SOA和构件这两个软件工程领域最前沿的技术联系在一起,心中不禁涌动着一股莫名的兴奋。本文将以“面向构件的SOA架构”为主题,试图向读者描述构件和服务的涵义,以及两者之间的天然联系,同时简单介绍一些面向构件的SOA架构的基本设计思想和方法。

一 构件技术与SOA的天然联姻

构件技术代表软件开发领域的最新成果

1968年NATO软件工程会议,Mcllroy在提交会议的论文《大量生产的软件构件》中,提出了“软件组装生产线”的思想。从那以后,采用构件技术实现软件复用,采用“搭积木”的方式生产软件,成为软件开发人员长期的梦想。经过几十年的软件工程实践,软件开发已经经历了随意开发、面向结构和面向对象三个阶段,正在进入面向构件和面向服务阶段。在上海举办的第28届世界软件工程大会(ICSE2006)上,杨芙清院士在大会主会场开幕式上指出,软件工程已推进企业进入“工业化”生产时代,不断采用构件技术是未来软件生产力提高的主要来源。软件行业正处于从“手工作坊”式生产方式向“组装生产线”式生产方式转变时期,软件行业将由“工匠时代”进入到“工厂时代”。构件技术正是实现此次跨越的前提和基础,其对软件行业的意义不亚于福特对汽车工业的作用。

构件技术借鉴了传统制造业和建筑行业的经验,致力于创建一个可以互换的基于构件组装的软件世界。构件是软件中的自包含部分,具有已知的、良好定义的接口,可以被其它的软件使用。构件对自身的安全性、健壮性和性能负责,因此调用者可以放心使用。软件构件化将真正解决长期困扰软件行业的软件复用难题,从而提高生产率,降低生产成本。在传统制造业中,生产商要么自己生产需要的构件,要么向第三方购买这些构件,软件业也将很快过渡到这种生产方式,从而实现软件行业前所未有的跨越式发展。

构件技术是实现SOA的最佳手段

构件技术的目的是在保证构件自身质量(包括功能、性能、安全性和健壮性等)的前提下,实现构件的简单复用和组合,从而有效降低软件开发成本,大幅提高软件开发效率。北京市政风行风热线系统在用户测试阶段创造了一天修改近50个Bug的记录,这种效率在传统方式开发的系统中是难以想象的。

SOA则是一种面向服务的架构方法,根本目的在于实现业务单元(即服务)的封装、互操作和简单复用,同时使系统整体具备快速适应业务发展变化的能力。SOA与其说是一种新技术,不如说是一种系统架构设计的思想,用来填补业务实际和技术实现之间的鸿沟。SOA架构以服务的封装、组合和交互为基础,与消息关联,由策略控制。服务可以看作一组构件的组合,而构件则是服务的技术实现单元。在SOA中,几乎任何一段业务逻辑都可以封装为服务,从一个独立的构件到一个完整的基于大型主机的业务处理系统,如网上银行的在线交易系统,都可以封装为服务。

因此,构件技术是SOA的实现手段。关于构件与SOA的关系,普元软件公司CTO黄柳青先生有一段非常精辟的描述:“从应用开发层次看,构件技术是SOA‘服务’的组装和实现,而SOA则可以看作是在应用表现层次的软件‘构件化’。” 之所以称构件技术是实现SOA的最佳手段,主要是它与传统开发方式相比具有后者无法比拟的优势:

1. 构件具备SOA服务所要求大部分特征,可以很容易地封装成SOA服务

2. 构件技术使得系统自身可槊性很强,能够迅速适应需求变化。而快速适应业务需求的变化,正是SOA架构的精髓所在,在这方面构件技术具备明显的优势。

二、服务、服务、还是服务

服务是SOA架构的核心,因此理解SOA服务是正确理解SOA架构的关键。广义上讲,任何能够对外提供某种业务功能的实体单元都可以称之为服务。可以说,服务无处不在,我们每天都在享受服务,也在提供自己的服务。具体到SOA实践,服务还要求是平台无关的、松耦合、自包含和可编程的网络应用,服务可以以独立于平台的形式描述、发布、发现、协调和配置,从而实现高互操作性的分布式应用程序。例如,Web服务可以将软件应用包装成一种统一的计算模型,用以完成一项功能,进行一次商业事务,解决一个业务问题,将它们的特点以可编程的方式用标准的基于XML的语言和协议描述,通过自描述的接口进行调用。

服务有三个重要特征,即松散耦合、自描述的语义包装和可发现。

为了包容不同系统之间的异构性,服务之间必须遵循共同的描述语言和通信协议,以保证最佳的交互性。与传统分布式应用开发不同的是,SOA更强调服务(即业务单元)的松散耦合。经过几十年的发展,软件开发领域已经产生了大量的降低系统耦合度的技术,比如面向对象技术、虚拟机技术和工厂模式等。过去,人们往往从功能角度从系统中分离出外部接口,通过隔离接口和实现在系统耦合和互操作之间寻找平衡点。SOA要求我们从业务单元的角度从系统中分离出对外服务,通过隔离服务和内部实现来满足系统之间互操作和彼此独立的要求。这样做有一个明显的好处,就是系统在保持自身健壮的同时,可以准确满足业务的需求和迅速适应业务的变化。

服务另一个重要特征是自描述。服务应该能够描述自身实现的业务功能,使用方法以及访问协议等。这些信息可以依据策略对外发布,其它系统可以通过这些描述信息了解该服务可以做什么、如何调用、返回什么结果。从这个角度看,服务是一种公共契约,系统通过服务对外提供服务承诺,而用户可以通过公开的描述信息访问服务,不必了解服务实现的方式。例如,Web服务以描述语言-WSDL进行描述,提供功能性和非功能性的描述。功能性描述定义了整个服务行为,而非功能性描述包括服务可用性、可靠性、可扩展性、安全、认证、(事务)集成;以及性能特性,包括速度和精确性,时限信息和付款方式(资助,租赁,购买使用权,按次购买使用权等)。

服务还是可发现的。这意味着用户可以通过自己找到所需要的服务,并使用它。服务提供方可以完全不干涉,全部过程都由第三方或用户完成。这样做有一个明显的好处是可以大大降低服务的发布和使用成本。

服务的种类

根据互操作性,服务大致可分为简单信息服务和复杂服务。简单信息服务如新闻、货币转换,信用卡认证,帐户状态确认和天气预报等;复杂服务,需要用户和系统多次交互,服务本身可能需要访问和组合多个服务供者(如股票交易系统、旅游帮助系统、保险计算或包裹追踪系统等),通常是有状态的。Type I所表示的信息服务,只支持内置的操作,这类服务的处理过程包括等待请求信息、处理请求、返回请求Type II所示的复杂服务,实现了内置操作和外部操作的某种协调,通常是有状态的。

图1: 简单信息服务和复杂服务

信息服务一般都相对简单,通过简单的请求/响应顺序进行交互。信息服务可能包括复杂的实现。例如信息发布服务,其涉及系统可能包括内容管理系统、视频管理系统以及一些应用系统的信息发布模块。这些服务都是请求/响应模式、一来一回的,通常可以看成原子操作,服务装配器将这些服务组装成一个服务。

信息服务完成一个完整的业务单元。一般来说都不包括事务和交易。信息服务不处理服务请求之间的关系。从这个角度看,信息服务可以看作无状态服务。

信息服务目前有3个标准支持:(i)服务描述(WSDL),(ii)服务发布和发现(UDDI)和(iii)服务通讯协议(SOAP)。信息服务的局限是不包含事务处理、流程处理和复杂交易处理。

复杂服务可以处理事务,因而是有状态的。业务流程双方在交互信息中都包含了状态了信息,这些状态信息包括交互信息和业务的中间数据。复杂服务将保持一个或多个Web服务客户端发出多次的请求的状态。例如,一个安全的网上销售服务,购买和提供商谈判并完成订单。在这一过程中,会有大量信息交互,包括请求报价、返回报价、购买订单请求、订单完成确认等。在最终完成订单前,将要求长时间的事务处理和异步处理。除了和信息服务一样需要SOAP、WSDL、UDDI等协议的支持外,复杂服务还需要业务流程和事务处理的协议支持。复杂Web服务的标准仍然在发展之中,包括SOAP、WSDL、UDDI、WS-MetaDataExchange,以及Web服务流程执行语言BPEL等。

根据服务的使用对象,服务可分为可编程Web服务和交互Web服务。前者通过接口封装业务功能单元,并提供给其他服务或商业逻辑调用;后者通过人机交互,采集用户输入来完成服务处理过程。

1. 可编程Web服务

可编程Web服务封装一个可编程的业务流程,并通过外部接口暴露应用程序和构件的商业逻辑功能。这些接口可以由不同编程语言编写,包括Java/EJB、VisualBasic或者C++。外部应用或服务通过WSDL中描述的可编程接口调用这些Web服务。一个可编程服务的 典型实例是一个库存管理系统的库存查询功能,一个“库存检查”Web服务可以被一个“订单创建”服务调用,而“订单创建”服务本身是一个用户在使用订单系统的“创建购买订单”服务时调用的。

2. 交互Web服务

交互Web服务提供人机交互界面,可以直接面向用户提供服务。交互Web服务装配器可以集成多个Web服务,并实现特定的交互流程,并将集成后的服务提供给用户。

显然,以上两种类型的Web服务可以组合后发布。因此,一个业务系统往往既包含可编程Web服务又包含交互Web服务。

此外,根据服务请求处理方式的不同,我们可以将Web服务分为两类:同步服务和异步服务。

同步服务

同步服务的客户端把调用方法和参数作为请求消息,返回消息中包含了方法返回值。这意味着一个客户端在发送请求消息之后,一直要等相应消息返回后才能继续计算。这种类型的双向通讯服务和客户端之间的紧耦合,一般用于具有如下特征的应用程序中使用:客户端发出服务请求后立刻需要返回消息、客户端和服务之间的通讯是一来一回的对话形式、 服务是面向数据的。

典型的同步服务包括查询特定股票的价格,查询特定地点的天气,或者查询合同伙伴的信用情况等。

异步服务

异步服务是消息驱动的服务。当一个客户调用消息类型的服务时,客户端一般发出一个完整的消息,例如订货单而不是一系列参数。服务接受整个消息后进行处理,可能返回结果消息或者不返回。一个调用异步服务的客户不需要一直等到接受返回消息后再进行余下的操作。服务的返回消息,可能在之后的任意时间点到达。异步服务提供了客户和服务提供者之间的松耦合,前提是客户和服务提供者之间不需要严格的请求/响应耦合关系。异步服务一般在有如下特征的应用程序中使用:客户端不需要立刻得到返回消息、 服务是面向流程的。

典型的异步服务包括处理一个订单;对某个客户的报价请求进行响应。在这些例子中,客户端发出一个完整的消息给Web服务,例如一个订货单,Web服务对请求进行某种形式的处理,而客户端并不要求一个立刻的回答。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织