一、历史回顾
自2005年11月开始,18家厂商致力于联合制定简化SOA应用开发新的行业规范(联盟厂商包括BEA,Cape Clear,IBM,Interface21,IONA,Oracle,Primeton Technologies(普元软件),Progress Software,Red Hat,Rogue Wave Software,SAP AG,Siemens AG,Software AG,Sun Microsystems,Sybase,TIBCO Software,和Xcalia),宣布了SCA(Service Component Architecture,服务组件架构)和SDO(Service Data Objects,服务数据对象)规范中关键部分的完成,并将正式提交给OASIS(The Organization for the Advancement of Structured Information Standards,结构化信息标准促进组织),通过其开放式标准过程进行推动。
此外,联盟厂商的厂商中立网站(www.OSOA.org)将继续用作获取草拟规范、白皮书的信息来源,并提供一个进行行业信息输入和反馈的论坛。
SCA规范旨在简化服务的创建和合成,对于运用基于SOA方式服务的应用构建十分关键。随着SCA规范的完成,联盟合作厂商希望将其标准化过程提交给OASIS。此外,联盟厂商也已完成了SDO规范,旨在实现对多个站点中多种格式数据的统一访问,并将把SDO基于Java的规范开发和管理提交给Java社团过程(JCP)组织,而基于非Java的规范(C++ )提交给OASIS。
SCA和SDO规范能帮助企业更便捷地创建新的以及改造现有的IT资产,使之可复用、易整合,以满足不断变化的业务需求。这些规范提供了统一服务的途径,大大降低了在应用开发过程中,因程序设计语言与部署平台的不同而产生的复杂性。SCA和SDO规范都是用于简化业务逻辑和业务数据呈现的新兴技术。
二、SOA 编程模型
[支持原创:http://www.infoq.com/cn/articles/SOA-programming-models]
随着面向服务架构(Service-Oriented Architecture)使用率的增长,由Web服务API(目前最流行的SOA实现技术),如Java中的JAX-RPC或.NET中的Web服务扩展(Web Services Extension,WSE)API,所提供的抽象级别对于有效实现SOA越来越显得力不从心:
目前尝试通过定义SOA编程模型(其中,从其他技术中借用了很多元素)来提高API 的抽象级别,这样可解决当前API 集合中的一些问题。编程模型的目标是,降低应用程序开发者直接处理中间件或Web服务特定API时面临的复杂度。通过从业务代码中移除大部分的通信支持,并将它们隐藏在编程模型抽象/实现之后,这样可以获得以下好处1:
1)简化业务服务的开发。
2)简化作为服务网络构建的业务解决方案的装配和部署。
3)增加敏捷和灵活性。
4)保护业务逻辑资产,使其不受底层技术改变的影响。
5)改善测试能力。
Web服务调用框架(Web Services Invocation Framework,WSIF)2 3是创建这种模型的最早尝试之一,最初由IBM发起,目前是Apache基金的一部分。
WSIF试图将服务使用模型与基于WSDL的服务定义结合起来——WSIF API直接支持WSDL语义。这使得WSIF能为使用不同传输协议的不同服务实现提供统一的调用模型。尽管WSIF本身从来没有获得广泛地采用,但它作为服务调用的API,被很多BPEL引擎使用,如IBM的WPC和Oracle的BPEL管理器。
对于SOA实现来说,以下3个模型是目前最流行的:
通过支持无缝的服务编排(orchestration)和许多对于成功实现SOA必需的模式,这些编程模型试图超越简单的服务调用,并期望提供更多的功能。它们同样也是实现企业服务总线(Enterprise Service Bus,ESB)的基础。在本文中,我们将对每个编程模型进行简单的概览。
Indigo是微软最新的面向服务架构的编程模型实现,支持丰富的技术集合,用于“创建,消费,处理和传送消息”。Indigo计划与下一版的Windows Vista一起发布。
Indigo将服务定义为暴露一组端点(endpoint)的程序,每个端点是3个主要元素的组合5:
通过允许使用包含不同绑定和端点契约(QoS)的复合端点(multiple endpoints)来暴露相同的功能(服务),这些定义有效地扩展了基于WSDL的服务定义。
Indigo编程模型的基础之一是使用OO实现SOA编程的所有方面。
SO实体 | OO实体 | 标注 |
服务契约 | 接口 | 使用[ServiceContract]]标注接口 |
服务操作 | 方法 | 使用[OperationContract]标注接口方法 |
实现类 | 类 | 使用[ServiceBehavior]标注类,它由服务契约接口派生。 |
实现方法 | 方法 | 使用[OperationBehavior] |
数据契约 | 类 | 使用[DataContract]标注类,[DataMember]标注成员 |
表1 Indigo中的SO实体和OO实体的关系。
表1显示了SO实体与OO概念之间的映射(由Indigo编程模型定义),以及将它们关联起来的标注6。SO与OO的融合既是Indigo的主要优点,也是它的缺点:
Indigo支持2种主要的服务调用方式:
根据服务提供的访问类型(RPC vs. 消息传递),它的契约被定义成接口(RPC)或消息(消息传递)契约形式(参见表1)。
Indigo的另一个基本特性是:引入连接器(提供安全可靠的通信的托管框架)用于访问服务端点。通过将“管道部分”分离进入单独的类(类层次),并在大多数情况下提供“标准”实现,连接器减少了用于构建互操作服务所必须的“管道代码(plumbing code)”,从而简化了“被连接系统”网络的创建7。
Indigo连接器使用很少的概念(端口、消息和信道),使得服务调用独立于传输协议或目标平台。它们中最重要的是信道(channel),它抽象了给(从)端口发送(接收)消息的处理过程。Indigo5中定义了2类信道:
Indigo同样支持组合信道概念——将一个信道置于其他信道之上。如,可以使用将安全协议信道置于HTTP传输信道之上来提供安全的HTTP传输通信。
Indigo连接器提供了一个构建(Build)为中介提供支持,包括防火墙、代理和应用程序级网关。这些中介是成功实现SOA所必须的很多模式的实现基础,包括消息验证、安全性加强、传输层交换、监视和管理、负载均衡和基于上下文的路由。
除了支持业务服务创建,Indigo还提供几个系统服务,它们可以被任何业务服务实现使用。这些服务的例子如下:
Java Community Process利用应用服务器托管应用程序的成功,将它的JBI实现建立在服务容器概念之上。
就像Java业务集成(IEEE互联网计算)8中定义的那样——“JBI是由容器和插件(Plug-in)组成的可插入式架构。这个容器托管使用消息路由进行通信的插件组件。架构上,组件通过一个抽象的服务模型(一个消息传递模型,位于任何特殊协议或消息编码之上的抽象层中)进行交互。"
在基于JBI的实现中,服务之间并不直接交互。取而代之的是,采用类似EAI实现中广泛应用的消息代理架构,JBI容器扮演在服务之间路由消息的通用中介,(见图1)。
图1 通过JBI协调消息交换
分离交换的参与者(JBI架构的基础9)在服务提供者和消费者之间提供了解耦,以及一个用于协调(mediating)服务通信量(或插入所有额外需要的功能)的明确位置e。
此时,协调器(Mediation)可以支持广泛的功能,从消息传送和安全加强,到基于内容的路由和服务标本标定。
JBI容器托管了2类不同的插件组件9:
组件间的交互利用了基于WSDL 2.0的标准化服务定义。WSDL 2.0定义在服务消费者和提供者之间提供了共享的协议,并作为JBI实现互操作能力的基础。
除了标准化的服务定义,JBI使用“通用化(normalized)”消息的概念支持全局组件互操作能力。消息通用化将协议与业务特定的上下文映射成一个通用的、可传输风格,这与EAI实现中经常使用的“规范(canonical)”消息表示概念非常类似g。
每个JBI容器存在于一个单独的虚拟机中,并容纳所有的BC和SE,容器提供了一组服务,为SE和BC实现提供操作性支持。
JBI也定义了基于JMX的标准控制集合,允许外部管理工具执行不同的系统管理任务,也可以管理组件本身。管理支持为以下情形提供了标准机制9:
尽管服务组件架构(SCA)10被作为规范定义(该规范定义了使用面向服务架构构建系统的模型),但它是一个有效的模型(该模型用来将组件组合成服务),并为服务组合成解决方案提供了额外支持。
SCA基于2个主要的元模型11:
这个元模型(见图2)描述组件类型、接口和数据结构11。
图2 描述组件、接口和它们依赖的元模型
一个组件实现由以下的4组规范定义10:
这个元模型(见图3)定义了组件实例,以及它们是如何连接的11。
这个元模型中实例的概念有别于在OO中使用的实例概念。此处的组件实例是指一个带有被完整解析的属性集,为解决特殊问题而修改组件行为的组件实现。
一个组合定义了很多组件实例,它们彼此交互,这里的交互使用连线(wire)来定义。
在SCA中,连线使得绝大多数的底层代码被抽出(与Indigo中的信道类似)。如,连线可以被定义同步的或异步的,支持组件调用的事务行为等。SCA在幕后处理这些底层细节。连线同样可以在任意方向上连接2个不同的接口语言(如Java接口和WSDL 端口类型/接口),只要这2个接口定义的操作是等价的就行了。
除了连线,SCA也支持通过特殊的组件类型,如导入(imports)和导出(exports),进行模块间通信。连线、导入和导出组件的结合使得组件可以引用外部服务。
组合元模型定义的组件组合,与服务组合既类似又不同,尽管两者都定义了使组件/服务一起工作的方式。通过被组合本身引入的功能,服务组合增强了参与服务的功能;而这个元模型只定义组件(更接近于服务实现)间的连接。
SCA实现依赖于服务数据对象(Service Data Objects,SDO)10,它提供了表示数据的通用模型的技术。SDO是组件的数据交换基础。SDO架构中的基本概念是数据对象——包含基本类型数据和(或)其它数据对象的容器。元数据提供了被包含数据的信息,它被数据对象显式引用。在SDO中数据对象的组合由数据图表示。除了对象本身,图中还包含变更概要,用来记录图中数据对象和属性在处理过程中变化的信息(类似微软环境中的ADO)。除了SDO,SCA还引入了服务消息对象(Service message objects,SMO),它提供了服务间处理和交换消息的抽象层(类似JBI中的标准化消息)。
SCA目前尚显稚嫩(本文写作时版本为0.9),并且还不支持SOA实现要求的大多数模式。作为替代,目前IBM的Websphere ESB/WPS 6.0的SCA实现引入了协调器框架12 ,它基于SCA并为协调器实现和定位提供了定义良好的机制。(类似Indigo中的中介)。
如果GUI支持,SCA实现会非常强大,可以在面板上实现图形化组件的连接,这种方式正是IBM的WebSphere Integration developer(WID)13 14 中所实现的。