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服务对请求进行某种形式的处理,而客户端并不要求一个立刻的回答。