随笔 - 181, 文章 - 2, 评论 - 85, 引用 - 0
数据加载中……

企业服务总线解决方案剖析,第 2 部分: 利用 WebSphere 6 中的 SIBus 实现 ESB

引言

ESB作为SOA的基础设施,在构建SOA的过程中起着举足轻重的作用,本文是ESB系列文章中的第二篇。在第一篇文章中,作者对ESB的基础知识进行了详细的介绍,本文将着重对IBM最新的应用服务器WebSphere 6中对ESB的支持进行实例化的介绍,希望通过具体的例子让读者更快,更方便的利用WebSphere 6的提供的基础设施向SOA(Service Oriented Architecture)进行迁移。

为了使本文更具有普遍性,在本文的样例中,作者模拟了一般可能出现的场景并给出了具体的讨论和实现。通过本文,读者最终可以自己利用WebSphere 6的SIBus实现ESB, 而本文所有的源代码和脚本将会提供给读者作为详细的参考。同时,本文中涉及的许多概念和基本操作流程本文所列的参考资料中都有详细介绍,本文就不再详细解释了。







1. 应用样例简介

本样例是一个简化了的零部件价格查询模块,通常,一个制造企业所需要的零配件可能来自各个厂商,也有可能是自己制造的,同时,它所制造的零件也可能被它的内部用户或者外部用户来查询。由于零件的价格变化比较频繁,所以这些价格的查询需要是即时的价格。下面是这个样例的Use case图:









2. 利用WebSphere 6中的SIBus实现ESB

在本样例中,零部件的供应厂商的变化是频繁的,各个厂商的报价系统有可能是多种多样的,而且本模块还需要为企业内,企业外的客户进行服务,如何构造一个灵活的,可扩展的体系结构来适应复杂变化的环境已达到随需应变的需求?SOA是解决这个问题的好方法!

首先,我们需要用WSDL来定义零部件价格查询的服务,这个WSDL文件相当于一个契约(Contract),它定义了这个服务的具体交互方式,所有的服务请求者和服务提供者都遵循这个契约,但是具体服务的实现方式,交互协议并不需要紧耦合在WSDL中,而且作为SOA的目标之一,使用者是无需知道服务者的端点地址和绑定方式的。

接着,我们需要把这个服务架构在ESB上。在SOA中,ESB是不可缺少的,核心的基础设施,因为服务将最终在其上进行整合。WebSphere 6中全新的Service Integration Bus(SIBus)组件是实现ESB概念良好的选择,它的提出是为了更明确的为服务集成,服务整合提供支持,关于SIBus中的一些基本概念和它的配置、管理,用户可以从WAS6 Info Center得到帮助,本文将注重如何利用SIBus来实现ESB的基本功能。

首先我们来看看在SIBus上,我们怎么架构这个应用,为了使读者有个整体的把握,我们先来看看整体的架构图:



下面就让我们来看看SIBus为实现ESB都做了哪些基础工作,每个基础工作又都为我们的样例应用提供了怎样的支持:

  • 整合内部和外部服务
    从这个框架中,我们可以看到,不管是外部服务还是内部服务,我们都把它们抽象成与端点地址和绑定方式无关的,统一的一个入口点: 服务目标(Service Destination),由它来在SIBus中代表零件查询这个服务。各个具体的服务提供者在SIBus中抽象成端口目标(Port Destination),由它来代表一个具体的绑定方式和服务访问点。SIBus为端口目标提供了多种绑定方式的支持,从而使它可以以HTTP(S), (Secure)JMS的方式的传输Web Service请求,对WS-Security和JAX-RPC Handler的配置都可以在端口目标级别进行,以适应各个服务提供者不同的要求。这样一个整合的过程在SIBus中是通过新建一个出站服务的方式来完成(Outbound)。
  • 对外发布内部的服务
    对外部用户,我们把对服务目标的访问通过绑定在某个End Point Listener上来间接的提供,这样一个过程在SIBus中是通过新建一个入站服务的方式来完成(Inbound)。这样做的好处是统一了外部用户的访问点,方便了我们的管理,更好的安全性和更方便的性能调优。当外部用户需要访问某个入站服务的时候,他可以通过入站服务发布的WSDL来获得具体的访问地址和绑定方式。
  • 企业内部对内部服务直接的访问
    对于企业内部的用户,我们让他们通过API Attach的方式来访问我们抽象出的出站服务。这种API Attach的方式使企业内部客户可以通过标准JSR 109规定的方法来直接访问出站服务所对应的服务目标,SIBus为此提供了专有的绑定,这种方式比通过End Point Listeners的方式有着更高的效率,从而更适合内部用户使用。
  • 消息灵活的中介
    SIBus提供了消息中介的基础框架和编程模型,用户可以在SIBus上定制各种消息处理机制,SIBus为消息中介提供足够的信息让它来进行各种有效的工作。在本文的样例中,我们使用了消息中介来解决了下面两个问题:
    • 外部的服务并不一定完全和内部的需求所匹配。在本样例中,我们的外部服务所暴露的接口方法名字和我们内部服务不一样,为了解决这个问题,我们开发了相应的消息中介并将这个消息中介绑定在相应的端口目标上来实现消息格式的转换。
    • 服务选择的问题,在本文样例中,我们有多个服务提供者存在,服务目标代表着其身后许多的端口目标及其相关的服务,我们仍然通过开放相应的消息中介来帮助我们实现我们需要的选择逻辑。
  • 对ESB高级特性的支持
    SIBus还为ESB提供了和J2EE紧密融合的安全机制,事务的传输机制,消息的QoS服务,还有和MQ消息系统的直接互连,虽然这些在本文样例中没有涉及,但在后面的文章中,我们将专门介绍这些高级特性。






3. 在SIBus上实现样例应用

为了实现本文的样例,我们需要定义好零部件查询服务WSDL,然后实现内部服务,开发需要的消息中介,发布这个应用,接着需要对内外部服务进行整合,最后把整合后的服务发布出去。为了本文样例的演示,还需要开发模拟的外部服务,模拟的内部客户和外部客户来使整个流程运转起来,下面我们就详细介绍各个部分的实现方法和关键点:

1.实现内部服务

首先,对内部服务,我们按照JSR 109的方式定义为Web Service。JSR 109规范定义的服务有两种基本方式,在Web Module中的Java Bean的方式和在EJB Module中的EJB方式,本文的样例中对外部服务采用了第一种方式来实现,对内部服务采用了第二种方式来实现,这为的是给读者提供全面的参考,同时也更符合实际的场景。

内部服务的具体实现可以参考样例中InsideService_JAR模块。这里需要指出的是当使用Java2WSDL来产生ejb绑定的WSDL的时候,WebSphere 6引入了新的EJB的绑定方式,这为的是省去SOAP方式的序列化和反序列化的过程,直接通过RMI-IIOP来进行更高效的通信,下面就是内部服务WSDL中绑定部分的定义:


												
														<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://partsinfo.com"
xmlns:generic="http://www.ibm.com/ns/2003/06/wsdl/mp"
xmlns:ejb="http://www.ibm.com/ns/2003/06/wsdl/mp/ejb" 
xmlns:impl="http://partsinfo.com" …>
     ……   
<wsdl:binding name="PartsInfoEjbBinding" type="impl:PartsInfo">
      <ejb:binding/>
      <wsdl:operation name="getPartPrice">
       <ejb:operation methodName="getPartPrice"/>
         <wsdl:input name="getPartPriceRequest">
         </wsdl:input>
         <wsdl:output name="getPartPriceResponse">
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>   
<wsdl:service name="PartsInfoService">
      <wsdl:port binding="impl:PartsInfoEjbBinding" 
	  name="PartsInfo_SEIEjb">
       <generic:address location= 
	   "wsejb:/com.insidecompany.PartsInfoHome?jndiName=……"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

												
										

请注意这里的EJB绑定方式和它的端点地址的表达方式,这种绑定和WSIF的EJB绑定是不一样的,WSIF在WebSphere 6中已经不再被建议使用。读者可以参考Info Center获得Multi-protocol JAX-RPC详细的信息和Java2WSDL的具体语法。

2.实现外部服务

对外部服务,我们用一个Web模块来模拟,它是一个按照JSR 109方式定义在Web Module中的以Java Bean方式实现的Web Service,具体实现可以参考样例中的OutsideService_WAR模块。需要注意的是:外部服务WSDL接口定义的方法和内部服务是不一样的,外部服务WSDL定义的服务方法是:getPartPriceOfOutService,内部服务WSDL定义的方法是: getPartPrice。

3.实现对消息的路由和格式转换

SIBus的消息中介框架是我们实现消息路由和格式转换的基础,开发者可以利用Rational Application Developer来开发,部署各种消息中介。我们这里将简要的介绍一下实现的关键,具体细节请参考Mediation_JAR模块中的QueryDispatcher类和Adaptor类:

  • 消息的路由:

    在本文样例中,我们将根据零件的编号的前缀来决定它属于哪个零部件厂商,从而把价格查询请求转发到该零部件厂商的服务所对应的端口目标上。具体的选择规则我们是通过配置目标上下文属性的方式来提供给消息中介的,详细情况可以请参考4.3中的说明。那么选择好了目的地后,怎么路由消息到那个目的地,而不是原来缺省的地址呢?我们来看看SIBus是怎样处理消息的分发的:

    在SIBus中,消息的路径是直接放在消息中的,路径分为前进路径和返回路径,每个路径都是一个SIBus上目标地址(Destination)的列表,消息传送引擎所做的工作就是从前进路径列表中取出第一个地址,然后把消息转发到这个地址所对应的目标。所以如果想更改消息的前进路径,我们只需把路径列表取出来,然后更改这个列表就可以了。下面的代码演示了如何把把消息转发到已选出的端口目标portDestination上。

    		……	
    	List frp = msg.getForwardRoutingPath();	//取得前进路径列表
    	SIDestinationAddress destination = 	//根据portDestination生成SIBus的目标地址类
    			SIDestinationAddressFactory
    				.getInstance()
    				.createSIDestinationAddress(
    				portDestination,
    				false);
    	frp.add(0, destination);		//把目标地址插在第一个位置
    	msg.setForwardRoutingPath(frp);      //把前进路径放回消息体
    	……
    	

  • 消息的格式转换:

    在本文样例中,外部零件厂商的服务接口和内部零件厂商的接口并不一样,所以我们需要在对外部服务请求发出去之前进行一定的消息格式转换,把消息转换成外部服务的格式才行,当然,这种转换必须在逻辑上是可行的才可以实现。我们先来看看SIBus中的消息格式:

    在SIBus中,各种消息格式将统一在SDO(Service Data Object)接口之上,我们只需通过SDO接口就可以对数据进行各种操作,包括格式转换,而无需使用各种不同形式的API,这无疑将大大减轻了开发者的负担。回到本例,我们需要对消息格式进行转换,具体的说就是需要变换操作的名称,从getPartPrice转到getPartPriceOfOutService,下面是本文样例中如何对消息格式进行变换的关键代码:

    ……
    if("getPartPrice".equals(operationName)){	     		           //对前进消息进行中介
    	String serviceDestination="dest:ESB_SHOWOFF:http://partsinfo.com:PartsInfoService";
    	String graphFormat="SOAP:"+serviceDestination+",
    http://partsinfo.com,PartsInfoService,PartsInfo";
    	String requestValue=info.getDataObject("body").getString("itemID");
    				
    	DataGraph graphNew=SdoRepositoryCache.instance().createDataGraph(serviceDestination);
    				
    	DataObject root=graphNew.createRootObject(graph.getRootObject().getType());
    	info=null;
    	info=root.createDataObject("info");
    				
    	info.setString("operationName", "getPartPriceOfOutService");
    	info.setString("messageName", "getPartPriceOfOutServiceRequest");
    	info.setString("messageType", "input");
    
    	DataObject body=info.createDataObject("body",				 //生成新的数据类型
    "http://partsinfo.com","getPartPriceOfOutServiceRequest");
    	body.setString("itemID",requestValue);
    ……
    

需要注意的是:

  • 我们对前进的消息进行消息变换的时候,对返回的消息也要进行反向的消息变换才能使服务请求者得到所期望的结果。
  • 我们需要一些WebSphere内部的接口(SdoRepositoryCache)来生成新格式的DataGraph,因为所有的数据类型都是在SIBus中的SdoRepository定义的。
  • 用户需要熟悉这些内部接口和SDO的API,不过,本文样例给出了很好的参考,基本解决了数据格式变换会碰到的问题。

4.整合内部、外部服务

现在,内部服务,外部服务都有了,消息处理中介也有了。下面我们就要通过新建一个出站服务来把他们整合在一起。我们需要给出站服务提供一个完整WSDL定义,来表示可以通过出站服务的数据类型,对本文样例来说,它需要涵盖内部和外部所有数据类型的定义,具体定义可以参考InsideClient_WAR模块中的PartsInfo.wsdl。我们在这个WSDL中定义了三个可以使用的端口:PartsInfo,PartsInfo_SEIEjb和PartsInfo_SIB,也就是有三个服务提供者可以选择,他们分别对应HTTP,wsejb和sib类型的绑定。同时,在新建出站服务的时候,我们可以同时把服务选择消息中介绑定到出站服务目标上,而消息转换的消息中介则需要在完成新建出站服务后手工绑定到外部服务所对应的端口目标上。我们可以通过管理控制台或者wsadmin命令行的方式配置出站服务,详细的脚本和参数请参考附件中的脚本ConfigSamples.jacl,最终配置结果在管理控制台中显示如下:



5.把SIBus上的服务发布到企业外

最后一步,我们需要把企业内部的服务发布出去,让外部的客户能够访问到我们的服务。我们可以通过新建一个入站服务来把SIBus内部的服务目标通过HTTP(S)或者(Secure)JMS Listener为外部用户提供统一的访问入口点。

新建入站服务的时候,我们需要提供一个模板WSDL来定义这个入站服务可以接收的服务请求,在这个模板WSDL中,我们只需定义我们需要向外部提供服务的端口类型就可以了,绑定类型和端点地址都不需要提供,实际上这些都是由Endpoint Listeners来具体决定的,我们一般称这种WSDL为non-bound WSDL,具体内容请参考InsideClient_WAR模块中的PartsInfo_Templet.wsdl。配置入站服务的参数请参考附件中的脚本ConfigSamples.jacl,最终配置结果在管理控制台中显示如下:









4. 本文样例的一些说明

在本文的样例中,我们在一个企业应用(WAS6ESB.ear)中模拟了各种角色,下表总结了这个应用的各个部分的和它们所扮演的具体角色,具体的部署后的结构图可以参考前面的整体架构图:



这个应用是基于Ant来构建的,读者也可以使用WebSphere Server Toolkit或者Rational Application Developer来辅助开发。打包文件中已经包含了Build好的结果,各种脚本在Scripts目录下,对具体脚本的功能请参考目录下的ReadMe.txt。

在部署的过程中,以下几点是需要注意和说明的地方:

1. WebSphere 6安装好后缺省是没有SIBus环境的,所以首先要建好SIBus,配置好Endpoint Listeners,读者可以用管理控制台来实现,也可以用作者提供的脚本来自动配置(WasSetupSIBus.bat),不过读者需要更改一下脚本中相关的目录信息。建好SIBus后还需要重启一下才能使它生效,要不然应用会报找不到引擎的错误。

2. 安装企业应用WAS6ESB.ear的时候可以使用脚本InstallWAS6ESBApp.jacl来自动进行,出站,入站和消息中介的配置,读者可以使用脚本ConfigSamples.jacl来自动进行,用户也可以自己通过控制台来完成,使用控制台时需要的参数可以参考脚本中的相关信息。

3. 目标上的上下文配置信息可以被灵活的利用来给消息中介提供帮助,本文样例中,我们就是通过在服务目标上加上上下文属性来决定服务的选择规则。我们加入了下列属性值:



这里,我们用属性的名称来代表零件标号的前缀,属性的值代表外部服务所对应的端口目标的名字,DispatcherMediation根据这些上下文属性来选择服务。这样做的好处是当有新的服务提供者加入的时候,我们只要增加一个端口目标并在服务目标上下文属性中加上规则就可以了。不过,WebSphere 6中没有提供脚本配置目标上下文属性的方法,所以这些属性需要手工加入。

4. SIBus为我们提供了灵活的运行时配置的支持,我们可以在应用部署以后动态更改端口目标中的端点地址和绑定空间,在本文样例中,我们就可以利用这个功能在新建完出站服务后更改各个端口目标的端点地址设置绑定方法而无需修改已有的应用和出站服务的配置,这个配置过程叫做Retarget。

5. 在SIBus中,所有流动的数据必须是有类型的,也就是必须有Schema来明确定义的,所以当我们需要更改消息格式的时候,需要把外部的服务的数据类型在新建出站服务的过程中的WSDL中有明确的定义,具体情况请参考新建出站服务过程中使用的WSDL文件。

6. 在内部客户端,我们提供了wsejb和sib两种绑定方式的动态DII调用的实现,因为这些都是私有的绑定方式,所以需要加一些特有的属性。DII方式比较灵活,不需要用WSDL2Java工具生成各种静态的辅助类,而静态方式的代码比较简单,用户不需要知道具体绑定和地址的细节,关于wsejb静态绑定的方式读者可以参考WebSphere 6本身的例子,本文样例中就不再赘述了,sib没有静态绑定的支持。

7. 外部客户端应用可以用任何标准的JAX-PRC客户端来模拟,对服务的具体WSDL可以从如下地址获得:http://localhost:9080/sibws/wsdl/ESB_SHOWOFF/PartsInfoInboundService,ESB_SHOWOFF和PartsInfoInboundService分别是Bus的名字和入站服务的名称,SIBus同时还提供发布相应的入站服务的WSDL到zip文件或者UDDI的功能,用户可以从管理控制台获得相关信息。客户端实现可以参考本文样例中的testWebService.java。

8. 内部客户端可以通过访问:http://localhost:9080/InsideClient/getPartPrice.jsp来测试,输入查询零件的编号,如果编号以outside开头,表明是外部零件,其他的都认为是内部零件。服务将返回编号中的数字,比如: 输入outside300,将返回零件价格300。输入inside400,将返回400。

9. 样例中提供的三个端口目标中,SIB类型的端口目标只是起参考作用,真正使用的时候需要绑定一定的消息中介来做路由,因为sib绑定现阶段只支持发送请求到服务目标。







5. SIBus展望

作为新一代实现ESB的核心组件,SIBus自身有着很多的先天优势,以长远的眼光来看,它将是架构SOA理想的基础设施,它的优势体现在:

  • 更方便的整合和部署:现在我们只需要WebSphere应用服务器就可以逐步向SOA进行迁移,而以往我们需要很多不同的产品来实现同样的目标。
  • 更灵活消息中介:通过和J2EE编程模型更紧密地融合(消息中介本质上是Stateless Session Bean),我们可以更方便,更灵活地开发消息中介模块来实现基于消息内容的动态路由(Routing),消息的重构(Transformer)和动态的消息多点分发(Distributing)等功能,本文的样例对前两种ESB中典型的Pattern都提供了实现方法。
  • 同应用服务器更紧密的集成:SIBus是纯Java实现,紧密集成在WebSphere Runtime中,从而更容易管理和配置,并且因为它基于WPM(WPM是Websphere 6中缺省的消息服务提供者),各种消息服务的高级特性都将自然的被支持。
  • 良好的可扩展性和可服务性:因为SIBus在设计的时候充分考虑了企业范围内的部署,并充分利用了WebSphere本身的可扩展性和可服务性,所以它呈现在人们面前的是一个充分互连和充分容错的,对上层用户透明的总线,关于在企业级进行部署这方面更详细的内容,我们将在这个系列中的另一篇文章中专门进行介绍。
  • 更多可以选择的SOA资产:在实现SOA的时候,因为有了SIBus,我们有了更多,更灵活的选择,很多典型的ESB Pattern将直接提供基于SIBus的Transform,这将大大提高开发者的效率。






6. 结束语

本文介绍了利用WebSphere 6中的SIBus实现ESB的基本步骤和方法,并提供了一个详细样例来帮助读者更快的进入角色,WebSphere 6中的SIBus还有着很多高级特性这里没有介绍,我们将在本系列以后的文章中一一介绍。而本系列的下一篇文章将介绍经典的,基于WebSphere 5,MQ系列的组件来实现ESB的方法,这些方法都是经过实际项目验证过的,有着充分的企业级应用的背景,所以在现阶段WebSphere 6的SIBus环境还没有被大规模应用的情况下,了解这些内容同样也有着重要的意义,欢迎大家阅读。

posted @ 2006-04-17 03:47 wsdfsdf 阅读(416) | 评论 (1)编辑 收藏

在企业级 SOA 中使用 Web 服务,第 5 部分: 使用 WebSphere Business Integration 工具优化 Web 服务应用程序

想要学习如何优化面向服务的体系结构(Service-Oriented Architecture,SOA)中的 Web 服务应用程序吗?Judith M. Myerson 强调了业务流程规则在优化 Web 服务的过程中具有最高优先级的重要性,并给出了其他优化技术的例子,例如减少 Web 请求的数量和执行时间。 她还讨论了 IBM WebSphere Business Integration,开发人员和业务分析人员可以使用这个工具来协作建模 Web 服务,以便进行优化 。

引言

在这个系列的第 1 部分中,我展示了如何执行 Web 服务的业务逻辑来使专有的企业应用程序集成(Enterprise Application Integration,EAI)应用程序可以交互。在第 3 部分中,我指出了 Web 服务如何相互通信来交流集成和实现多个 SOA 中的流程的方式。同样,我还在第 4 部分中讨论了开发人员可以如何使用 Rational® 开发工具来创建实际的应用程序。

在本文中,我将讨论在优化 Web 服务和 SOA 的过程中具有最高优先级的 Web 服务的业务流程规则。一旦开发人员优化了流程规则,那么他们就可以开始减少:

  • Web 请求的数量
  • 执行时间
  • 访问时间
  • 不需要的数据
  • 带宽量

开发人员还需要考虑连接到一个或多个 Web 服务的大型数据库的分区方案。







业务流程规则

为了减少通信量瓶颈或者加载开销,开发人员需要使用某些业务流程规则来优化跨 SOA 的 Web 服务的性能。他们应该使用用于 Web 服务的业务流程执行语言(Business Process Execution Language for Web Services,BPEL4WS)规范来创建新的业务逻辑、调用 Web 服务、操作数据、抛出错误或者终止流程。

您可以使用可执行的流程基于业务逻辑组成新的 Web 服务,以便实现组织的业务目标。您还可以使用抽象的流程作为两个合作伙伴之间在电子商务对话中如何进行交互的协议。







Web 请求

在优化业务流程规则之后,开发人员可以继续开发他们所需要的 Web 请求,从现有的 Web 服务构建新的 Web 服务。Web 服务是在 SOA 内部还是跨 SOA 都没有关系。如果新的 Web 服务——业务逻辑或者以数据为中心——提供更好的或者额外的服务或功能,开发人员必须减少或者完全消除冗余的 Web 请求。图 1 展示了两个现有的 Web 服务各自发送了一个冗余的 Web 请求来创建新的 Web 服务。


图 1. 冗余的 Web 请求
冗余的 Web 请求






执行时间

在开发人员优化了现有的 Web 服务可以发出的请求数量之后,他们还需要减少现有的 Web 服务的执行时间,以便在组合生命周期的任何时刻基于业务流程创建新的 Web 服务。以数据为中心的 Web 服务极少自己执行。

当开发人员组合新的 Web 服务时,他们应该当心不要导致新的冗余。为了消除冗余,可能需要将某些冗余的 Web 服务合并成为一个服务。







访问时间

如果给定最佳的执行时间,则减少访问时间是开发人员需要关心的另一个问题。当 Web 服务请求比较简单时,从数据库或者另外的数据源中访问所请求的信息的时间必须是最佳的。在使用和发布 Web 服务时必须注意请求不要互相重叠。

开发人员应该模块化、最优化和索引化请求,以便减少访问时间。然后,他们可以将 Web 请求放在储存库中,以便在新的应用程序中重用。







带宽量

正如您所知道的,Web 服务基于 XML,并且大部分文件都很小。通常带宽不是问题,而且执行和访问时间也都是最佳的。问题在于大的 XML 文件。当您每次更改远程服务器上的这些文件时,您需要重新传输整个文件。大的未压缩格式的图形文件可以消耗掉大量的磁盘空间和带宽量,从而延缓了访问时间。

作为部分的解决方案,开发人员只需要传输对新的 Web 服务的文件的更改。其他节省带宽的技术包括:加速页面加载的缓存技术、优化解析文本格式的 XML 文件的时间,以及将 XML 文件编译成二进制文件(不可读的)。







不需要的数据

开发人员应该指定筛选规则来清除他们不想要的数据。筛选规则与针对减少数据冗余的标准化规则不是一回事。他们同样也应该优化筛选规则,然后将它们(XML 格式)存储到储存库中,供以后调用。您可以在需要这些规则时从储存库中加载它们,而在您不需要时将它们卸载回储存库。筛选规则还应该包括对旧数据的自动清除或者备份、以及使大的 XML 文件不久后过期的机制。







分区方案

当 Web 服务连接到大型数据库时,应该注意是如何跨服务器访问、筛选和分发数据的,尤其是在后者位于不同的 SOA 中的情况下。为了在减少带宽的同时更快地进行访问,开发人员应该考虑两件事情:

  • 数据库的更新频率
  • 数据库更新部分的大小

如果数据库的大部分经常都需要更新,那么您应该考虑分区方案:硬件分区、水平分区或者垂直分区。而如果数据库只是一小部分经常需要更新,那么就考虑动态分区。

硬件分区

您可以使用独立磁盘冗余阵列(Redundant Array of Independent Disk,RAID)进行硬件分区,物理地将表放在单独的磁盘驱动器上而不必分割表。把一个表放在一个物理驱动器上而把其他的表放在单独的驱动器上可以提高吞吐量和操作效率。另外,您还可以选择将一个表拆开,放到多个驱动器上,这样比将同一个表存储在一个驱动器上扫描起来快。

水平分区

您可以基于年代水平地对数据进行分区。例如,您可以将一个大表分成十个小的子表,每个子表包括十年中的一年的数据和业务流程规则。

垂直分区

您可以使用这种方法将表分成若干个子表。您可以应用规范化的概念删除表的冗余部分,然后将它们放在次表中。您还可以在次表中建立外键,以链接主表中的主键。

动态分区

在某种情况下,您可能需要经常更新数据中相对较小而非常重要的子集,我们假定您的数据库中的绝大多数信息相对来说是静态的。如下面的图 2 所示,您需要分别按频繁更新和很少更新将数据库分成动态部分和静态部分。


图 2. 动态部分和静态部分
动态部分和静态部分

这就意味着您需要以这样的方式设计数据库系统,即将数据库表划分成两种类型——静态和动态——的模块化、最优化部分。您可以将静态的部分保存在本地服务器上,而将动态的部分转移到远程服务器供用户频繁地更新。您可以通过跨一组本地服务器和另一组远程服务器分割表来实现这一点。当新的 Web 服务更新数据库时,这种方法可以帮助减少多个数量级的带宽使用。







消除语言隔阂

开发人员和业务分析人员应该找到优化 Web 服务和 SOA 的方法的共同基础。这种方法存在的一个问题就是,他们往往使用不同的语言,使用不同的术语,并且具有不同的知识背景。

例如,业务分析人员使用流程模型来处理业务需求,而开发人员使用统一建模语言(Unified Modeling Language,UML)模型来专注于他们想要优化的 Web 服务的系统功能。解决这个问题的一种方法就是进行 UML 和业务流程建模(Business Process Modeling,BPM)模型之间的集成和转换。这将有助于进行良好的沟通,并减少由于缺乏交流而带来的成本。







WebSphere Business Integration 工具

下面是 IBM WebSphere® Business Integration(以前称为 IBM Holosofx)工具,您可以使用它们来消除这种隔阂:

  • IBM WebSphere Business Integration Workbench:这是一个 BPM 工具,您可以使用它通过共同的 UML/BPM 工作区来消除业务分析人员或经理与开发人员之间的隔阂。
  • IBM WebSphere Business Integration Monitor:使用这个工具,您可以显示来自 WebSphere MQ Workflow 所产生的事件的实时数据和历史数据。通过查看业务控制、业务和 IT 的工作流 (Workflow) 和业务仪表板 (Business Dashboard),您可以优化和管理业务性能。
  • IBM WebSphere Business Integration Workbench Server:这个工具向您提供储存库管理和 Web 发布功能。使用这个工具,您可以促进如下几方面的流程设计协作和即时 Web 访问:
    • 流程模型
    • 策略
    • 过程
    • 业务规则
  • IBM WebSphere Business Integration Modeler Advanced Edition:您可以在协作环境中使用这个工具来设计与多个用户交互的流程。这款产品由 IBM WebSphere Business Integration Workbench Server 和 IBM WebSphere Business Integration Workbench 许可捆绑组成。您可以在 Windows® 2000 或者 Windows XP 操作系统中运行 WebSphere Business Integration Modeler Advanced Edition。







结束语

优化跨 SOA 的 Web 服务需要提前计划实际上有多少依赖于业务规则的 Web 服务可以优化。开发人员应该就 Web 服务设计中使用什么建模技术和优化方案的问题与业务分析人员团队进行沟通。通过预先解决这个问题,开发人员将会发现他们优化 Web 服务的工作变得更加容易了。他们可以开发和优化相互交互和集成——在 SOA 内部以及跨 SOA——的 Web 服务。

分析人员同样也会发现,预先解决这些问题使他们设计和分析优化 Web 服务的业务端工作变得更加容易了。他们可以确定使用哪种建模方法、使用什么方案、以及在 SOA 中有多少 Web 服务可以优化。

posted @ 2006-04-17 03:44 wsdfsdf 阅读(122) | 评论 (0)编辑 收藏

用于实现 Web 服务的 SOA 编程模型,第 3 部分: 流程编排和业务状态机

组合服务的一种方法是使用业务流程执行语言(Business Process Execution Language,BPEL)将服务定义为业务流程,或者将它们表示为业务状态机 (business state machines)。编排这样一系列服务的调用的主线代码在一个称为流程编排引擎 (process choreography engine) 的特殊容器中运行。容器提供的功能可以支持甚至跨企业的边界执行长时间运行的流程,承受计划的和未计划的停用,并且促进企业到企业(business-to-business,B2B)的协作。

这是我们关于 IBM 的面向服务的体系结构(Service-Oriented Architecture,SOA)的编程模型系列的第三篇文章。上一篇文章介绍了 SOA 编程模型的概念和服务数据对象 (Service Data Object)。

业务流程

业务流程编排中的服务编排的概念对于二十世纪七十年代的 FORTRAN 编程人员来说或许并不陌生。它只不过就是调用函数或者子例程的主线代码的概念,其中每个函数或者子例程实现了更大的程序的一个单独的部分。现在,在二十一世纪,子例程变成了 Web 服务。主程序的实现语言是用于 Web 服务的 BPEL(请参阅参考资料以获得更多关于 BPEL 的信息)。执行环境是 IBM WebSphere® Business Integration Server Foundation 中的 Business Process Choreography 容器。而程序可以将许多可能跨多个企业的长时间运行的任务组合在一起来实现一个业务功能。


图 1. 简单的业务流程
简单的业务流程

图 1 展示了一个简单的内部旅行审批和预订流程的 BPEL 流程,涉及检查请求数据的程序、实际管理审批的人工任务,以及为实际执行预订而与合作伙伴进行的 B2B 交互。

由于没有重复提及许多关于 BPEL 的参考资料和教程(请参阅参考资料),因此我们在这里概要地列出了 BPEL 的一些特性以及 IBM 的 WebSphere Business Integration 中的 BPEL 实现所提供的扩展:

  • 可以与多个合作伙伴交互的长时间运行的业务流程。所有的交互都是通过标准的无状态 Web 服务调用执行的。相关性用来利用应用程序级数据处理特定的实例,例如根据员工序号审批某人的旅行请求。补偿功能用来在必要时(部分地)撤消流程的作用,例如,在已经预订了一个航班之后取消旅行请求。
  • 将人员整合到流程。一些业务流程的步骤常常是人工执行的(例如,在审批或者异常处理工作流中)。这些步骤包括分配人员工作的复杂情景识别 (context-aware) 的情况,例如双人监控原则 (four eyes principle),该原则规定第二个审批步骤由除第一个审批者之外的审批者来执行。这些要求可以通过将人工任务作为流程步骤来满足。Business Process Choreography 引擎和 IBM WebSphere Studio Application Developer Integration Edition 工具提供了对人工任务的支持。
  • 将流程嵌入到 Java™ 2 Platform, Enterprise Edition (J2EE),并且除 XPath(它是 BPEL 中的标准)之外,在流程中使用 Java 作为首选语言。当任何 Java 功能超出 BPEL 范围时,IBM 和 BEA Systems Inc. 就会在一个称为 BPELJ 的研究计划中提出对 BPEL 的 Java 扩展。这些扩展使编程人员能够使用 Java 代码段来实现流程中的活动,在 BPEL 允许表达式的地方使用 Java 作为表达式语言,以及使用 Java 操作流程中的工作数据。
  • 服务质量。生产系统所需的服务质量扩展,例如微调事务边界、适当地修复错误情况或者产生审核日志的功能。
  • 与 WebSphere 集成。流程编排引擎与事务引擎和 WebSphere 中的 Activity Service 集成在一起。与人有关的流程利用 WebSphere 用户目录和安全性。BPEL 流程是作为 WebSphere 应用程序部署的一部分进行部署的。业务流程的管理集成到 WebSphere 管理控制台中。

您可以使用 IBM Rational® 和 WebSphere 工具套件中的可视化业务流程编辑器来构建 BPEL 流程。将服务接口导入到资产视图 (asset view) 使您能够从 BPEL 流程调用外部服务。该工具套件还有一个用于调试流程的可视化调试器,包括调试长时间运行的流程的并行分支以及通过适当的用户界面与面对人 (human-facing) 的活动进行交互的功能。该工具套件同样也允许测试 BPEL 流程,以及将它们作为服务进行部署。







业务状态机

工作流过程与可能采取多个步骤和路径的动作或动词——例如,CreatePurchaseOrder 或者 BookTravel——相似,调用许多 Web 服务、Java 类或 Enterprise JavaBeans (EJB)。

如果工作流过程是一个动词,那么业务状态机就是一个表示事物 的名词,例如订购单、故障单或保险单应用程序。这里,动词——例如 CreatePurchaseOrderBookTravel——是对事物的操作。业务状态机上的操作可以调用任何服务,例如直接通过状态机指定的 BPEL 流程或者 Java 代码。

两种方法——过程或者状态机——中没有哪个是更好的。两者在功能上都是等价的服务抽象。无论选择哪一个对当前任务来说都是很好的服务抽象。

业务状态机是由状态转移图以图形方式指定的,状态转移图显示其状态、状态间可能的转移和触发状态转移的事件,以及作为结果的操作。图 2 是一个表示 PurchaseOrder 的简单状态机的流程图。


图 2. 表示订购单的业务状态机
业务状态机

节点(矩形)表示 PurchaseOrder 的可能状态,可以是 Created、Ready、InApproval、Purchased、Canceled、Shipped、Delivered 或者 Archived。弧线(箭头)表示可能发生的事件,导致 PurchaseOrder 从一个状态转移到另外一个状态。

业务状态机可以通过 BPEL 流程来实现。如果这样的话,事件就仅仅是 Web 服务描述语言 (WSDL) 所描述的流程的 portType 上的操作。当前状态(存储在一个变量中)决定了哪些事件(操作)是活动的。如果调用者试图调用无效的操作,那么运行时将抛出异常。您也可以查询状态机的当前状态来确定操作的有效性。

当一个事件发生时(例如,当调用一个操作或者定时器超时的时候),状态机转换到新的状态并执行与这个转换相关联的动作(例如调用操作或者方法)。在图 2 中,转移是通过带有事件注释的弧线、可选的条件以及将要执行的动作来反映的。转移只在其相关联的条件为真时才执行。在状态进入和退出时可能执行其他动作。在图 2 中,处于 Ready 状态的状态机具有两种可能的事件(已启用的操作):purchaseCancel。对于 purchase 操作来说,有两个可能的条件:要么需要审批,要么不需要审批。

当调用者调用购买操作时,业务状态机框架执行以下操作:

  1. 确定操作对于当前状态是否有效。
  2. 执行状态的退出动作(如果存在的话)。
  3. 计算与该事件相关联的所有转移的条件。假定对于此次购买需要审批,就选择转移到 InApproval 状态,而忽略到 Purchased 状态的转移。
  4. 执行与该转移相关联的动作,在本例中即 doApprovalAction()。例如,这个操作可能发送电子邮件给销售经理或者简单地调用另一个 SOA 组件(如 BPEL 流)上的操作。
  5. 进入新的 InApproval 状态。
  6. 执行新的状态的进入动作(如果存在的话)。

您可以使用 Rational/WebSphere 工具套件的可视化业务状态机编辑器来创建业务状态机。这个工具以类似的方式处理业务状态机和业务流程:它们可以具有相同的外部服务关系,并且它们的测试和部署环境完全相同。







总结

IBM 用于 SOA 的编程模型提供了若干构造新的面向服务的应用程序或者将现有的应用程序组合成服务框架的方法。本文重点介绍了使用业务流程执行语言的业务编排方法,它与调用传统的过程性编程中的子例程相似,增加了对于长时间运行的工作和并行工作的支持。业务状态机是另一个编程模型构件,它可以用 BPEL 来表示。没有哪种方法是更好的。选择最适合当前问题的方法。后续的文章将介绍其他组件类型,它们是 SOA 开发人员的常备工具。

posted @ 2006-04-17 03:43 wsdfsdf 阅读(281) | 评论 (0)编辑 收藏

基于RSA实现面向服务的体系架构

本文作为SOA&RSA系列文章的第一篇,从总体上介绍了SOA实现的相关技术,以及RSA中对这些技术的支持与扩展。在后面的系列文章中,我们将对一些主要技术和工具做有针对性的具体介绍。

1 概述

面向服务的体系架构(Service Oriented Architecture, SOA)就是在分布式的环境中,将各种功能都以服务的形式提供给最终用户或者其他服务。如今,企业级应用的开发都采用面向服务的体系架构来满足灵活多变,可重用性高的需求。IBM Rational Software Architect(RSA)是一套设计与开发工具,它构建在开放的、可扩展的Eclipse3.0平台之上,实现了多项行业最新标准,提供了灵活的插件扩展机制。借助UML2.0技术,它实现了模型驱动的软件开发模式,可以帮助开发团队创建更加强壮的软件结构。

本文作为SOA&RSA系列文章的第一篇,从总体上介绍了SOA实现的相关技术,以及RSA中对这些技术的支持与扩展。在后面的系列文章中,我们将对一些主要技术和工具做有针对性的具体介绍。







2 面向服务的体系架构 - SOA

在经典软件工程理论中,不管是瀑布方法还是原型方法,都是从需求分析做起,一步一步构建起形形色色的软件系统。但是,需求变更像一个挥之不去的阴影,时刻伴随着系统左右。每一个实际应用系统的开发者都饱尝了在系统进入开发阶段、测试阶段,甚至上线阶段遭遇应接不暇的需求变更的极端痛苦。如何解决这一问题?能否来一场软件开发和架构的革命?SOA的提出,就是被人看成这样的一场革命。其实质就是要将系统模型与系统实现分割开来。

2.1 什么是SOA

2.1.1 定义

SOA并不是一个新概念,有人就将CORBA和DCOM等组件模型看成SOA架构的前身。早在1996年,Gartner Group就已经提出了SOA的预言,不过那个时候仅仅是一个"预言",当时的软件发展水平和信息化程度还不足以支撑这样的概念走进实质性应用阶段。到了近一两年,SOA的技术实现手段渐渐成熟了,在BEA、IBM等软件巨头的极力推动下,才得以慢慢风行起来。

关于SOA,目前尚未有一个统一的、业界广泛接受的定义。一般认为:SOA,面向服务的架构是一个组件模型,它将应用程序的不同功能单元----服务(service),通过服务间定义良好的接口和契约(contract)联系起来。接口采用中立的方式定义,独立于具体实现服务的硬件平台、操作系统和编程语言,使得构建在这样的系统中的服务可以使用统一和标准的方式进行通信。这种具有中立的接口定义(没有强制绑定到特定的实现上)的特征称为服务之间的松耦合。

2.1.2 SOA中的特征

从SOA的定义中,我们看到两点:

  • 软件系统架构: SOA不是一种语言,也不是一种具体的技术,更不是一种产品,而是一种软件系统架构,它尝试给出在特定环境下推荐采用的一种架构,从这个角度上来说,它其实更像一种架构模式(Pattern),是一种理念架构,是人们面向应用服务的解决方案框架。
  • 服务(service)是整个SOA实现的核心。SOA架构的基本元素是服务,SOA 指定一组实体(服务提供者、服务消费者、服务注册表、服务条款、服务代理和服务契约),这些实体详细说明了如何提供和消费服务。遵循 SOA 观点的系统必须要有服务,这些服务是可互操作的、独立的、模块化的、位置明确的、松耦合的并且可以通过网络查找其地址。

基于上面讨论,我们给出SOA的下面一些特征:

  • 服务的封装(encapsulation)。将服务封装成用于业务流程的可重用组件的应用程序函数。它提供信息或简化业务数据从一个有效的、一致的状态向另一个状态的转变。封装隐藏了复杂性。服务的API保持不变,使得用户远离具体实施上的变更。
  • 服务的重用(reuse)。服务的可重用性设计显著地降低了成本。为了实现可重用性,服务只工作在特定处理过程的上下文(context)中,独立于底层实现和客户需求的变更。
  • 服务的互操作(interoperability)。互操作并不是一个新概念。在CORBA、DCOM、web service中就已经采用互操作技术了。在SOA中,通过服务之间既定的通信协议进行互操作。主要有同步和异步两种通信机制。SOA提供服务的互操作特性更利于其在多个场合被重用。
  • 服务是自治的(Autonomous)功能实体。服务是由组件组成的组合模块,是自包含和模块化的。SOA非常强调架构中提供服务的功能实体的完全独立自主的能力。传统的组件技术,如.NET Remoting, EJB,COM或者CORBA,都需要有一个宿主(Host或者Server)来存放和管理这些功能实体;当这些宿主运行结束时这些组件的寿命也随之结束。这样当宿主本身或者其它功能部分出现问题的时候,在该宿主上运行的其它应用服务就会受到影响。SOA架构中非常强调实体自我管理和恢复能力。常见的用来进行自我恢复的技术,比如事务处理(Transaction),消息队列(Message Queue),冗余部署(Redundant Deployment)和集群系统(Cluster)在SOA中都起到至关重要的作用。
  • 服务之间的松耦合度(Loosly Coupled)。服务请求者到服务提供者的绑定与服务之间应该是松耦合的。这就意味着,服务请求者不知道提供者实现的技术细节,比如程序设计语言、部署平台,等等。服务请求者往往通过消息调用操作,请求消息和响应,而不是通过使用 API 和文件格式。这个松耦合使会话一端的软件可以在不影响另一端的情况下发生改变,前提是消息模式保持不变。在一个极端的情况下,服务提供者可以将以前基于遗留代码(例如,COBOL)的实现完全用基于 Java 语言的新代码取代,同时又不对服务请求者造成任何影响。这种情况是真实的,只要新代码支持相同的通信协议。
  • 服务是位置透明的(location transparency)。服务是针对业务需求设计的。需要反应需求的变化,即所谓敏捷(agility)设计。要想真正实现业务与服务的分离。就必须使得服务的设计和部署对用户来说是完全透明的。也就是说,用户完全不必知道响应自己需求的服务的位置,甚至不必知道具体是哪个服务参与了响应。

2.2 SOA不等于web 服务

由于Web服务与SOA有着很多相同的技术特点,如:基于XML语言,符合SOAP、WSDL和UDDI标准等,很多人都认为下一代Web服务就是SOA。 Web服务可以用来实现SOA,但是如果没有Web服务,企业照样也可以很好地实现SOA。反之,即便是利用Web服务技术,也不一定能保证SOA的效果就更好。

Web服务与SOA关系如图1所示。



Web服务是一套技术体系,可以用来建立应用解决方案,解决特定的消息通信和应用集成问题。随着时间的推移,我们发现,这些技术在不断发展、不断成熟,也会更好地帮助你实现SOA。SOA是一种软件架构,而不局限于某个技术的组合(例如Web服务),它超越了技术范畴。在一个商业环境中,纯粹的SOA是一种应用软件架构,其中所有的功能都是相互独立的服务模块,通过完备定义的接口相互联系起来。只要按照一定的顺序来请求这些功能模块所提供的服务,就可以形成完整的业务流程。正如IBM SOA技术和策略总监Mark Colan先生强调的那样:"Web服务的确是实现SOA一条最好的路,但不等同于SOA。"

SOA的灵活性将给企业带来巨大的好处。如果把企业的IT架构抽象出来,将其功能以粗粒度的服务形式表示出来,每种服务都清晰地表示其业务价值,那么,这些服务的顾客(可能在公司内部,也可能是公司的某个业务伙伴)就可以得到这些服务,而不必考虑其后台实现的具体技术。更进一步,如果顾客能够发现并绑定可用的服务,那么在这些服务背后的IT系统能够提供更大的灵活性。

但是,要得到这种灵活性,需要有一系列实现架构的新方法,这是一项艰巨的任务。企业架构设计师必须要变成"面向服务的架构设计师",不仅要理解SOA,还要理解SOA的实践。在架构实践和最后得到的架构结果之间的区别非常微妙,也非常关键。那么目前SOA的实现技术究竟有哪些呢?







3 SOA的实现技术

3.1 实现SOA的核心技术 - web 服务

正如我们前面所讲的,服务是整个SOA实现的核心,web服务相关技术自然成为实现SOA的首选。

  • XML
    XML 1.0 (可扩展标记语言,Extensible Markup Language) 标准是一个基于文本的 World Wide Web 组织 (W3C) 规范的标记语言。与 HTML 使用标签来描述外观和数据不同,XML 严格地定义了可移植的结构化数据。它可以作为定义数据描述语言的语言,如标记语法或词汇、交换格式和通信协议。
  • SOAP
    简单对象访问协议 (Simple Object Access Protocol) 是一个基于XML的,用于在分布式环境下交换信息的轻量级协议。SOAP 在请求者和提供者对象之间定义了一个通信协议,这样,在面向对象编程流行的环境中,该请求对象可以在提供的对象上执行远程方法调用。因为SOAP是平台无关和厂商无关的标准,因此尽管SOA并不必须使用SOAP,但在带有单独 IT基础架构的合作伙伴之间的松耦合互操作中,SOAP仍然是支持服务调用的最好方法。
    W3C SOAP 1.2规范在服务请求者和服务提供者之间定义使用XML格式的消息进行通信。将应用程序请求(在XML中)放入 SOAP 信封中(也是 XML ),并从请求者到提供者发送应用程序请求,提供者发回的响应也采用相同的形式。最近 SOAP 被称为面向服务的架构协议 (Services-Oriented Architecture Protocol)。 SOAP的优点在于它完全和厂商无关,相对于平台、操作系统、目标模型和编程语言可以独立实现。另外,传输和语言绑定以及数据编码的参数选择都是由实现决定的。
  • WSDL
    Web服务描述语言 WSDL (Web Services Description Language) 是一个提供描述服务IDL标准方法的XML词汇。Web 服务描述语言(WSDL)规范定义了一个 XML词汇表,该词汇表依照请求和响应消息,在服务请求者和服务提供者之间定义了一种契约。我们能够将Web服务定义为软件,这个软件通过描述SOAP消息接口的 WSDL文档来提供可重用的应用程序功能,并使用标准的传输协议来进行传递。
    WSDL描述包含必要的细节,以便服务请求者能够使用特定服务:
    • 请求消息格式
    • 响应消息格式
    • 向何处发送消息。
    WSDL 是基于 XML 的,因此 WSDL 文档是计算机可读的(machine-readable)。这样开发环境使用WSDL将集成服务的流程自动处理到请求者应用程序。例如 WebSphere Studio产生一个Java的代理对象,它能够像本地对象一样实现服务,但是实际上代理对象仅仅处理请求的创建和响应消息的解析。不管服务是否用Java、C#或者其他的语言实现,生成的Java代理对象都能够从WSDL描述中调用任何的Web服务。实际上,WSDL不能像编程语言那样描述实现细节。
  • UDDI
    统一描述、发现和集成 (Universal Description, Discovery and Integration) 规范提供了一组公用的 SOAP API,使得服务代理得以实现。UDDI为发布服务的可用性和发现所需服务定义了一个标准接口(基于 SOAP 消息)。UDDI 实现将发布和发现服务的 SOAP 请求解释为用于基本数据存储的数据管理功能调用。
    为了发布和发现其他SOA服务,UDDI 通过定义标准的 SOAP 消息来实现服务注册(Service Registry)。注册是一种服务代理,它是在 UDDI 上需要发现服务的请求者和发布服务的提供者之间的中介。一旦请求者决定使用特定的服务,开发者通常借助于开发工具(如Microsoft Visual Studio .NET)并通过创建以发送请求并处理响应的方式访问服务的代码来绑定服务。
    SOA不需要使用UDDI,但由于 UDDI 是建立在SOA上来完成自身工作的,所以UDDI是服务发现的一个好的解决方案。

3.2 SOA 基础架构的关键组件 -企业服务总线(Enterprise Service Bus,ESB)

企业服务总线ESB(Enterprise Service Bus)是SOA架构的一个支柱技术。 作为一种消息代理架构它提供消息队列系统,使用诸如SOAP或JMS (Java Message Service)等标准技术来实现。 有人把ESB描述成一种开放的、基于标准的消息机制,通过简单的标准适配器和接口,来完成粗粒度应用(比如服务)和其他组件之间的互操作。

ESB的主要功能有:通信和消息处理、服务交互和安全性控制、服务质量和服务级别管理、建模、管理和自治、基础架构智能等。ESB由中间件技术实现并作为支持 SOA 的一组基础架构,支持异构环境中的服务、消息,以及基于事件的交互,并且具有适当的服务级别和可管理性。

SOA的原则可以描述如下:

  • 利用显式的与实现无关的接口来定义服务。
  • 利用强调位置透明性和可互操作性的通信协议。
  • 封装可重用业务功能的服务的定义。

为了实现 SOA,应用程序和基础架构都必须支持 SOA 原则。启用 SOA 应用程序涉及到创建服务接口,服务接口可以直接也可以间接地通过使用适配器用于现有的或新的功能。从最基本的级别来看,启用该基础架构涉及到规划功能来将服务请求路由和传递给正确的服务提供者。然而,基础架构支持在不影响服务的客户端的情况下由另一个服务实现替代原有的服务实现也是至关重要的。这不仅需要根据 SOA 原则指定服务接口,而且需要基础架构允许客户端代码以独立于所涉及的服务位置和通信协议的方式来调用服务。这样的服务路由和替代是 ESB 的许多功能中的一部分。

ESB 支持这些服务交互功能,并提供集成的通信、消息传递以及事件基础架构来支持这些功能。因此,它将当今正在使用的主要企业集成模式组合成一个实体。ESB 为 SOA 提供与企业需要保持一致的基础架构,从而提供合适的服务级别和可管理性、以及异构环境中的操作。图2显示了ESB为SOA提供的基础架构:



ESB 需要某种形式的服务路由目录(service routing directory)来路由服务请求。然而,SOA 可能还有单独的业务服务目录(business service directory),其最基本的形式可能是设计时服务目录,用于在组织的整个开发活动中实现服务的重用。Web 服务远景在业务服务目录和服务路由目录的角色中都放置了一个 UDDI 目录,因而使得可以动态发现和调用服务。这样的目录可以视为 ESB 的一部分;然而,在这样的解决方案变得普遍之前,业务服务目录可能与 ESB 是分离的。

Business Service Choreographer 的作用是通过若干业务服务来组合业务流程;因此,它将通过 ESB 调用服务,然后再次通过 ESB 将业务流程公开为客户端可用的其他服务。然而,Business Service Choreographer 在编排业务流程和服务中所扮演的角色确定了这种业务工作流技术是一种与基础架构技术 ESB 分离的技术。

最后,B2B Gateway 组件的作用是使两个或多个组织的服务在受控且安全的方式下对彼此可用。这有助于查看这些连接到 ESB 的组件,但它们并不是 ESB 的一部分。虽然有一些网关技术可以提供适合于实现 B2B Gateway 组件和 ESB 的功能,但是 B2B Gateway 组件的用途是将其与 ESB 分离。事实上,这种用途可能需要附加的功能(如合作伙伴关系管理),这些功能不是 ESB 的一部分,并且不一定受到 ESB 技术的支持。

3.3 实现SOA的方法学 - 模型驱动的开发

SOA强调松散耦合,强调跨平台集成,这与模型驱动的架构和开发不谋而合。模型驱动的架构和开发(Model Driven Architecture, MDA以及Model Driven Development, MDD)并没有把业务模型和平台无关模型分开来,而是把平台无关模型做为起点。

MDA由提出CORBA的OMG模型提出。MDA认为架构设计师首先要对待创建的系统有一个形式化的UML的模型。MDA首先给出一个平台无关的模型来表示系统的功能需求和use cases,根据系统搭建的平台,架构设计师可以由这个平台无关的模型得到平台相关的模型,这些平台相关模型足够详细,以至于可以用来直接生成需要的代码。

基于MDA的思想,利用MDD方式,我们可以对SOA进行建模,在此基础上,实现各种形式的模型转换或扩展实现SOA.







4 RSA对SOA实现技术的支持

IBM 软件开发平台提供了对SOA 应用程序开发的最好支持。IBM 软件开发平台包含 Rational 产品家族、向导、模板、及构建应用程序的指南,Rational 开发工具是基于成功的并且非常受欢迎的 Eclipse 平台,它不仅易用、灵活,而且在每一个开发进程中都可以使用外部开发环境。图3显示了基于 Eclipse 的 IBM Rational 产品体系。



Rational Software Modeler 提供了使用设计标准(比如统一建模语言,UML )构建模型的能力。通过 Rational Software Modeler,可以将这些模型转变为类和源代码。关于Web 服务的开发,Rational Web Developer for WebSphere Software Version 6.0 提供了一种端对端的环境。利用它,不仅可以完成开发和测试,还可以通过 WebSphere Application Server 产品完成 Web 服务的部署。

Rational Software Architect, RSA涵盖了RAD以及RSM的全部功能,提供了对基于模型的开发以及web应用开发的最好的支持。

4.1 对web服务开发的支持

RSA中包含了构建 Web 服务的专门工具,可以通过自顶向下,自底向上,为web服务建模等不同角度进行web服务的开发,提供了代码编写和完成应用程序的开发环境。还可以使用一些额外的工具(比如 IBM Rational Functional Tester),对应用程序进行测试,然后把它部署到 WebSphere 服务器平台中。

首先,RSA提供了XML的编辑器,可以对XML进行图形化的显示和编辑,图4显示了对XML的图形编辑界面及其对应的源代码。



另外,在RSA中可以创建web service及其相关的多种资源,如图5所示



当我们想将现有的资源,如Java Bean或者EJB作为web服务进行发布时,RSA中提供相应的支持,如图6所示:



相反,如果我们想生成已有的WSDL对应的web服务实现代码,也可以使用RSA中相应的工具,如图7所示:



RSA中提供了Web服务浏览器,使得发现web服务变得更容易,同时,RSA提供了图形界面对web服务的WSDL进行显示和编辑。见图8:



由于RSA提供了对UML2.0的支持,我们同样可以根据对web服务建模,通过模型转换来生成相应的web服务WSDL。如图9所示:



RSA贯穿整个应用程序开发的生命周期,使得应用程序的设计更加轻松,更一致地将 SOA 应用程序的组件捆绑在一起。

RSA内嵌了WebSphere Application Server 6.0的运行环境,WAS 6.0中的SI-BUS实现了ESB,因此我们可以用RSA进行SOA、ESB的部署和测试。如图10所示,可以在RSA上创建WAS 6.0的服务实例,并在此服务上部署ESB。



4.2 基于模型的开发与软件资产重用

除了对web服务开发的支持,RSA还提供对UML2.0规范以及可重用资产规范(Reusable Asset Specification, RAS )的支持。这就使得基于模型的开发(Model Based Development, MDA) 和基于资产的开发(Asset Based Development, ABD)成为RSA最有优势的两大特征。这里我们只作简单介绍,在本文的后续文章中,我们将对这些开发作详细介绍。

4.2.1 支持UML2.0的MDA平台

UML是实现MDA技术的一把钥匙,它使得用MDA技术创建的所有应用程序都基于标准化的、平台独立的UML模型。通过将这一通用的、被普遍接受的建模标准作为杠杆,MDA使得开发人员可以创建能被轻便地访问、天生具有良好的互操作性的应用程序。我们在前面提到,利用RSA可以对web服务建模,通过模型转换生成web服务。

基于Eclipse平台的RSA,提供各种模式(Pattern),模板(Template)插件的开发,通过这些高可重用度的模式及模板,用户只需要简单的参数配置,就可以得到相应的模型,代码及其他资源。图11显示了应用RSA模式生成新的模型,再基于新模型生成可部署的项目及代码。



4.2.2 Recipe - 基于资产的开发(Asset Based Development)

RSA中的解决方案指导(Solution Guide)插件基于可重用资产规范对资产的创建,打包,发布,到重用提供了全方位的支持。可以将各种模式,模型及其他可重用资源作为资产导出,存入本地或远程资产库以便重用及共享,资产在资产库中按照一定的方法进行分类,在RSA中使用资产库浏览器对资产进行查找时一目了然。图12是在可重用资产视图中,浏览资产库。









5 总结

在本文中,我们讨论了面向服务体系架构的基本概念以及实现技术,并列出了IBM Rational产品RSA对实现SOA的技术的支持,在后续的文章中,我们将对本文中涉及的各项具体技术实现细节作详细介绍。

posted @ 2006-04-17 03:42 wsdfsdf 阅读(255) | 评论 (0)编辑 收藏

迈向面向服务的体系结构和集成的模式语言,第 1 部分: 构建服务生态系统

随着 IT 产业日益成熟,我们将目睹越来越多成功的面向服务的体系结构(Service-Oriented Architecture,SOA)的设计和实现的出现。我们同样也将面对以微妙不同的形式重复出现、但从根本上来说却具有相同的基本问题的挑战。我们也倾向于重复使用解决方案的稍有不同的变体。为了达到这一目的,在涉及面向服务的体系结构和面向服务的集成(Service-Oriented Integration,SOI)的项目环境中引出了下面的模式。这些项目专注于面向服务的体系结构的迁移、建模、设计和实现,以及通过服务支持的松耦合集成,这称为面向服务的集成。在这个系列中,我们将分享这些模式以及使用它们的经验。我们将就如何结合使用它们以便帮助解决在 SOA 和 SOI 的迁移、建模、设计和实现过程中通常会遇到的问题提供指导。

引言:SOA 采用和 SOA 方法

单一的 SOA 解决方案很少恰好合适,理解这一点变得日益重要。相反,应该根据组织的方法和成熟度来量身定做 SOA 解决方案,以便确保一条更平坦的采用和成功之路。SOA 的采用分四个层次,正如下面的表 1 中所确定和解释的。

在采用和结合面向服务的体系结构 (SOA) 方面,企业可能处于不同的成熟度。一些企业仅仅是刚刚开始探索 SOA 的世界,使用其技术范例:Web 服务。它们将遗留功能包装起来,再向第三方、客户和业务伙伴公开以供调用。这就把它们带入了这场游戏:逐渐建立起开发团队,开始改变企业文化以便更好地支持 SOA 的流程,并且在探索新技术和可能受到影响的业务能力方面迈出第一步。这是第一个层次。

SOA 采用的第二个层次是在成功地通过 Web 服务的最初测试后,现在这个组织开始使用服务来集成系统和应用程序。这一步超出了企业应用程序集成(Enterprise Application Integration,EAI)。随着专有协议、粘接代码 (glue code)、更加开放的点到点连接、基于标准的协议和基于每个系统外化的服务描述的交互的出现,我们步入了面向服务的集成的领域。在这一领域中,企业服务总线占据最重要的位置:在不必考虑目标服务的提供者的情况下协调、路由和转换服务调用的机制。它有助于克服与点到点连接有关的许多缺点。

表 1. SOA 采用的层次

采用层次 名称 描述
1 实现单独的 Web 服务 由新的或现有的应用程序中所包含的任务来创建服务
2 业务功能的面向服务的集成 通过跨企业内外的多个应用程序集成服务来实现业务目标
3 整个企业范围的 IT 转换 支持跨整个企业的业务功能的集成的体系结构实现
4 随需应变的业务转换 现有业务模型的广泛转换或者新的业务模型的部署






创建 SOA 的六种方法

据说在驾驶飞机时,起飞和降落是最困难的两件事情。您可以使用各种各样的方法模式在飞机跑道上降落,这取决于由天气、交通密度、风速等等因素决定的空中交通控制指导。成功地创建 SOA 同样也有至少六种方法。

一些客户希望从他们的业务流程开始,然后继续开发支持这些流程所需的服务。而其他一些客户在遗留系统中拥有现有的功能,他们希望将其公开给客户、合作伙伴以及服务生态系统。后一种方法的一个重要的变体是,功能是嵌入式的而不能容易地访问,所以需要完成相当数量的遗留转换和组件化,以便将功能提取出来并将其作为服务公开——而它是否将是一个良好的服务则是另外一回事。我们将在另一篇文章“Service Litmus Test”中解决这个问题,并且提出确定是否确实应该公开某些内容的标准。处理 SOA 的另外一种自顶向下的方法是借助模型驱动的体系结构(Model-driven architecture,MDA)工具,以便定义可以生成代码的模型来构建服务。到目前为止,我们已经考虑了两种自顶向下和两种自底向上的方法。

其他项目需要提供对数据及与该数据相关联的状态的访问。这是 SOA 的信息体系结构或者数据体系结构方法。然而,一些项目试图去集成系统,它们更关心的是如何通过消息传递而不是其他什么方式来集成系统和应用程序;没有崇高的业务驱动的理想和合作伙伴对内部流程的访问,只有通过消息传递进行的系统集成的定义。

表 2. SOA 的六种方法

方法 描述(典型的项目所有者的特性描述) 限制条件
业务流程驱动 我的业务流程需要接进资源,而且每个活动都需要调用 IT 功能;我希望该功能能够以一种灵活的、可替代的方式使用。 自顶向下
基于工具的 MDA 我希望定义一个模型(业务模型),然后由工具为我生成具体细节。 自顶向下
包装遗留 我拥有已经进行了大规模投资的现有系统,但是它们不具有可伸缩性。我想要快速地添加新的功能,但是这些系统是分离的。它们就像个地窖,功能封闭在其中。 自底向上
组件化遗留 使用基于编译器的工具将整个庞大的遗留系统分解成模块。 自底向上
数据驱动 使用服务来提供对信息的访问,而不必在提供者端公开 Schema 或者实现决策。 专注于数据
消息驱动 “仅仅希望这些系统通过标准的、非专有的协议进行集成、通信。” 应用程序和系统的面向服务的集成






模式语言背景

概述

随着一个组织在朝更灵活和健壮的体系结构(伴随着快速变更的业务需求)迈进的道路上逐渐成熟,它将做两件事:a)选择专注于一组核心的差异化计划,这些计划以核心竞争力为中心,b)朝级别越来越高的人员、合作伙伴、流程以及数据的松耦合和可动态重组集成的方向前进。请注意,由现有的服务构建复合应用程序来动态重组是关键。通过这种方法,可以在企业内部和外部以可重用的方式公开服务。

当组织开始转向 SOA 时,采用的主要方法之一或者进入 SOA 世界的入口就是通过面向服务的集成 (SOI)。提议这样做的重要价值之一是利用 IT 系统中现有的投资,而不是重新改写/重新编写新的。实际上,服务集成比企业应用程序集成更进一步,将使用最少的“粘接代码”,通过非专有的协议来定义和利用松耦合的服务集。这种方法的关键在于两点,一是将服务作为关键启动程序进行访问,二是生态系统中多个系统甚至业务伙伴之间的数据和处理的交互。

为了使这种 SOI 方法获得成功,而且为了从 IT 系统方面的实际观点出发并逐渐朝着企业中服务演化的方向前进,我们需要克服一些主要障碍或者说挑战。这些问题的涵盖范围看起来非常广泛,从简单的、几乎琐碎的问题,到日益复杂的问题,随着我们在使用和实现 SOA 并获得相应的业务和 IT 好处方面更加成熟,我们将遇到这些必须解决的问题。这里所概述的模式有助于解决这些挑战;每种挑战一个模式。随着我们的研究逐渐深入,我们发现一种趋势——我们正使用更细粒度的模式来构建日益复杂的解决方案,以便解决更加复杂的问题。例如,不是从第一天就立即拥有 ESB,我们可能发现,从一个服务策略开始,创建一些服务适配器和代理,转到虚拟提供者,接着到服务集成器,然后才是 ESB,这样更明智。这些模式的使用将依赖于对项目的实际考虑,您将在不同的项目中有区别地使用它们,正如 Alexander 所说的,“不要以相同的方式做同一件事两次”。

通常,最初的挑战是具体确定在项目、业务部门或者组织内部提议使用 SOA 的价值。这涉及到在实现服务的实际服务提供者的服务质量下降或者他们不能提供所需要的功能时改变实际服务提供者的灵活性和能力。这种灵活性是 SOA 的首要价值,而这种挑战可以通过了解借助远程服务策略获得灵活性的步骤来克服。我们还将描述另外两种挑战,并使用这里提出的模式加以克服。

这些模式构成了模式语言的核心,当您达到 SOA 采用的成熟度的较高级别时,将涉及各种围绕 SOA 和 SOI 产生的问题(如下面的图 1 所示)。通过增加服务集成度的增量采用来迁移到 SOA 的组织一般从具有专有接口和粘接代码的强耦合系统开始,迁移到部分公开的服务之间的点到点连接,而这些服务通常仅仅包装现有的功能并使其可访问。这两点代表了实现 SOA 全部潜能的过程中的前两个步骤。每个步骤都代表更高的成熟度以及在商业价值和 IT 利益方面相应的增加。例如,为了迅速地支持对现有功能的访问,难以访问的嵌入式功能的点到点公开 (Point-to-Point Exposure) 是迈出硬编码地窖的重要一步。这些地窖包含嵌入式并且通常难以访问的功能。组织常常借助于创建在其他环境中本身难以访问的冗余功能,而不是费力地访问难以访问的嵌入式功能。在通常情况下,应用程序组合(换句话说就是,减少)可以通过确定不同系统中的共同功能,提取、隔离并封装最有希望的功能,然后提供单一访问点 (Single Point of Access) 来实现,以便简化维护、降低成本并支持合并和采购期间的快速合并等。

下面的表 3 中提到的模式是从各种项目中“挖掘”出来的 SOA 和 SOI 模式的一部分:

表 3. 模式及其相应的好处

环境 模式 适用性
封闭;集中的功能 硬编码的(不是模式,而是时间状态的一点) 时间点;低风险;少变化、高性能系统
分布式的;多点访问 点到点公开 迅速公开现有的功能;快速释放价值;访问嵌入式功能
包装遗留的功能,使其可以通过 Web 服务来访问 服务适配器 用户需要访问不支持服务的功能(通过服务调用访问遗留系统,例如——Web 服务)
如果您不能直接访问服务提供者的服务描述并且不能直接调用服务,那么使用它的代理来访问服务 服务代理 向使用者提供 SOA 接口
提供选择服务提供者的灵活性 远程服务策略 提供根据服务质量或者功能考虑事项改变服务提供者的灵活性。这使得在合并应用程序组合时加速合并和采购以及灵活地改变提供者成为可能。
消除冗余的功能;重构和合并或者在某些情况下替换现有的系统 单一访问点 给功能的许多潜在变体提供一个访问点。一种服务策略通常需要一个单一访问点。
某一时刻,一个项目或业务部门依赖于其他项目或业务部门的某些尚未作为服务公开的功能 虚拟提供者 不存在的提供者;提高服务的关键部分
单一访问点 服务集成器 路由、转换
常规企业集成方法 企业服务总线 中介;路由;转换、策略、规则、事件;在生态系统/价值网中的组织内部或者合作伙伴之间
SOA 的涅磐 (Nirvana of SOA);通过依赖于业务领域特定的功能的环境识别服务进行动态重新配置 集成的服务生态系统 向一组语义相关的行业特定的业务合作伙伴提供动态配置功能,这些合作伙伴利用并重组生态系统的功能来给自己以及作为一个整体的生态系统提供更大的价值

对于给定的情况,下表中的每个点都可能是合理的或适当的,向图谱的右侧移动并不总是要做的正确事情或者要采用的解决方案。级数表示逐渐增加的成熟度以及需要更多的成熟来处理不断增加的复杂性和克服 IT 所经受的新的、更加令人生畏的业务挑战。


图 1. 迈向集成的服务生态系统的 SOA 和 SOI 的模式图谱上的点
SOA 模式图谱

下面的部分将介绍一些构成 SOA/SOI 的模式语言基础的基本模式。“基本的”的意思是指客户往往首先碰到与这些模式有关的问题,需要解决它们,以便在 SOA 的方向上继续前进。SOA 是一个渐进的、小的转换旅程,逐渐将服务描述从由多个服务提供者所提供的服务实现中分离开来。下面的解决方案描述了这些问题是如何循环地解决的,并且可以作为模式用于下一个项目,以助您一臂之力。就像任何其他模式一样,这些模式同样也需要调整以适合环境和形成您个人的问题空间的强制要求:项目的利弊和需要考虑的事项,无论它们是组织上的还是技术上的,都非常重要,而且您可以决定是否需要跳过从一个模式到另一个模式的步骤,或者部分地实现该模式。

模式的讨论和模式的环境

大部分组织都有多种异构后端遗留系统,而只支持投资其中的一些来参与 SOA。通常,组织分为多个业务部门,其中每个业务部门都可能拥有整套系统的一部分,并且不能控制支持单一业务流程的一组水平应用程序。因此,业务流程可能跨越多个业务部门,涉及不同的系统所有者。每个系统将支持(用来更新或者创建)业务流程的一部分。在这个端到端流程中,并不是每个参与者都有机会获得资助,或者同意进行 SOA 迁移,或者适时地这样做。因此,一个组织单位决定将其功能迁移到 SOA 并不意味着其他提供依赖功能的业务部门或合作伙伴同意这样做,注意到这一点非常重要。

因此,在初始阶段,向 SOA 迁移的努力包括组织必须克服的学习和集成曲线。例如,SOI 模式虚拟提供者有助于为此搭桥铺路。企业可以利用、更改或者加强现有的基础设施、系统、管理和策略,以增量的方式迁移到 SOA,从而克服这些问题。服务提供者可能依赖于一组由生态系统中其他业务部门或组织提供的外部服务。这些服务在特定时刻可能并未准备就绪,或者不满足服务质量要求。虚拟提供者模式可以帮助解决这个问题,它允许期望的提供者在服务使用者端创建 SOA 以及在服务提供者端创建服务的虚拟提供者。它所依赖的任何一个系统都有可能还没有准备好就完全地迁移到 SOA。在过渡时期,服务使用者可以使用虚拟提供者来前进、构建 SOA,并且一旦提供者的服务的实际 SOA 实现开始工作,就可以通过服务策略链接到提供者的服务。虚拟提供者就绪后,在 SOA 中创建集成层就变得更加容易了。接着您就可以应用服务集成器来更好地充实这个层次。集成层的完备和好处是伴随企业服务总线的创建而获得的。

[远程]服务策略可以单独使用,也可以与其他两个主要的模式一起使用。这个模式从本质上来说模仿了多态的概念,将其用于服务,并且具体化了策略设计模式(但不是从面向对象的角度)。实际上,它适用于远程调用的面向服务的领域,在这个领域中,需要允许灵活地重新分配和迁移到新的端点,从服务使用者角度来看,这可以以一种更经济、可伸缩、可兼容且一致的方式提供服务。因此,当使用者需要更改非功能性需求时,或者当当前的提供者偏离了想要的交付功能性或非功能性需求的方法时,可以使用服务策略重新分配其他的服务提供者作为服务端点,这种方式对应用程序和基础设施的改变最少。本质上,您从一组更保守的不成熟的 Web 服务转移到一个具有单一访问点的更成熟的 SOA,从而消除了冗余,提供了一致性的注册中心、储存库和代理。请注意,我们并没有选择术语“网关 (Gateway)”,虽然它可能是一个更合适的词,但这里的意思是指在这个领域开发的产品,例如 Web Service Gateway 产品。在这里,我们专注于业务功能的统一访问点的功能性方面。

所以,如果您问,“为了通过服务集成到达 SOA 的最终状态,究竟什么才是基于服务总线增量迁移到立体集成(层)体系结构的跳板呢?”第一种模式从灵活性的角度讨论了 SOA 的价值。第二种模式是关于创建关键部分来启动您的 SOA 并使其在企业中运行。而第三种模式是关于将虚拟提供者带到下一层,作为服务集成器。您迟早都会希望将实现再向前推进一步,即 ESB。

这里我们描述了为了实现这个目标您可能需要采取的步骤。请注意,在某些情况下,如果组织的文化和工具、技术以及中间件都就绪,那么您可能直接就到了 ESB。对于组织中更成熟的部分这可能也是可行的,而应用程序的某些部分则需要您手动操作,通过这里所描述的模式小心翼翼地将其逐步迁移到其他选定的部分。

模式 1:远程服务策略

环境和问题:这是策略设计模式的变体,可以在 SOA 的体系结构环境中应用。它处理与松耦合有关的问题,并在我们希望根据例如输入环境或者不同服务提供者能够提供的服务质量特征灵活地改变服务实现时使用。纯粹的面向对象的策略模式主要依赖于基于继承的多态来创建根据环境交换的可互换算法系列。在 SOA 环境中,我们需要的不是拥有一个对象层次结构,而是能够改变服务提供者,同时将对使用者的服务感知的影响降到最低程度或者根本没有影响,从而改变服务描述的实际实现者。在大部分情况下,实现者可以是内部网或 Internet 上某处的远程功能单元的提供者。因此,例如,可能需要改变 OrderEntry 应用程序中的 VerifyAddress 服务的服务提供者,因为出于更大的交易量或者安全约束的原因,我们的服务质量需求发生了改变。或者,提供者已经决定将我们过去所依赖的同一基本服务的价格提高一倍。现在,我们希望能够在 IT 和业务不受损害的情况下灵活地改变服务提供者,这就意味着将对 IT 系统的改变降到最低程度并且不对业务或者客户的在线购物体验造成影响。


图 2. SOA 提供的灵活性
SOA 灵活性

在许多情况下,服务提供者是远程的,而绑定到实际实现者是通过 Web 服务绑定(WSDL 接口的 SOAP 调用,可能发现或预设为一个给定的 URI)来实现的。

解决方案:不是将访问和通信机制硬编码到服务提供者,而是创建一个服务层将您所需要的服务接口从可能的服务实现者层——例如企业组件层 (Enterprise Component Layer)——分离出来。这就提供了改变实现服务接口的服务提供者的灵活性,同时又不必对 IT 系统的代码做大的改变。“重新配置”,而不是硬编码的自定义,是这个策略的名称:提供灵活性的可动态重新配置的体系结构样式正是提议 SOA 的关键价值之一。


图 3. 显示远程服务的可选策略
远程服务策略

结果和变体:实现这个模式有不同的程度。您可以从更高的耦合度开始,然后迁移到较低的耦合度。URI 没有硬编码到现有服务提供者的 WSDL,这就可以通过创建提供者的服务注册中心和动态改变提供者(UDDI 和 LDAP 等等)来获得改变提供者的能力。如果需要更进一步的动态程度,那么发现和协商流程就会出现在注册中心,它并不受您的控制,而是由外部服务代理提供,这个服务代理将为您找到“最合适的”或者“最匹配的”的服务。

请注意,这里需要标准化的语义,以便方便地改变服务提供者。幸运地是,在多个行业的不同业务领域中出现了一套标准,它们可以构成在更复杂的场景中改变提供者所需要的语义的基础。

模式 2:服务适配器

(也称为服务包装器)

环境和问题:服务适配器的目标是提供使非面向服务的系统能够参与到面向服务的体系结构之中的机制

这样的服务通常都是不能提供 SOA 所指定的清晰定义的、大粒度的接口类型的遗留系统或打包的应用程序。这常常是一个反复出现的问题,因为现在许多核心业务流程都是由长期建立的系统来支持的,它们可能使用并不属于 SOA 的主流的技术,并且可能非常复杂,因此不容易改变。所以,虽然它们可能是 SOA 中重用的好的候选者,但是需要做一些工作来向其提供基于服务的访问。在某些情况下,供应商提供服务适配器,这就使工作更容易了(例如,用于 CICS 的 Web 服务)。

为了向遗留系统提供包装器服务,需要某种形式的适配器技术或者“服务适配器”。这项技术的目标是与非 SOA 的系统集成,并应用所需要的任何数据或协议转换来公开表示遗留功能的清晰的服务接口。这个接口是作为“包装器服务”发布的。然后,服务使用者就可以通过该适配器绑定到包装器服务了。


图 4. 服务适配器
服务适配器

随着我们需要从适配器获得更多的智能和功能,我们开始需要这个语言中的其他模式。所以,有时仅仅编写包装器就足够了。而有时就需要更多的变体和智能来将一项功能引入 SOA,这取决于我们是否确实拥有它、它的性能特征是什么,等等。

结果:可以更改应用程序或者遗留代码,以提供清晰的接口。当代码的容器(例如,CICS)支持适当的技术(例如,CICS SOAP 支持或者支持 XML 和消息传递技术)时,这种模式可能特别合适。

应该考虑的其他事项:

  • 显式适配器的使用,是定制的还是打包的(例如,Java 2 Connector 或 WebSphere Business Integration Adaptor)。
  • 更通用的中间件的使用。例如,EAI 技术,比如代理,可以提供更集中的能力来执行用于多个应用程序或者遗留系统的适配器功能。
  • ESB 的使用。如果使用 ESB,并且 ESB 具有类似于 EAI 的集成能力以及协调服务请求的能力,那么它就可以执行用于多个应用程序或者遗留系统的适配器功能。

模式 3:服务代理

环境和问题:使用者并不具备直接支持服务或者使用 WSDL 调用服务的能力。然而,您需要给他们提供使用与某个将来的提供者提供的特定服务相关联的功能和服务质量的机会。请记住,或许现在这个提供者并没有将这项功能作为 Web 服务来提供,而是以遗留的形式提供,并计划将来进行迁移。服务的提供者可能还不具备公开服务的能力。

强制要求:如果候选提供者提供的服务功能还没有充分地准备好,那么您可能仍需要提供服务的句柄,即使实际的 WSDL 和支持 Web 服务的技术还没有就绪。

解决方案:为了对使用者屏蔽使用服务接口访问功能所需要的复杂性,作为跳板,您可以选择向客户机提供服务代理,作为将来支持 SOA 功能的代理。

这个模式可以与服务适配器一起使用来支持虚拟提供者。

模式 4:虚拟提供者

您可能准备好了一个(或多个)服务适配器和服务代理。现在,您可以开始构建您的虚拟提供者了。

环境和问题:您与依赖您提供服务的服务使用者处于一个生态系统中。同样地,您也依赖于服务提供者所提供的服务。然而,在现实世界中,这个生态系统是逐渐发展的——并不是所有您需要的服务都可以作为 Web 服务或者通过服务规范使用。您需要开发服务的关键部分来支持您的业务部门、企业或者生态系统。


图 5. SOA 生态系统
SOA 生态系统

强制要求:您希望以服务而不是 API 调用的方式获得您所依赖的现有提供者的功能;但是它们还不能作为服务公开。您需要与潜在的提供者进行协商,以获得所需要的服务,不只是功能上的,还有必需的服务水平协议或非功能性的需求,所有这些都是基于您所提供的服务规范或描述(另外,或许还有服务策略)。您可能会面临挑战,因为提供者可能没有按照您要求的方式提供服务。最终,您可能要面对这样的问题:a)提供者可能没有及时地提供服务来满足您急切的要求,b)他们提供了与您的粒度不匹配的其他功能,或者 c)他们没有提供您所需要的非功能性需求。

您希望有人向您提供服务,但却还没有人做好准备。

解决方案:通过指定您所需要的服务并假定该服务已被提供的方式来创建虚拟提供者。使用代理与遗留系统通信,同时使用适配器将所使用的协议转换为在服务描述/协定中指定的您所希望/需要/拥有的协议,自己创建服务提供者。将代理和适配器封装在虚包 (facade) 中,因为适配器的数量将根据以后需要转换的新系统和新协议随机增长。因此,可以使用虚包封装这组适配器来与现有的 API 进行通信。


图 6. 虚拟提供者 SOA 模式组合虚包、服务代理、服务适配器和规则对象模式来启用支持使用者的服务中的关键部分,即使在生态系统还没有准备好提供所需要的全部服务时
虚拟的 SOA 模式

结果:现在您有了以一种适当的递增方式迁移到 SOA 的方法,即使生态系统还未完全做好准备。一旦提供者的服务得以实际创建、发布和提供,并且能够使用,您就可以直接插入到这些服务。但是您不必编写任何新的代码,只需为源自现有的提供者 API 的新协议准备新的适配器即可。

相关模式:即后面提到的企业服务总线,如果中介、路由、转换和策略的规则对象都添加到虚拟提供者的话。

虚拟提供者包括虚包、代理和一个或多个用于目标系统连接类型的适配器。一旦在虚拟提供者中添加了用于路由和策略管理的规则对象,它就成为了服务总线。

需要准备好一些模式来实现虚拟提供者,这涉及到管理。匹配提供的模式表明,中心组织将公平地在两个组织单位之间分配资金,以便资助它们支持和创建各自所需要的服务,而这些服务又不在它们自己的资金预算之内,因为这“仅仅”使其他业务部门受益。请注意,随着组织内中心访问点变得更加普遍,这些问题就逐渐消失了。

模式 5:服务集成器

环境和问题:您正应用虚拟提供者并可能采用远程服务策略来满足业务需求的需要。然而,通过与冗余的后端功能相集成,封闭的遗留系统(自定义应用程序和打包的应用程序)仍是一个挑战。您需要有一个到后端功能的单一访问点,以便能够在新的组合中重组该功能的各个部分,同时需要监视和管理这些新服务。

我们处于服务提供者的生态系统,其中的现有功能通常是脆弱的和特别开发的:连接常常是“一次性的”。集成是专有的和特别的;没有单一访问点来合成服务。

强制要求:当前的系统没有提供具有合适粒度级别的接口。当没有通过服务粒度与业务目标和 IT 系统一致的机制(例如,在 SOMA 方法[1]中的目标服务建模)进行服务建模和识别时,就会发生这种情况。另一种情况就是,服务没有以合适的方式重构,并且没有以无连接的(无状态的)方式公开。因此,集成保留点到点的状态,实现每个新的改变都将引起粘接代码的膨胀。您需要有一个同样也可以利用虚拟提供者和服务策略的健壮且灵活的单一访问点。

解决方案:因此,可以将一个特定的集成层引入服务集成的体系结构中,并通过服务集成器来管理这一层。服务集成器向其他的冗余服务提供单一访问点。

为了简单起见,在实现端的虚拟提供者的环境中,将变体外化为远程服务策略。按照这种方式开始构建从紧耦合的脆弱体系结构到更加松耦合的、可动态重新配置的体系结构的适当转换的基础。


图 7. 专注于由服务集成器管理的集成层
集成层

服务集成器负责管理多个集成层,如图 3 所示(层 6)。在服务计算生态系统中,服务集成器允许生态系统的单点集成、监视和管理。这个生态系统在本质上是分形的:这个组织可以在其体系结构的不同领域找到。它从项目层上的组织内开始,再转到业务部门,并涵盖企业体系结构中跨业务部门的各种现有应用程序。这就允许在生态系统中集成两个或多个企业体系结构进行协作。

为了进一步发展通过应用虚拟提供者和远程服务策略模式“启动”的生态系统,现在我们需要合并来自跨多个后端系统和源的功能和服务,并将它们重组为一组内聚功能的内聚单一访问点,以便减少或裁减我们的应用程序组合。通常,这种合并基于多个业务流程合成(编排)。而很多时候,这种编排可能也不是采用松耦合的、外化的技术(如 BPEL)来实现的,因为非功能性需求的成本可能太高了。为了减轻非功能性(操作)的影响,这种合成甚至可能是硬编码的。由于服务合成通过服务集成器接进多个应用程序源,再合并、重组,然后在表示层作为门户提交,因此减少了模式选择/权衡的影响。


图 8. 服务集成器在使用者和提供者之间进行协调
服务提供者的协调

请注意,如果将虚拟提供者作为服务集成器使用,同时我们又在虚拟提供者(服务集成器)中添加了用于路由和策略管理的规则对象,那么它就变成了服务总线。


图 9. 服务集成器 SOI 模式
服务集成器 SOI

结果:现在,无论在企业内部还是在企业外部的生态系统中,您都可以监视、管理和迁移功能和服务。您可以集成和重组接进其他外部服务提供者的应用程序、打包的应用程序和其他遗留功能,并为新的服务组合提供单一访问和合成点,它们可能提交到 SOA 的使用者层(例如,表示层)内的门户。

讨论:那么,这与企业服务总线 (ESB) 有什么不同呢?简单地说,我们正在讨论的是可以支持成功地、渐进地迁移到 ESB 之前的状态的跳板。在那以后,就可以创建和利用 ESB 来提供增强的服务功能了。因此,通常我们会看到客户机从硬连接 (hard-wired) 集成开始,然后转到点到点服务集成。虚拟服务提供者和之后的服务集成器提供了向 ESB 增量转换的图谱中的其他两个步骤。

模式 6:ESB

环境和问题:本文所描述的模式阐释了一些常用的技术,以现实的、可递增实现的方式来实际交付一些由 SOA 带来的灵活性的元素。然而,随着组织越来越多地采用跨应用程序、遗留系统、通道技术等等的面向服务的体系结构,支持服务所需要的中间件以及用于支持它们的服务和技术的管理就成为复杂的问题。管理这种复杂性的解决方案的一个重要部分就是提供一个用于服务通信、协调、转换和集成的基础设施。这个基础设施同样也可以作为控制点,将服务管理、安全、监视和规范应用于面向服务的体系结构。这种公共的基础设施是由企业服务总线描述的。

强制要求:拥有大量服务的组织将日益需要公共管理和操作模型来进行功能控制,以便:

  • 以可管理的方式支持大量的服务交互
  • 提供对高级交互功能(例如,事务、存储转发、基础设施服务、安全以及服务质量)的支持
  • 支持多种交互方式,例如同步请求/响应、消息传递、发布/订阅以及事件
  • 提供与 SOA 原则相一致的健壮的、可管理的、分布式集成基础设施
  • 支持服务路由和替换、协议转换以及其他的消息处理
  • 同时支持 Web 服务及传统的 EAI 通信标准和技术

解决方案:创建企业服务总线来提供整个组织内的中间件功能,以便支持服务交互。ESB 应该支持这些服务所要求的通信、协调、转换和集成技术,并且应该能够使用公共管理模型来支持地理上分布的部署。下面的图 11 摘自 IBM 红皮书“Patterns: Implementing a SOA using an Enterprise Service Bus”,它阐释了 ESB 的关键特性,其中包括:

  • 它作为一个或多个“集线器”组件部署。每个集线器都提供本地化的但又可伸缩的功能来执行路由、转换、安全以及其他功能,常称为“中介”功能。
  • 它有名称空间目录和管理服务,用于管理它支持访问的服务。在地理上部署的 ESB 中,管理服务跨协同操作的集线器来维护一致的配置。
  • 它有许多入站端口。每个入站端口都配置为使用某个特定的协议(例如 SOAP/HTTP 或 WebSphere MQ)来接收一组地址的服务请求
  • 它有许多出站端口。每个出站端口都配置为使用某个特定的协议转发服务请求和接收来自一组地址的响应。

这种配置使 ESB 能够以公共的方式支持跨企业的任意数量的服务的虚拟服务提供者模式和远程接收策略。另外,ESB 可以提供服务请求者和提供者之间的各种安全、数据格式或事务模型的转换。这样,ESB 就成为企业环境中不可避免会遇到的复杂性和异构性的控制及封装点。


图 10. ESB 模式
ESB 模式

请参考下面的参考资料中列出的 ESB 红皮书,以获得关于 ESB 模式更多信息。


图 11. 可选视图:作为服务代理的服务总线
作为代理的服务总线

可以使用各种技术和产品实现 ESB 模式——特定的实现选择依赖于特定组织的需求。参考资料中引用的 IBM 红皮书包括对 ESB 模式更详细的分析以及使用各种 IBM 软件技术进行实现的指导。ESB 的公共实现技术包括 EAI 中间件(例如,WebSphere BI Message Broker)、Web 服务路由器(例如,WebSphere Web Services Gateway)或者更多使用 CORBA 技术或经由 HTTP 协议的基本 XML 的自定义实现。

讨论:请注意,不仅基础设施必须至少处于任何使用者和提供者所要求的最高级别,而且使用者或提供者本身也必须处于所需的级别。例如,安全和其他非功能的需求是将影响 SOA 的服务质量的点到点的概念。ESB 可以帮助管理服务,但是“管理服务”是更复杂的概念,例如,从 Web 服务的角度来看,管理服务可能不仅仅意味着添加或者删除 JAX-RPC 处理程序,而且还意味着启动/停止、管理服务的名称空间(注册中心)等等。






结束语

可以结合使用这些模式来解决迁移到 SOA 的相关问题。同样在许多情况下,客户需要转到面向服务的集成模型,将其作为在他们的组织中实现更大规模的 SOA 的跳板。使用这些模式可以为客户提供以下几方面的帮助:

  • 可以在对现有功能进行最小程度的改变的情况下顺利地迁移到 SOA,同时越来越多地获得日益成熟的 SOA 所带来的好处。
  • 支持将他们的包装工作合并到新的 SOA 开发中的功能。
  • 使用渐进迁移的策略,没有弃用他们当前运行的系统,因此,不会对向业务客户交付价值和处理他们的需求造成影响。

虚拟提供者通过支持创建服务范式的一流构造来帮助创建服务的生态系统(我将就此单独写一篇文章)。项目的粒度非常重要:较小的项目应该使用服务适配器和服务代理来连接遗留的功能或者不支持 SOA 的功能。如果组织中的某个业务部门决定标准化 SOA,那么它应该考虑创建虚拟提供者。或者,如果在企业层有一个项目跨多个业务部门(如付款处理服务或定价服务),那么创建虚拟提供者作为迈向创建服务总线的第一步是恰当的(这包括构建想要的功能的服务适配器,如果您希望作为服务访问该功能,则应该向服务使用者提供服务代理)。如果出于性能或者安全方面的考虑,您希望嵌入访问,那么您只需要一个服务适配器来访问这项功能。实现这项服务的企业组件将需要这样的适配器,以便能够调用这项功能。但是不必将它作为服务向其使用者公开。只有那些不得不向提供者的使用者公开的服务才需要有服务代理或请求处理程序。

随着组织发展到使用和采用 SOA 的更高的成熟度,它们将开始迈出内部系统的边界,超越与少数合作伙伴的点到点零星集成,进入到要求新的功能的服务生态系统。这些功能之一就是我们上面概述的模式,它们帮助使体系结构进入到服务生态系统的领域中。其他的功能包括面向服务的企业体系结构(service-oriented enterprise architecture,SOEA)、面向服务的建模和体系结构方法(service-oriented modeling and architecture method,SOMA)、面向服务的引用模型 (service-oriented reference model)(如图 7 所示)、管理,以及确保服务生态系统内重组的灵活性所需的模式。

 

posted @ 2006-04-17 03:40 wsdfsdf 阅读(143) | 评论 (0)编辑 收藏

用于实现 Web 服务的 SOA 编程模型,第 2 部分: 使用服务数据对象简化的数据访问

利用服务数据对象简化面向服务的软件中的数据访问和表示。SDO 用统一的抽象代替各种各样的数据访问模型来创建、检索、更新和删除供服务实现使用的业务数据。这是我们有关用于 IBM® 面向服务的体系结构 (SOA) 的编程模型系列文章的第二篇。

服务对象数据

服务对象数据(Service Data Object,SDO)使用统一的抽象代替了各种各样的数据访问模型来创建、检索、更新和删除供服务实现使用的业务数据。SDO(请参阅参考资料部分中的 Service Data Objects 2.0 和 Next-Generation Data Programming: Service Data Objects)是 IBM 面向服务的体系结构 (SOA) 的基础概念。SDO 将开发人员从如何访问特定的后端数据源的技术细节中解放出来,提高了他们的工作效率,这样他们就可以主要专注于业务逻辑(请参阅参考资料部分中的 Integrating relational data into Web applications、Next-generation data programming in the Java™ environment 以及 Using Service Data Objects with Enterprise Information Integration technology)。SDO 是与 BEA Systems, Inc. 联合制订的规范,并且在 IBM 系列产品中得到了广泛的使用,包括 WebSphere® Application Server 和 Rational® Studio 工具。Java™ 数据库连接(Java™ DataBase Connectivity),通常称为 JDBC,是执行结构化查询语言(Structured Query Langauge,SQL)语句的 Java 接口。目前,用于 JDBC、Web 服务描述语言(Web Services Description Language,WSDL)定义的服务、企业 JavaBean(Enterprise JavaBean,EJB)等等由 Java 编写的服务实现的编程模型都是相似的,但却又有一些让人讨厌的不同。

SDO 定义了一种单一的、统一的方法来访问和操作来自异构数据源的数据,包括关系型数据库、可扩展标记语言(eXtensible Markup Language,XML)数据源、Web 服务以及企业信息系统 (EIS)。它们是基于数据图(data graph)的概念。数据图就是一组可以从数据源中分离出来的树形结构的对象。SDO 可以在整个应用程序体系结构中使用。

应用程序体系结构的领域 如何使用 SDO
SOA
  • SDO 是服务的输入和输出。
数据访问
  • SDO 访问关系型、XML、EJB、Java 数据对象(Java Data Object,JDO)和 Hibernate 数据源。
  • SDO 是数据传输对象(Data Transfer Object,DTO)——也被称为值对象(Value Object)。
Web 服务
  • SDO 表示网络上的 XML。
消息传递
  • SDO 表示消息。
XML 使用 SDO 的情况:
  • 支持 XML 的应用程序。
  • 访问 XML 文件、文档、资源和消息。
连接器/适配器(EIS,CICS)
  • SDO 表示数据记录。
EJB
  • SDO 是 DTO(也被称作值对象)。
  • Java 2 企业版(Java 2 Enterprise Edition,J2EE)设计模式。
ADO.NET
  • ADO DataSet 是 SDO 数据图的子集。
企业服务总线(Enterprise Service Bus,ESB)
  • SDO 是服务的输入和输出。
跨语言编程模型
  • 完整的应用程序可能横跨层和语言。
  • 用于很多种语言技能集的相同的编程模型。
模型驱动的体系结构(Model-driven architecture,MDA)
  • SDO 模型(类型(Type)和属性(Property))是通过统一建模语言(Unified Modelling Language,UML)类和组件定义的。
  • SDO 应用程序遵循 UML 顺序 (Sequence)、流 (Flow)、状态 (State) 和协作 (Collaboration)。
Java
  • SDO 是带有 POJO 接口的智能的“传统 Java 对象(plain old Java object,POJO)”。

在 SOA 中,应用程序并不直接地连接数据源。它访问一个叫做数据访问服务(data access service,DAS)的中介并接收响应中的数据图。DAS 是为特定数据源种类处理技术细节的服务。它为客户机将数据转换成 SDO 图。客户机应用程序与数据图进行交互来获得数据和改变数据。为了将更新应用于原始的数据源,应用程序将更新过的图发送回 DAS,而 DAS 又与数据源交互。通常,运行时提供 DAS 的实现,而应用程序开发工具提供对数据图的支持。

SDO 通过封装数据访问的细节将业务应用程序与技术改变相隔离,从而避开了技术改变产生的影响——重新编写应用程序以便跟上改变的技术(请参阅参考资料部分中的 Wikipedia)。例如,考虑一个设计用来从数据库中读取产品描述并将其作为网页显示的 Java Web 应用程序。为了访问数据库中的产品描述,应用程序很可能使用 JDBC。假设不久后应用程序拓扑发生了改变,在应用程序和数据库之间放置了 Web 服务。现在,应用程序不能再使用 JDBC 访问数据,而是需要重做大量的工作来替换 Web 服务应用编程接口 (API),例如文档对象模型(Document Object Model,DOM)或者基于 XML 的远程过程调用的 Java API(Java APIs for XML-Based Remote Procedure Call,JAX-RPC)。SDO 避免了这个问题;使用 SDO 编写的应用程序不必改变。

另外,SDO 提供了支持元数据 API 的应用程序、工具和框架来以统一的方式自省数据模型,而不管它的来源。DAS 将后端元数据转换成标准的 SDO 格式。

SDO 类型可以由 Java 接口、XML Schema、关系型表和列、EJB、COBOL 记录、消息或者 UML 来定义(请参阅参考资料部分中的 Catalog of OMG Modeling and Metadata Specifications);实现人员可以选择自己喜欢的系统类型。简单 Java 和 XML 数据类型是有效的 SDO 数据类型,这为 Java 实现人员简化了一步。SDO 支持动态的和静态的数据访问模型,两者也可以一起使用。我们将更详细地考虑这些内容:

  • 动态模型(缺省值)允许编程人员通过名称(字符串)获得和设置数据图中的数据元素。当 SDO 的类型在编译阶段未知时,或者当程序部署完以后可能要添加新的属性时,这特别有用。客户机应用程序或服务查询 SDO 来了解它的结构,然后按名称读取和更新任何元素。例如,可以编写一个泛型 SDO 访问函数并用特定于元素的元数据填充它来访问单独的 SDO。SDO 同样也使用 XML 路径语言( XML Path Language,XPath)表达式的子集来支持快速遍历许多 DataObject,例如 customer[1]/address/zip,以便快速访问 customer DataObejct 的 zip 代码。
  • 静态模型使用命名和类型化 Java 接口。每个数据元素有自己的“getter”和“setter”方法。工具从 SDO 类型和属性生成静态接口。

SDO 对于数据表示非常重要,即使没有典型的数据源也如此。这种用法的例子包括使用 Web 服务交换的 XML 消息、Java 消息服务 (JMS) 消息、XML 文件等等。







示例

下面的例子——定义了包含客户数据的数据对象——说明了使用 Java 或 XML 来定义和使用 SDO 是多么的容易。示例 1(使用 XML)是 SDO 类型的基础。


示例 1. 使用 XML 的 SDO 类型定义
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
                xmlns:tns="http://www.myvalue.com"
		targetNamespace="http://www.myvalue.com">
	<element name="customer" type="Customer"/>
	<complexType name="Customer">
		<sequence>
			<element name="customerID" type="string"/>
			<element name="firstName" type="string"/>
			<element name="lastName" type="string"/>
			<element name="stockSymbol" type="string"/>
			<element name="stockQuantity" type="int"/>
		</sequence>
	</complexType>
</schema>

												
										

示例 2 中,由前面的 XML 所生成的 Java 接口说明了如何使用静态接口。


示例 2. 使用 Java 的 SDO 类型定义
												
																		
public interface Customer {
	String getCustomerID();
	void setCustomerID(String customerID);
	String getFirstName();
	void setFirstName(String firstName);
	String getLastName();
	void setLastName(String lastName);	
        String getStockSymbol();
	void setStockSymbol(String stockSymbol);
	int getStockQuantity();
	void setStockQuantity(int stockQuantity);
}

												
										

一旦 SDO 类型定义好,就可以通过将类型定义传递给 SDO 数据工厂 (data factory) 来将其实例化(为数据对象分配存储空间)。这个工厂仅仅是运行时的一个组件,它的功能就是根据 SDO 类型定义实例化 SDO 数据对象。

示例 3 示例 4 分别展示了如何通过传递 XML Schema 名称空间和复杂的类型名称(在示例 1 中定义的)或者 Java 接口类(在示例 2 中定义的)作为参数来创建 SDO。


示例 3. 使用 XML Schema 名称空间和复杂的类型名称参数创建 SDO
												
																		
DataObject customer = DataFactory.INSTANCE.create("http://www.myvalue.com", "Customer");

												
										



示例 4. 使用具有 Java 接口类参数的 SDO DataFactory 创建 SDO
												
																		
Customer customer = (Customer) DataFactory.INSTANCE.create(Customer.class);

												
										

在 SDO 实例化之后,实现就可以访问它了。示例 5示例 6 中的代码示例分别展示了对 Customer SDO 的动态和静态访问。


示例 5. 动态访问 SDO
												
																		
DataObject customer = ... ;
customer.setString("customerID", customerID);
...
customer.setInt("stockQuantity", 100);
String customerID = customer.getString("customerID");
...
int stockQuantity = customer.getInt("stockQuantity");

												
										



示例 6. 静态访问 SDO
												
																		
Customer customer = ... ;
customer.setCustomerID(customerID);
...
customer.setStockQuantity(100);
String customerID = customer.getCustomerID();
...
int stockQuantity = customer.getStockQuantity();

												
										

我们使用访问 XML 文件服务和关系数据库的例子来进一步说明由 SDO 推动的编程模型的简单性。请注意,尽管技术之间存在差异,但是这些应用程序是如此的相似。应用程序开发人员能够专注于业务逻辑,而让服务去处理更新持久数据存储的实现细节。

示例 7. XML 文件服务

这个简单的例子将数据从 XML 文件加载到 SDO 数据图,打印并更新数据,然后将它写回文件。(业务目标是将“quot;Adam”改为“Kevin”。)

根据根 XML 元素和一个多值的 customer 属性定义将要作为根 customers 数据对象读入的 XML 文件。在 XML 文件中 Customers 为每个 customer 元素包含一个数据对象。每个 customer 具有两个属性:SNfirstName
																				
																						<customers xmlns="http://customers.com">
	<customer SN="1" firstName="Adam" />
	<customer SN="2" firstName="Baker" />
</customers>

																				
																		

读取文件数据。
																				
																						DataObject root = xmlService.load(InputStream);

																				
																		

遍历 customer 数据对象列表并打印出每个名 (first name)。
																				
																						Iterator i = root.getList("customer").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("firstName");
	System.out.println(name);
}

																				
																		

将第一个客户数据对象的 firstName 属性设为 Kevin。中间件更新变更摘要(这里并没有显示出来)来指示改变了的数据。
																				
																						DataObject customer1 = root.getDataObject("customer[1]");
customer1.setString("firstName", "Kevin");  // or

root.setString("customer[1]/firstName", "Kevin");


																				
																		

将数据对象写入文件。
																				
																						xmlService.save(OutputStream, root);

																				
																		

结果是更新的 XML 文档。
																				
																						<customers xmlns="http://customers.com">
  <customer SN="1" firstName="Kevin" />
  <customer SN="2" firstName="Baker" />
</customers>

																				
																		

示例 8. 访问关系数据库

虽然复杂的关系数据库到 SDO 的映射是可行的,但是这个例子使用的是一个非常简单的映射:每个数据库表都是一个 SDO 类型,表的每行是 SDO 数据对象,而每列是 SDO 属性。应用程序逻辑是相同的:通过执行预先定义好的查询从数据库中读取、打印并更新数据(将“Adam”改为“Kevin”),将更改保存到数据库。数据库查询返回 CUSTOMER 表中的两行:

CUSTOMER ID(整数,主键) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Adam Smith
2 Baker Street

下面给出了带有解释的 SDO 实现。

rdbService 查询数据库以获得数据。
																				
																						DataObject root = rdbService.get(); 

																				
																		

相同的数据可能已经用 XML 等价地表示了。
																				
																						<customers>
  <CUSTOMER ID="1" FIRSTNAME="Adam" LASTNAME="Smith"/>
  <CUSTOMER ID="2" FIRSTNAME="Baker" LASTNAME="Street"/>
</customers>

																				
																		

打印每个客户名。
																				
																						Iterator i = root.getList("CUSTOMER").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("FIRSTNAME");
	System.out.println(name);
}

																				
																		

将第一个数据对象的 FIRSTNAME 设为 Kevin。中间件更新变更摘要(这里并没有显示出来)来指示改变。
																				
																						DataObject customer1 = root.getDataObject("CUSTOMER[1]");
customer1.setString("FIRSTNAME", "Kevin"); // or

root.setString("CUSTOMER[1]/FIRSTNAME", "Kevin"); 

																				
																		

将更新的数据写入数据库。
																				
																						rdbService.update(root);

																				
																		

现在数据库包含:

CUSTOMER ID(整数,主键) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Kevin Smith
2 Baker Street

注意,第一行已经被更新了。

如果在我们的示例应用程序已经获得数据图之后,另外一个应用程序访问数据库并更改了值会怎么样?在写入时,数据访问服务检查变更摘要来决定如何对数据源应用更新。数据库可以使用开放式并发控制 (optimistic concurrency control) 来确保这个改变之前最后包含的值是“Adam”(否则,另外一个应用程序可能先改变数据,可能在该应用程序中需要某些错误恢复)。某些服务实现了更为高级的开放式并发形式;变更历史记录提供了那些算法所需要的原始值。

使用 EJB 时,SDO 作为 DTO(也称作值对象)J2EE 设计模式。一般来说,访问实体 EJB(Entity EJB)的每个属性的开销非常大,所以传输几个数据图中的 SDO 对象效率更高。会话 EJB(Session EJB)可能有方法产生和使用 SDO 图来更加高效地直接访问实体 EJB。Customer 实体 EJB 封装了对 Customer 记录的数据库访问。会话 EJB 提供了访问方法来从 Customer 实体 EJB 产生和返回 Customer SDO 图。


示例 9. 返回 SDO 和由 SDO 更新实体 EJB 的会话 Bean 接口
												
																		
public interface CustomerSession {
	Customer getCustomerByID(String customerID);
	Customers getCustomersByLastName(String lastName);
	void updateCustomers(Customers customers);
}

												
										

Customers 是包含若干客户的 SDO 根数据对象。CustomersList 包含 Customer 数据对象。ChangeSummary 用来记录对 Customer 对象所做的全部更改,包括任何的添加、删除或更新。updateCustomers() 方法利用所做的更改来更新 Customer 实体 EJB,并且可以在一个事务中批处理对数据源的更改。


示例 10. 使用 Java 的 Customer 的 SDO 类型定义
												
																		
public interface Customers {
	List<Customer> getCustomers();
	ChangeSummary getChanges();
}

												
										







总结

SDO 为所有数据源启用了对应用程序数据的统一访问和公共编程模型,而不管数据存储在何地以及如何存储。SDO 利用了 XML 的简易性,而又没有引入 XML Schema 的复杂性或序列化的性能问题。通过同时使用 SDO 和 SOA,可以将系统编程任务从业务逻辑中分离出来,并且将其封装在可重用的服务之中,而不是所有编程人员都必须掌握这些技能才能入门。它们在没有陷入技术和实现细节的情况下简化了业务应用程序的编程,防止了技术改变产生的影响。有了 SDO,业务应用程序就是名副其实的业务应用程序。

posted @ 2006-04-17 03:38 wsdfsdf 阅读(224) | 评论 (0)编辑 收藏

用于实现 Web 服务的 SOA 编程模型,第 1 部分: IBM SOA 编程模型简介

IBM® 面向服务体系结构(Service-Oriented Architecture,SOA)编程模型使非程序员可以创建和重用 IT 资产,而不需要掌握 IT 技能。该模型包括组件类型,布线,模板,应用程序适配器,统一数据表示和企业服务总线(Enterprise Service Bus,ESB)。本文是系列文章的第一部分,该系列文章介绍了 IBM SOA 编程模型,选择、开发、部署工作所需的内容,以及建议的编程模型元素。本文陈述的内容考虑了使用该模型的开发人员可能具备不同的技术水平和工作角色。

SOA 编程模型系列

对于任何独立程序员来说,有效的掌握和应用飞速增长的软件技术、实践、工具和平台,变得越来越困难,当然更不用说非程序员了。然而,如果业务流程转换能够成功进行,很多的非程序员就可以使用现有的 IT 资产来进行他们的工作,而不用去学习繁琐的底层技术细节。本系列文章描述了一个新的面向服务体系结构(SOA)编程模型,该模型实现了业务关系的分离,因此企业中具备不同技术水平和工作角色的人,即使不是专业的 IT 人员,也可以在软件开发生命周期每个阶段创建和使用 IT 资产。这可以显著提高随需应变企业的业务灵活性。







引言

IBM 产品逐渐应用了 SOA 和编程模型。程序员构建服务、使用服务,并且开发聚集服务的解决方案。我们在这里使用"程序员(programmer)"这个泛称,因为 SOA 编程模型的一个关键方面是将"编程"的概念扩展到非传统开发人员的工作角色和技能,比如业务分析员和脚本语言用户。

大多数关于 Web 服务的文章主要集中在服务接口和这些接口的使用方面。为了补充接口标准和最佳实践,IBM 引入了一个编程模型,来实现服务并将它们组合为解决方案。扩展 IBM 软件平台的范围,使之能够被更多的用户团体使用 -- 包括非传统的开发人员 -- 这个模型提供了新的组件类型与用户的角色、目标、技能和概念框架相匹配。这些组件类型使更直观的开发工具可以使用。另一个主要的主题是通过编程模型特性和功能的逐步透明化来增强可使用性

这是关于 SOA 编程模型系列文章中的第一篇,特别针对软件开发专业人员。在本系列中,我们介绍了实现这些目标的一些新的编程模型元素。我们介绍了如何利用它们来使您选择、开发、建议或管理的软件能够更加容易的开发、重用和消费。将软件构造为服务对于按需的企业来说更加有价值,因为不具备太多技能的开发人员可以将其"接入"到解决方案中,或者编入一个业务流程编排流中来满足快速变更的业务需求。不管你是大型企业或者小型业务的开发人员、独立软件供应商(ISV),还是应用程序提供者或者中间件供应商,你都可以通过这种方式构造你的软件,从而从中受益。那么,让我们立即开始应用 SOA 原理。







SOA 编程模型的亮点

让我们首先重点介绍 SOA 编程模型的几个主要特性。

服务数据对象(SDO)是 IBM SOA 中的一个基础概念。SDO 大大提高了开发人员的生产力,并且将你从如何访问特定后端数据源、应用程序和服务的技术细节中解脱出来。它们提供了简化的抽象,使程序员可以更多的集中在业务逻辑上。SDO 还提供了统一的消息表示来与服务交互,淘汰了用于数据表示的复杂技术迷宫,仅仅访问单个统一模型。

SOA 编程模型同样需要统一的范型来创建和访问业务逻辑。为了易于使用,服务应该隐藏实现技术之间的差别,并应该建立在比现有编程结构(比如 Enterprise Java™Bean(EJB))更高级别的抽象上。服务可以通过组装到模块(这些模块可以组成解决方案)中的组件来实现。通过组件公开的服务可以使用可定位的接口来调用。您可以使用 Web 服务描述语言(WSDL)、Java 或其他语言来描述接口。这个实现类型可以有对所需服务的待定引用,在将组件结合在一起执行之前,这些服务是满足需求的。

这个编程模型还引入了良好定义的组件类型,对程序员开发和部署到解决方案中的常用构件建模。例子包括"无格式旧 Java 对象"、业务流程执行语言(BPEL)流程、结构化查询语言(SQL)服务、Adaptive Business Objects、通过 Java 连接器体系结构(J2C)资源适配器访问的 CICS®程序、使用 SAP 业务应用程序编程接口的应用程序、Java 2 Enterprise Edition(J2EE)无状态会话 bean 和 MQSeries® 应用程序。

企业服务总线是多协议结构的一个关键角色,将服务组件编成无缝的交互,通过在消息路径中加入被称为中介的特别组件,来代理服务间的交互,而不用更改现有的端点,从而允许在核心级别上处理企业关注的内容 -- 比如审核、日志、路由、不匹配接口的适配、等价组件的增量替换、安全等。

新的流程语言缩小了 IT 概念和业务构件之间的间隙。很重要的一个是 BPEL。虽然流程可以通过业务分析员引入图形化工具来定义,但它也是一个可执行程序。流程在按需业务转换中占有重要的地位,例如为扩展价值链描述长时间运行的可执行流程。通过扩展价值链,我们可以跨越多个供应商和 IT 域来进行业务安排,比如一个零售商和他的多个独立的供应商,保险公司及其众多的第三方理赔员,IT 外购状况等。

业务状态机(business state machine)是业务分析师可以通过图形工具创建流程的另一个编程框架,并且在流程设计引擎中执行。状态机可以表示业务构件 -- 比如采购单、保险索赔等 -- 这些转换通过一些良好定义的状态来响应特定的生命周期"事件"。

需要重用的组件可以封装为具有可变店(points of variability)的模板,可以在放入解决方案中时进行设计。这种适配成为我们的编程模型的第一部分,同时结合规则语言和相关的工具,为新型用户提供定制的能力。

另一个创新领域是新的解决方案模型,它让部署者、管理者和其它业务用户可以将组件组装成解决方案。在开发的时候,你可以将服务实现与托管服务的拓扑(系统架构师建模的部署拓扑)关联在一起。模型捕捉的系统需求和环境假设在早期的实现中进行校验,降低了应用程序生命周期的费用,并且极大的提高了可靠性和可计账性(accountability)。该模型的特性还包括现有应用程序的后期绑定、数据转换中介和适配器,可以通过企业服务总线来实现面向服务的交互。

总的来说,SOA 编程模型将开发和部署活动分割为不同的阶段,这些阶段可以发生在不同的时间,并且可以通过不同的个人使用不同的技能来实现。这就产生了关系的分离,使软件组件可以被重用。它也将软件体验划分为单独用户的业务角色、技能和任务。最终,它使软件生命周期可以适应按需企业的需要,因为它们通过针对业务灵活性重新设计 IT 流程来寻求更高的有效性。







编程模型的概念

编程模型通常是 IBM SOA 和 IBM 产品的核心。它定义了程序员可以构建和使用的概念和抽象。运行时产品,例如 WebSphere® Application Server,DB2®和 CICS,可以运行或托管编程模型构件。开发工具支持编程模型构件的建模和实现、组装到应用程序(解决方案),以及部署到运行时环境中。最后,系统管理产品、代理和设备支持对运行时和它们托管的编程模型构件的管理。

编程模型是什么?虽然目前没有公认的一般定义,但我们喜欢将它定义为:

  • 程序员构建的一套部件类型。部件类型包括多种编程模型构件:超文本标记语言(HTML)文件、数据库存储过程、Java 类、可扩展标记语言(XML)Schema 定义、定义 MQSeries 消息的 C 结构,等等。
  • 一系列角色,将具备相似技能和知识的开发和管理人员分组。用这种方式对开发人员分类有助于生产适应于角色的工具,使非程序员可以实现服务并将服务组装为解决方案。业务分析人员定义业务流程,销售专家定义顾客分类的策略并计算产品折扣。每一种角色包含:
    • 角色所具备的技能。例如,用户界面开发人员开发界面,用来呈现应用程序或者解决方案的功能构件。假设这个角色了解正在开发的应用程序和它的业务目标,充分了解应用程序的用户及他们的任务,精通一些用户界面设计方法,能够通过为每个任务选择恰当的类型来创建易于使用的用户接口。
    • 角色交互(消费或者生产)所用的部件类型和应用程序接口。例如,动态页面设计人员 -- 角色 -- 生产 JavaServer Page(JSP)并消费 EJB -- 部件类型 -- 包装现有的信息资源和应用程序。
    • 角色使用的工具。例如,Web 开发人员所用的适合于角色的工具是所见即所得的页面设计工具,用来构建动态页面,使用与 HTML 和 JSP 标签库相关的控件,并将控件连接到 EJB。

使 Web 服务易于实现和使用的关键是对现有技术和知识进行增量扩展,从而使 SOA 可以被消费。以 CICS COBOL 事务程序形式存在的服务与用 BPEL 编写的服务差别很大。从数据库存储过程中调用服务与从 JSP 中调用也是不同的;技能和期望值是不同的。通过提供工具的分类来使部件类型适应于各种技能,并适应于开发流程的阶段,你可以实现可消费性(consumability)。

本系列的后续文章更加详细的介绍了 SOA 编程模型的部件类型。







产品架构


图 1. 产品架构
产品架构

支持 IBM SOA 方案的产品分成两个主要类别:服务端点和连接它们的消息传送结构。这个通用的架构 -- 包含了许多产品,这些产品都不是 IBM SOA 的专用传输工具 -- 如图 1 所示。

核心是服务间的 ESB 提供的连通性。ESB 是多协议的,支持点到点和发布-订阅两种通信类型,并支持快速处理消息的中介服务。IBM WebSphere MQ,IBM WebSphere MQ Integrator Broker 以及支持 Web 服务和 Java 消息服务(JMS)的 WebSphere 都属于第一个类别。

服务存在于抽象的托管环境(容器)中,并且提供了特定的编程框架。容器加载服务的实现代码,提供到 ESB 的连接性,并管理服务实例。不同类型的服务存在于不同的容器中。(在典型的递规设计的例子中,ESB 本身被认为是用于中介服务的容器。)表 1 列出了一些主要的 IBM SOA 托管环境和托管的组件类型。

表 1. 托管各种组件和服务类型的容器

服务/组件类型 容器
用 COBOL、PL/1 和其他语言编写的事务处理程序 CICS 或者 IMS(信息管理系统 -- 一种企业事务处理系统)。程序员可以使用 SOAP/HTTP、WebSphere MQ 和 J2EE J2C 连接来访问服务。
业务流程编排 WebSphere Business Integration Server Foundation。该容器支持长期存在的工作流,这些工作流实现了 Web 服务接口并调用其他 Web 服务上的操作。它同样支持长期运行的业务活动事务。
应用程序适配器 -- 为现有的应用程序和系统提供 SOA/Web 服务的会话虚包(facade)。 WebSphere Business Integration Server Foundation 提供的应用程序适配器容器。适配器在 SOA 协议和格式,以及现有应用程序和系统的协议和格式之间进行转换。例如,SAP 适配器将 SOA 编码并通过 HTTP 传输的 XML 转换到 SAP 的现有业务应用程序编程接口格式和 Remote Function Call(RFC)。
预定义的 SQL 查询、XML 查询或数据库存储过程实现的服务 DB2 结合 WebSphere Application Server。查询的参数来自 SOA 操作的输入消息以及提供输出消息的结果。
使用 Java 类和 EJB 实现的服务。 WebSphere Application Server。






结束语

IBM SOA 编程模型系列文章的第一篇概述了 IBM 工具和产品如何适用于模型,以及开发人员如何有效的在应用程序开发中使用它。

  • 使用 SDO 简化数据访问
  • 服务定义以及组件模型发展状况的介绍
  • 用组件类型来简化开发
  • 基本组件类型
  • 服务组合和定制
  • 流程组件:BPEL 和业务状态机
  • 定制服务:设计模式,模板和可变点
  • 面向服务的用户接口
  • 用于管理的 SOA 方法
  • SOA 软件生命周期开发工具
  • SOA 的安全性

posted @ 2006-04-17 03:37 wsdfsdf 阅读(180) | 评论 (0)编辑 收藏

面向服务体系结构中的信息管理,第 2 部分: 研究 SOA 中信息管理的不同方法

利用信息管理的强大功能来用于基于面向服务体系结构(Service-Oriented Architecture,SOA)的建模、构架、设计和实现。在本文的栈视图中,展示了信息管理提供的各种服务,并有每种服务的详细描述。作者从元数据管理和元数据集成的重要性说起,再转到信息管理所提供服务的检验,然后是 SOA 案例学习。最后,作者将列出一些与所讨论服务相关的工具。

引言

在本文的后半部分中,我们将对每种特定服务进行更深入的讨论,例如:

  • 元数据管理
  • 提取、转换和加载(Extract Transformation Load,ETL)
  • 联合
  • 数据安置(如复制和缓存)
  • 数据建模
  • 搜索
  • 分析

之后,我们将学习使用 SOA 来验证数据质量的案例,并在最后列出用于各种服务的工具清单。在阅读完本文之后,您将能更有效的利用信息管理的功能,来构建健全且均衡的 SOA,并进行信息和业务集成,避免常见错误,比如孤立的数据筒仓(silo)、数据不一致和未使用的信息资产等。







SOA 不仅仅是 Web 服务

图 1 展示了信息管理提供的服务分类逻辑视图,这些服务是基于以下方面进行分类的:

  • 安全性
  • 协作
  • 可用性
  • 可管理性
  • 信息消耗

虽然没有哪种单独的产品能提供以上所有的服务,但将这些服务合在一起就可以创建 SOA 的完整信息管理框架。特别值得注意的是,某些文章将元数据管理置于信息管理栈的底部,在本文中我们认为,元数据管理是渗入其他服务并与其他服务紧密联系的。事实上,SOA 是元数据驱动的构架(参见参考资料部分的文章 “Metadata Evolution Management in Your SOA")。因此,我们将在本文的后半部分从元数据管理开始说起。


图 1:SOA 中的信息管理
SOA 中的信息管理






元数据管理

元数据、元模型以及元-元模型

最常见的元数据定义是关于数据的数据——其实并不然。根据规范的不同,元数据所指的含义也将不同。基本上,元数据是关于数据的结构(语法)和含义(语义)的信息。元数据结构化方法的例子有关系数据库管理系统(RDBMS)目录、Java 库目录和 XML DTD 和 schema。这些每个都定义了数据是如何表示和使用的。从语义的角度来说,元数据提供了数据的含义。例子包括用数据字典、注释或本体论(ontology)来描述。

此外,还有用于内容管理的实例和类的元数据。实例元数据只是储存在内容管理元数据储存库中的数据,并引用存储在别处的对象,例如文档、Web 页面、音频和视频文件。分类和索引中的条目也同样被认为是实例元数据。类元数据,从某种角度来说,和 RDBMS 目录和 XML schema 意义相同,用来描述实例元数据的结构。

元模型(也称元-元数据)定义了元数据的结构和语义。标准元模型的例子包括 Unified Modeling Language(UML)和 Common Warehouse Meta-model(CWM)。元-元模型层由元-元数据的结构和语义描述组成。目前正试图提供一种可以描述所有其他信息模型的通用语言。Meta Object Facility(MOF)是元-元模型的一个标准(参见参考资料部分)。


图 2:MOF 元数据构架
MOF 元数据构架

对元数据的生产者来说,遵循元模型、元数据接口、元-元模型和查询语言方面的标准是非常重要的。通过这些标准,才能实现最大限度的互操作性,并可以服务于更多的元数据消费者,例如数据仓库、分析和建模工具。SOA 正是依靠这些标准来实现生产者和消费者之间的动态匹配、监控 BPEL 流,以及增强对 IT 资源和业务流程的跟踪能力。

元数据管理注意事项

当我们重新设计元数据管理时,由于 XML 的普及,它显然是元数据的缺省数据格式。对于单个供应商或是组织来说,通常首选是集中方式,用来实现元数据资产的重用,并减少开发的工作量,避免出现混乱。同样,标准就是这个首选的方法。例如,IBM® 使用开放源代码的 Eclipse Modeling Framework(EMF)作为通用的元数据集成技术。EMF 为工具和运行时提供了元数据集成。因此,在 EMF 基础上开发的所有软件都可以共享其它应用程序的通用方法。在理想的环境中(在短期内实现可能比较困难),元数据储存库可以储存所有的元数据构件。服务由信息管理体构,例如在需要时,可以调用信息管理提供的服务(比如 SSO、ETL、联合、质量、搜索、版本控制和工作流)以获取数据、内容和元数据管理。

对于 XML 储存库而言,有两种常用的用来储存 XML 元数据的储存机制。分别为 RDBM 和固有的 XML 储存库。每种储存机制都有优缺点。起决定作用的因素包括性能、灵活性、带宽、互操作性、用户定义数据类型的支持以及数据质量的保证等。

无论对于供应商、企业或是行业级别而言,在进行元数据管理时,联合的方法都是更加实用的。虚拟的元数据储存库允许应用程序通过单个 API 访问并聚集不同种类的元数据源。物理元数据构件可以被储存在其初始的位置,也可以通过 ETL/replication/cache 方法来改进性能和元数据安置。在不同元数据源之间进行自动发现、映射和转换对改进元数据的可管理性都是非常重要。

数据、内容和元数据管理之间的关系

一方面,元数据使程序间可以互相对话(实际上,供应商可调用它的元数据储存库 SuperGlue)。另一方面,元数据管理的需求与数据和内容管理是十分类似的。元数据管理需要提供关于安全性、协作、 QoS 和可管理性的相同的服务类型。元数据管理还要将 SSO、ETL、联合、质量、搜索、版本控制、工作流和储存持久性结合在一起。元数据管理在自动操作和编制(orchestration)方面的需求比数据和内容管理更多,因为元数据所服务的对象主要是计算机程序。

不管怎样,资产重用和服务编制可以通过在基于 SOA 且架构完善的信息管理基础上构建元数据管理来实现。这就证明了将信息管理重新设计为基于 SOA 的可重用构件的重要性。

元数据集成的难题

前面已经说过,集成元数据比集成数据和内容更加复杂。许多因素都增加了元数据集成的难度。这些因素包括:

  • 元数据无处不在,且在许多情况下对用户是不可见的。
  • 许多产品中的元数据和元模型都有其专有格式,特别是内容管理。
  • 在内容管理中,向内容中添加元数据。许多内容都缺乏元数据来进行集成和搜索。
  • 元数据集成相对数据和内容集成来说,需要更高级别的自动化和编制。这就依次需要更高级别的自动发现、转换、映射和语义理解。
  • 为了避免失去当前客户,供应商还可以选择保持客户的专有元数据格式。
  • 转换到元数据标准(例如 MOF)需要时间和工作量。

元数据集成的业务价值

SOA 在很大程度上是元数据驱动的构架。要理解元数据集成的高级别业务价值,让我们先进行全方位的概览。图 3 阐明了随需应变业务上下文中元数据集成的重要性。基于信息标准,元数据可以实现无缝信息交换。给出良好集成的元数据后,信息可以在由操作系统、编程语言、位置和数据格式组成的边界之间自由流动。因此元数据可以被认为是信息集成的“大脑”。此外,信息集成使得可以进行业务集成,业务集成既可以是跨企业中各部门的,也可以是跨企业边界的。它提供以下内容:

  • 通过数据仓库或联合的方式,提供单一且完整的客户、伙伴、产品和业务视图。
  • 通过使用分析服务,使业务性能管理更加便利。
  • 通过广泛的信息访问来增强业务应用程序。
  • 通过持续的信息服务实现业务流程转换。

最后,业务集成是随需应变业务的基础之一。通过使用 IT 技术服务于业务目标(而不是相反),使业务集成与之前的 Enterprise Application Integration(EAI)区别开来。因此,说元数据集成是随需应变业务的“大脑”一点都不夸张。


图 3:元数据集成是随需应变业务集成的大脑
元数据集成是随需应变业务集成的大脑

高级元数据集成价值的例子包括:

  • 有助于来自不同源的数据/内容集成。
  • 缩短新应用程序的上市时间,并允许更快速的应用程序集成
  • 改善企业内部或企业之间的业务集成流程
  • 通过完整的集成信息分析,提供了全新的认识
  • 通过变更管理和预测分析,进行结果分析





数据和内容联合:分散式方法

联合的概念是指将资源集看作单个资源来进行查看和操作,且保持其自治(对当前的应用程序或系统影响极少或没有影响)和完整性(不会破坏当前应用程序或系统中的数据或内容)。不用说,自治和完整性是联合的两个重要前提。

自 20 世纪 90 年代后期,数据联合已经作为与集中方法截然不同的一种方法而出现了。在分散方法中,使用了数据市场(mart)和仓库。数据联合力图将数据放在其原始位置上,并创建虚拟数据库。类似地,最近出现的内容联合可以用来访问并聚集不同的内容源。这些分散的方法相比集中化方法而言,减少了数据和内容冗余、带宽、储存、实时同步以及额外的管理费用。对分布式信息源的实时访问同样为业务智能带来了新的性能,这应该遵循法定和管理需求。对于开发人员来说,数据联合减少了为不同的数据源编写和维护自定义 API 的需求,以及对高度专门技能的需求。

对于数据联合而言,最需要关注的就是其性能。要改进性能,联合需要经常使用缓存、物理查询表(MQT)以及分布式查询优化和执行。高速缓存和 MQT 在联合的服务器上创建并管理表,这些服务器可以是目标联合数据源的全部或是其中的一部分。作为一种 cutting-edge 工具,IBM WebSphere® Information Integrator 考虑了以下方面:

  • 源数据(例如基数或是索引)的标准统计
  • 数据服务器性能(例如连接特性和内置功能)
  • 数据服务器容量
  • I/O 容量
  • 网速(请参阅参考资料部分的 IBM Redbook,“DB2II: Performance Monitoring, Tuning and Capacity Planning Guide”)






ETL:集中方法

提取-转换-加载(Extract-transform-load,ETL)是用于数据集成的最古老的技术之一,且和数据储存和业务智能紧密结合。该方法可以用于数据合并、迁移和传播。ETL 工具从一个或是多个数据源中提取、转换和加载数据至其它目标。ETL 曾经一段时间是信息集成的主要方法且至今仍旧运用十分广泛。与直接的提取和加载操作不同,转换是最复杂的部分。因为在此过程中需要对数据进行理解、转换、聚集和计算。由于高费用、较慢的周转周期以及数据源中不完整的信息集而使 ETL 和数据仓库的优势大打折扣。

集中式和分散式方法互补,将两者结合在一起会产生很多的优势。

集中式方法包含了以下一些方面:

  • 访问性能或可用性需求需要集中数据。
  • 当前需求要求时间点一致性,例如业务关闭。
  • 需要进行复杂转换,以实现数据的语义一致性。
  • 集中化方法通常用于生产应用程序、数据仓库和操作数据存储库。
  • 集中化方法通常由 ETL 或是复制技术来管理。

分散式方法包含了以下需要考虑的事项:

  • 源系统的访问性能和负载的提高可以降低整体实现的费用。
  • 当前需求需要数据的最新副本。
  • 数据安全性、许可限制或行业规则限制了数据传输。
  • 分散化方法可以结合复合格式数据,例如客户 ODS 与相关的契约文档或是图象相结合。
  • 查询需要实时数据,例如股票报价、现有存货目录






数据复制和事件发布

数据复制使数据的副本从一个位置移到另一个位置。目标位置可以是集中的位置,例如数据仓库,也可以是网络上另一个分布式位置。在网格环境中,复制和缓存服务用来创建 Placement Management Service 以满足服务质量 (QoS) 目标。根据访问模式和消费应用程序位置的不同,Placement Management Service 通过创建缓存或是副本(参见参考资料部分中的 “Towards an information infrastructure for the grid” 一文)来提高相应时间以及信息可用性。在 Web 应用程序环境中,当数据或是内容已经准备好被发布用于公共消费时,数据和内容复制通常用来将数据或内容从分段服务器(通常只是管理员使用的服务器)转移到生产服务器。分段数据管理使组织能够更好的控制信息流和信息的生命周期。例如,一个 Web 站点支持多国语言。当一段数据或内容元素需要在网站上发布之前被翻译,则首先需要将其传给分段服务器。只有在被翻译完并被管理员许可以后,才可以复制给生产服务器并进行发布。

复制可以与集中式或分散式方法共同使用。ETL 和数据复制间主要的区别是, ETL 通常在应用了数据过滤和转换规则后,将数据移动到集中位置,这要花费更长的时间,并移动更多的数据。数据复制移动的数据集就小很多,可以更自动化的方式移动到集中的或是分散的位置。数据复制可以对数据进行实时或是近实时访问。ETL 的主要目的是分析并监控数据,并生成业务智能。但数据复制的目标更多的与性能、数据管理和数据可用性相关。最后,ETL 和数据复制可以互补,换句话说,可以使用数据复制功能更快地将数据移动到数据市场或是存储库,ETL 中的数据转换功能可以提供数据复制领域更大的灵活性和更高的数据质量。为了重用不同工具的逻辑,需要有易于调用且松耦合的信息服务。

和 ETL 以及数据复制不同,事件发布并不清楚数据的去向以及如何使用数据。源表的变更将以 XML 格式或是其它数据格式发布到消息队列。应用程序负责检索已发布的事件并采取适当的操作,例如触发业务流程或在将数据应用到目标数据源之前对数据进行转换。松耦合架构将服务提供者和消费者分离,并允许数据事件独立于应用程序。







逻辑数据和语义信息建模

逻辑数据建模是软件开发的最佳实践之一,也是当开发组织在时间和预算压力之下很容易被忽视的地方。虽然在内部开发过程中经常忽略逻辑数据建模,但组织经常购买获得 企业资源规划(Enterprise Resource Planning,ERP)、客户关系管理(Customer Relationship Management,CRM)或是其他类型的包。结果是,许多版本的数据模型引用了组织内的同一个事物,且每个数据源都有自己的数据模型和元模型。例如,引用了客户的不同的项,CRM 称其为 customer,记账系统中称其为 client,而销售系统中称之为 buyer,这种情况并不少见。教科书和理论家力图从逻辑企业数据模型开始,再转至物理数据模型(例如实体关系图)、代码生成和开发,但是在实际中顺序却经常颠倒过来。

在实践中,组织常分阶段构建、购买或是获取数据库,且数据保持被隔离的状态。有时这些组织认识到需要对数据进行集成。那么接下来要怎样实现呢?通常会钻研大堆的文档、成千上万的代码行以及海量的数据,来发现其生产和消费的信息类型,更不用说这些组织要发现和记录各种数据模型和业务流程之间的相互关系了。在这种情况下,自动数据发现和概要工具可以加快这些流程,并减轻执行这些任务的复杂性。许多组织在最后将得到逻辑企业数据模型,这样单独的系统就可以被映射到公共逻辑模型上。转换在一些案例中需要用到,例如货币间的转换。最终,物理数据模型被映射到企业数据模型——即企业共享的公共逻辑数据模型。如果企业数据模型在一开始就被设计为模型驱动架构(Model Driven Architecture)的一部分,那么该模型就可以最大限度的发挥其优势。不过,逆向的工程步骤也是非常有价值的。企业数据模型的主要优势在于:

  • 提供企业信息资产的概览。
  • 增强使用 IT 技术来支持业务流程的实践。
  • 减少企业信息集成(Enterprise Information Integration,EII)、企业应用程序集成(Enterprise Application Integration,EAI)以及数据存储的费用和风险。
  • 提供对数据、元数据和元模型的基于资产的重用。
  • 提高数据和元数据质量。
  • 便于业务分析员、数据建模者、开发人员和数据库管理员之间的通信。

语义信息建模(本体)不属于逻辑数据建模,它对数据的语义(含义)和关系建模。它合并了多个知识领域的词汇(术语和概念)。语义信息建模可以出色地解决许多难题,例如以下问题(参见参考资料部分中的 “Sematics FAQs” 一文):

  • 信息集成
  • 模型转换
  • 解释
  • 数据净化
  • 搜索
  • 导航
  • 文本理解
  • 文档准备
  • 语音理解
  • 问答






数据概要(Data profiling)

数据概要是发现以下方面的流程:

  • 数据格式
  • 模式
  • 特性
  • 规则
  • 隐含关系

数据概要同样提供了很多的优点,包括:

  • 改善组织对数据的理解。
  • 有助于电子数据管理(Electronic Data Management,EDM)。
  • 便于数据映射和转换。
  • 提高数据质量。
  • 构建性能调整的基线。
  • 协助语义建模。

数据概要旨在更好的理解信息并创建关于对象的更多元数据。






数据、内容和元数据质量

数据质量将影响企业信息管理策略的成功与否,企业信息管理策略决定了其业务集成策略的成败。数据质量问题被认为是数据储存项目失效的主要原因之一。低质量的数据会导致误传的决策、无效的操作和错失机遇,并且有时还会受到来自组织或市场的惩罚。 数据质量并非华而不实,它已经成为业务的关键操作要素。

数据质量问题的例子如下:

  • 丢失所需域的数据
  • 不一致的数据条目
  • 不正确或不准确的数据条目

由于数据质量工作固有的复杂性,一些组织选择将这些工作外包给第三方服务提供商。我们将在本文后面部分的案例学习中看到。

内容质量经常被部分忽视,这是因为评估内容质量比评估数据质量更困难。毕竟内容是非结构化的,且质量标准更加主观和随意。内容质量通常不包含在技术项目范围之内。从组织的角度来说内容质量并未得到重视。但是,在 SOA 环境中,因为 SOA 不固定的特性而使内容质量变得更加重要。如果错误数据或是质量次的内容没有及时发现,就会到处传播。内容质量标准由于内容类型的不同而有所区别,但是评估内容质量还是有一些共同的标准,如以下所示:

  • 关联
  • 及时
  • 截止时间
  • 内容确认
  • 等级
  • 副本
  • 链接检查

由于对元数据管理能力需求的增长,元数据质量最近受到更多的关注。改进数据质量的技术,例如标准化、概要、审查、净化、转换和确认,都可用来改进元数据质量。

强数据类型是跨不同的编程语言和硬件确保 XML 数据值一致性的关键。但是,当前 XML 技术只允许单个文档的 schema 确认,却没有一种有效的方法来跨不同的 schema 和数据源(比如在关系数据库和 OO 数据类型工具之间)验证数据类型(包括用户定义的数据类型)并实施语义强类型。仅仅 XML 文档类型定义(DTD)或 schema 的标准化(许多行业试图用这种标准化来作为该问题的解决方案)是不够的,因为当需要在多个行业之间集成数据时(这是随需应变业务的一个基本需求。),XML DTD 或 schema 验证、语义一致性和兼容性方面的问题仍旧存在。







搜索和查询

在企业搜索中,搜索分许多类型:关键字、布尔值、范围、多层面元数据(faceted metadata)、语义、自然语言和参数化。不论用哪种搜索,目的都是为了提供统一、相关并排序的结果集,从而可以快速且方便的访问信息。为便于搜索,可以使用索引(indexing,请不要与关系数据库中的索引混淆)来索引非结构化内容(例如 Web 页面、电子邮件数据库或是文件系统)的关键字、概念和实例元数据,使这些内容可以被搜索和检索。关系数据库也可以被编入索引,以进行更快和更灵活的搜索。

虽然许多组织认识到集成结构化和非结构化信息的重要性,但目前的搜索结果仍旧互不相干。用户想要的是指向潜在相关信息的一系列链接。用户不得不对搜索结果慢慢的浏览检验,以找到所需的信息并与其最初的查询目的联系在一起。这基本上是手动的流程。我们认为迫切需要研究使用搜索和查询在数据和内容之间实现一项查询,一组结果集

数据库通常都自带搜索功能。最常见的搜索功能是使用 SQL 和 XQuery 之类的查询语言。用数据库搜索来检索结构化且严格匹配的数据十分管用,但这需要对查询结构和数据模型十分熟悉和了解才行。数据库搜索的用户大都是开发人员或是数据库管理员。另外,数据库搜索不适合于相关排序、模糊搜索和多关键字。因此,数据库搜索的使用受到了很多限制。为实现高性能、灵活性以及相关排序等,一些搜索引擎与数据库直接相连,从数据库提取数据并生成索引。一个例子就是 IBM WebSphere OmniFind。







分析

在先前 ETL 部分我们已经阐明,数据仓库将数据合并到中央位置以确保更好的进行决策、跨部门报告和数据挖掘。传统的分析包括报告、数据挖掘、仪表板(dashboard)、记分卡和业务性能管理。随着竞争日趋激烈,操作变得越来越复杂,规则也随着更加严格。组织需要实时访问不同的数据源来做以下改进:

  • 使用集成信息预测市场趋势。
  • 更好的了解客户。
  • 提高操作效率。
  • 确保遵循规则。
  • 获取新知识。

所有这些趋势使得对信息管理分析能力的需求不断增加。分析变得越来越重要。例如,如果销售商知道现有客户的合同、服务经验和其行业趋势、其竞争者和客户,他(或她)就可以更好地为客户定制专门的销售建议。最近,分析经常需要在不同的信息源间进行信息集成。例如,要评估质量,汽车制造商需要将事故报告(存在文档管理系统内)、经销商的修理记录(存在关系数据库内)、司机的风险因素以及环境因素(存在知识管理系统内)相关联。在未来,通过分析将能够更加智能化的访问并关联不同的信息源的信息,从而提供新的市场洞察和业务决策。







相关服务

以下服务被称为“相关”服务,并不是因为它们对于信息管理而言不重要,而是因为他们对于业务流程和应用集成来说十分常见。

SSO、访问控制和审查

单点登录(SSO)到不同信息源、访问控制、审查对信息的查看和修改,这些共同构建了信息管理安全环境的基础。SSO 对用户提出您是谁的问题,访问控制则提出您可以做什么,审查随时跟踪您已完成的操作。SSO 的优点很多:减少用户受挫的可能、降低开发工作量并提高效率。访问控制确保只有拥有正确权限的用户才能访问数据和内容。一些业务需要非常复杂的访问权限管理,例如 Digital Rights Management。审查服务为数据和内容提供了额外的保障。查看、插入、修改和删除信息操作都能被审查并被报告。随着对安全性和规则灵活性的需求不断增长,SSO、访问控制和审查服务的结合为企业信息管理打下坚实的基础。

工作流和版本控制

工作流和版本控制都设计为促进团队环境中的协作。在通过版本控制建立一致点时,数据、内容和元数据管理、应用程序代码开发和流程都需要工作流,从而允许人们进行协作,以便之后将这些一致点返回给版本控制。工作流将用户、流程和信息链接在一个系统中。系统的每个部分——人、流程和信息——都是高度交互的,且它们之间的交互甚至更加动态。例如,一家公司编写了一个程序使每个雇员都可以提交自己对任何主题的建议。根据建议类别的不同(信息),这些建议将被不同的人发送、评审和处理(流程)。因此,需要一个高度健全且合适的工作流来处理不能预料的情况。一旦开发了这样的工作流服务,不用的应用程序可以对其进行调用,这些应用程序包括文档管理、HR 系统或者知识管理。

门户

业界分析家预测,结合了 Web 服务的企业门户将未来的十二个月内实现。门户集成了应用程序和信息,并通过统一的视图将其呈现给最终用户。由于 EII 提供了抽象层,开发人员可以访问并汇集不同的信息源、维护代码并实现性能和安全性需求,而无需编写自定义适配器。因此,应用程序开发可以节省大量的时间、花费和技能需求,且门户用户可以轻松访问各种广泛的信息。最重要的是,可以对端到端业务流程进行轻松且快速的集成。







案例学习:数据质量服务实例

信息管理栈中的企业搜索、数据质量与验证,以及分析等服务通常是外购的不错选择。SOA 下的信息管理框架确立了一个新的业务模型,该业务模型越来越受到使用者的欢迎。让我们看一个案例学习,该案例通过 SOA 提供了数据验证服务,这种服务也是一种数据质量服务。

为了防止出错和欺诈行为,或是为了遵循相关法律和规定(比如 Sarbanes-Oxley),许多电子商务公司需要实时检验地址、电话号码以及社会安全号码等识别信息。由于数据质量确认的复杂性,一些公司订购了由第三方提供的数据验证服务,而不是开发内部解决方案。一些公司提供数据验证和质量服务,并提供网上的实时地址和电话号码验证。在客户填写了电子商务应用程序并在线提交后,电子商务公司将客户信息封装至 XML 文档并通过 Web 服务、简单对象访问协议(Simple Object Access Protocol,SOAP)和 Web 服务描述语言(Services Description Language,WSDL)将其发送到数据验证公司。数据验证公司将在相同的客户事务中,对数据进行实时验证。对于客户而言,他们将获得及时的反馈,并能够纠正或取消事务。

在过去,如果在流程中数据出错,电子商务要在数天甚至数月以后才能收到不能投递的地址或是电子邮件。同时,客户还不明白他们的帐户出了什么问题。使用 SOA 进行数据验证服务,使电子商务公司从维护和更新数十亿字节的数据库信息的重担中解脱出来,这些数据库信息包含数百万来自不同城市和地域的用户姓名、电话号码和有效地址。







结束语

作者阐述了信息管理提供的每个服务,并特别关注元数据管理和集成。虽然服务的种类有很多,但这些是至关重要的,如果您还记得下列价值取向,可以参阅信息管理的要点:

  • 安全性
  • 协作
  • 服务质量
  • 可管理性
  • 消费

希望本文可以使您意识到信息管理的重要性和其涉及的广泛领域。通过掌握单个部分和它们之间交互的知识,您将能更有效的利用信息管理的优势,以构建健全且均衡的 SOA。

致谢

在此,作者感谢 Susan Malaika 和 Norbert Bieberstein 对本文提出的有价值的反馈,并感谢 Robert D. Johnson 的支持。

IBM 信息管理产品

下表展示了信息管理服务和实现这些服务所需的 IBM 相关产品

表 1. IBM 信息管理产品

信息管理服务 IBM 产品
分析 DB2® Data Warehouse Edition; DB2 Cube Views; DB2 Alphablox; DB2 Entity Analytics
内容联合 WebSphere® Information Integrator, Content Edition
数据联合 WebSphere Information Integrator
数据建模 Rational® XDE; alphaWorks Data Architect for DB2 Document Management
数据概要 WebSphere ProfileStage
数据质量 WebSphere QualityStage
ETL WebSphere DataStage;DB2 Warehouse Manager
逻辑和语义信息建模 IBM Research Ontology management system (Snobase)
元数据储存库 WebSphere MetaStage;alphaWorks XML Registry
搜索 WebSphere Information Integrator OmniFind Edition

posted @ 2006-04-17 03:36 wsdfsdf 阅读(148) | 评论 (0)编辑 收藏

开发从遗留的企业 IT 基础架构到基于 SOA 的企业架构的移植策略

学习如何为企业开发面向服务的体系结构(Service Oriented Architecture,SOA)移植策略,该企业的 IT 基础架构包括业务筒仓(silo)的单独业务线,并拥有许多集成的遗留应用程序来支持业务目标。本文包括开发成功的 SOA 移植策略所需行为的工作细化结构范例,最终生成符合 IBM 客户合约中 SOA 原则的实际应用程序。

SOA 介绍

自从 Gartner Group [1]提出面向服务的体系结构(Service Oriented Architecture,SOA)和企业服务总线(Enterprise Service Bus,ESB)以来,这些术语已经用了好几年了。然而,应用 SOA 解决方案的实际细节仅仅是最近才出现的。

那么,准确地说面向服务的体系结构是什么呢?“SOA 是一种组件模型,它通过应用程序功能单元(称为服务)之间定义完善的接口和契约,来联系应用程序中的不同服务。”[2]。通过以上的定义,当提取应用程序作为服务时,SOA 是在应用程序之间构建企业级集成层的模式集。SOA 解决方案提倡使用开放标准,然而当集成应用程序时,在某些地方还是需要使用专有技术。

SOA 依赖于将应用程序功能发布为服务,这些服务可被外部各方调用。通常,对 SOA 服务定义的一致观点是[3]:

  • 服务通过明确的、与实现无关的接口来定义。
  • 服务被松散绑定,并且可以通过强调位置透明性和互操作性的通信协议进行调用。
  • 服务封装了可重用的业务功能。

服务可存在于不同的级别上,并提供不同的粒度。通常认为有以下服务级别[4]:

  • 技术功能(例如,日志记录)
  • 业务功能(例如,getCustomerInfo)
  • 业务事务(例如,openAccount)
  • 业务流程(例如,processOrder)

每一个粒度级别可能都需要一些合成度。在每个粒度级别上,服务定义以可复用的方式封装其功能是很重要的。

将应用程序功能发布成服务使应用程序可以高效解耦,这是 SOA 的一种需求。通过接口将功能发布成服务,该接口将针对这项功能创建会话虚包(faÇade)。可以通过直接修改应用程序或者通过创建适配器(将请求转换成特定于应用程序的调用)来创建这样的接口。

当应用程序功能作为服务公开时,创建服务消费者和提供者之间路由消息的机制是很重要的。SOA 解决方案通过使用企业服务总线(Enterprise Services Bus,ESB)来满足此需求。企业服务总线是为各种服务请求者和服务提供者提供连接层的一种消息代理,它确保二者之间合适的消息路由。服务请求者是组件,它调用由服务提供者发布的服务来实现内部逻辑。

虽然 ESB 最重要的任务是提供连接框架,但它也提供现代 IT 所需要的合适的服务级别和可管理性。实质上,ESB 允许在基于 SOA 的架构中集成服务,并提供“服务请求者和服务提供者之间使用分布式中介功能的单一管理点”[4]。

ESB 在服务请求者和提供者之间提供松耦合,允许用一个服务实现来替换另一个,而且不会对该服务的消费者造成影响。

在 ESB 提供了服务之间连接性的同时,其他 SOA 组件也提供了对发布、发现和调用服务的支持。这些组件包括业务服务目录、业务服务编排和 ESB 网关。然而,这些组件的部署需要根据实际的业务需求来决定。举个例子,许多较小的企业可能发现他们实际上并不需要 ESB 网关,因此,将不必建立这些网关,导致架构过于复杂。

业务服务目录提供 ESB 所依赖的服务路由信息,同时支持服务请求者和提供者之间的通信。然而,业务服务目录的主要任务是提供服务细节,这些服务细节可用于执行基础架构所支持的业务功能。实质上,业务服务目录是服务消费者寻找支持他们操作的服务的地方。

在业务服务目录提供关于现有服务的信息的同时,业务服务编排组件允许通过现有的低级服务组成新的服务。例如,可以通过定义包含几个较低级别业务功能的工作流来创建新的业务事务。这样的工作流成为新的服务,并发布在业务服务目录中。







开发 SOA 移植策略

许多提供多种服务的大企业如今发现,他们的 IT 已经被严重拆分。主要是因为许多企业选择允许每个业务部门维护它自己的 IT 需求,而不是依赖于集中管理的 IT 组织。因此,许多部门只创建与自身相关的应用程序。通常,公司可能有一些账单、帐目管理以及类似的支持不同业务方面的系统。而且,许多公司希望安装“最佳”软件,而不考虑同其它应用程序的集成。后来他们发现,将新的应用程序加入 基础架构时经常需要特定的方案。下面的图 1 正是目前一些企业中 IT 基础架构的例子:


图 1.常见的遗留企业 IT 基础架构
常见的遗留企业 IT 基础架构

从上图中可以注意到一个 IT 难题,那就是大多数应用程序之间直接相互通信。当应用程序需要修改或淘汰时,这种依赖便成为一个实际问题。任何修改都可能会按其自身的方式更新每条唯一的通信线路。因此,这种变更可能代价高昂。这种情况被称为应用程序间的紧耦合,也逐渐成为让一些企业头疼的问题。

另一方面,SOA 将松耦合作为成功的企业级应用程序集成的一个主要原则。与紧耦合相反,松耦合是:

限制请求者应用程序代码和提供者应用程序代码的相互了解。如果耦合的服务任何方面有所变化,那么,请求者或提供者的应用程序代码(更可能是两者同时)必须改变。如果任何一方(请求者、提供者或中介基础架构)对解耦的服务任何方面作出改变,那么其它几方不必随之改变。[5]

图 1 也示例了当在几个业务区域内部署具有所需功能的应用程序时(例如,应用程序 1 和应用程序 1'),一些企业所采用的实践行动。通常,用每个部署稍微修改应用程序以满足特定业务区域的独特需求。虽然让多个应用程序具有相同功能并没有明显的缺点,但它们的存在可能表明:

  • 企业中可能存在数据副本,这会影响操作数据的准确性。这是由以下原因造成的:大部分此种应用程序依赖于相同的数据源, 且为了性能或其他原因,一部分数据被本地存储。
  • 维护多个应用程序比支持单个解决方案需要更高的花费。
  • 当对这些应用程序进行合并,以减少对那些与被淘汰的方案互相依赖的应用程序的影响时,需要特别注意。

通过采用 SOA 原则在企业级别上成功集成应用程序可解决这些问题。

值得注意的是,当企业还未被深入划分时,应用 SOA 是合理的。然而,当公司内 IT 部门的数量很多,而且它们托管的应用程序数量更多时,实现基于 SOA 的企业体系结构将是一项具有挑战性的工作,需要精心规划。

将复杂的深入划分的企业分割成一些单独的域,事情可能会变得容易很多。第一,通过 ESB 发布特殊的应用程序服务,每一个域可以与企业其余部分解耦。第二,以后域内的应用程序可以启用 SOA,而不会影响企业其余部分。

按照业务功能(例如,销售、账户管理、客户服务等等)或实现(比如大型机和 Unix 服务器)来对域的划分进行组织。然而,实质上,域将包含更紧密连接的应用程序,因此,相比它们与企业的其余部分的关系,这些应用程序彼此之间将具有更严重的依赖性。

如果一组服务属于单独的域,那么可用下列准则来定义:

  • 功能域是基于业务功能选择的。这些域中的服务消费域外部的有限数量的服务,并对外部公开有限数量的服务。
  • 基于技术的域根据所利用的一系列技术来选择。这些可能包括大型机应用程序、分布式应用程序等等。
  • 基于应用程序的域是紧耦合的应用程序集合。共享相同数据库的电子商务应用程序或大型机应用程序的集合是这种划分的一个例子。

域的初始划分也可以是纯概念上的,对那些需要作为服务向企业其余部分公开的应用程序功能进行确认。

一旦确认了服务,需要通过使用网关和防火墙建立明确的边界,从而使域彼此分离。这种分离提供了对应用程序交互的更好的控制,并可进一步对应用程序进行灵活的变更,而不会对企业其余部分产生重大影响。这种分离可通过几种不同的方法实现:

  • 将公开域功能的业务功能定义为粗粒度服务:业务功能由企业需求驱动,而并非内部的实现细节。业务功能可以在域内部调用细粒度的技术服务,对外部消费者提供服务。定义业务功能的主要目的是限制域之间的交互。
  • 添加网关可以将一个域设定转换为另一个域设定:通过添加更好的控制功能,网关也允许在外部实体间(例如业务伙伴)建立明确的界限。通常,网关可与业务功能合成为一个逻辑实体。然而,添加网关是由业务需求决定的,如果域共享相同的设定就不需要添加网关。使用下列方法之一可以实现网关:

    • 透明/代理网关以消费者认为能直接与业务功能进行交互的方式公开域服务。这种网关也可以基于企业基础架构需求对输入和输出的消息进行转换。当域数据以非常特殊的格式(与企业级约定完全不同)存储时,需要进行转换。例如,按照企业策略,特定于域的二进制数据可能需要转换成 XML。
    • 防火墙允许增强对域的封装。尽管,防火墙不去执行任何转换,但是它们限制消费者仅能访问域边界内预先定义的点。而且,防火墙的引入提供了对不遵循域的封装规则的服务进行检测。

分析发布到域外部的应用程序功能时,会发现实际的服务是细粒度功能的结合。将应用程序功能编制为业务服务的一种机制是引入本地服务总线(Local Service Bus,LSB),将服务编排组件添加到这些域。

本地服务总线是为单个域提供连接支持的企业服务总线的实例。通过服务编排组件进行扩展,使域可以组成 ESB 可消费的更高级别的业务功能。

下面,图 2 演示了以上步骤生成的基础架构:


图 2.已定义并分离的 IT 域
已定义并分离的 IT 域

一旦封装了所有的域并公开了业务功能,通过 ESB 对其集成,并采用业务编排来创建更高级别的业务流程和事务就变得更加容易。一旦 ESB 是到位并且企业正在使用,就可以对域内遗留应用程序进行移植,且对企业其余部分影响很小。

下面(表 1)的工作细化结构范例描述了企业将遗留基础架构移植到基于 SOA 的企业体系结构所需要采取的主要步骤。尽管实际的任务清单是特定于对具体企业的,但是下面的清单为需要考虑的内容提供了一种思路。

表 1. 工作细化结构

ID 任务名称
1 SOA 移植规划
2            管理
3                        项目管理
4                        技术管理
5            实现活动
6                        收集信息
7                                    协商
8                                    文档分析
9                                    创建文档
10                                    评审
11                        分析
12                                    功能方面
13                                                收集信息
16                                                创建信息
17                                                评审
18                                    技术方面
19                                                收集信息
22                                                创建文档
23                                                评审
24                                    应用程序方面
25                                                收集信息
26                                                            协商
27                                                            文档分析
28                                                创建文档
29                                                评审
30                                    域方面
31                                                信息分析
32                                                创建文档
33                                                评审
34                        规划变更
35                                    ESB 规划
36                                                开发 ESB 组织原则
37                                                工作量估计
38                                                创建文档
39                                                评审
40                                    LSB 规划
41                                                 开发 LSB 组织原则
42                                                 工作量估计
43                                                 创建文档
44                                                 评审
45                                    相关性规划
46                                                相关性分析
47                                                创建文档
48                                                评审
49                                    接口规划
50                                                接口开发
51                                                创建文档
52                                                评审







结束语

基于 SOA 的企业体系结构的方法使得在对企业 IT 基础架构进行变更时,相关的移植风险更小。通常,公司认识到支持旧的基础架构是代价高昂的;然而,剧烈的变化是很有风险的。将企业划分为多个域,并引入本地服务总线(Local Service Bus)的概念可以减轻风险,并可用良好可控制步骤来将其移植到新的基础架构中。

请记住解决方案只可以被有效地应用于不同类的环境中,这点非常有用。同类环境不太可能从这种策略中获益。

posted @ 2006-04-17 03:33 wsdfsdf 阅读(124) | 评论 (0)编辑 收藏

在企业级 SOA 中使用 Web 服务,第 4 部分: 使用 Rational 开发工具构建 SOA 中间件应用程序

对构建企业面向服务的体系结构(Service-Oriented Architecture,SOA)中间件应用程序感兴趣吗?Judith Myerson 将向您提供四种可能的方法:自顶向下 (top-down)、自底向上 (bottom-up)、旁路 (sideway) 和嵌入式 (embedding),同时帮助您探究每种方法的各种利弊。您还会了解到如何确定中间件应用程序可以支持的共享 SOA 的最大数目。

引言

在我的关于企业级 SOA 系列的第一篇文章“在企业级 SOA 中使用 Web 服务,第 1 部分: 使用多重 SOA 来消除企业系统之间的差异”中,我曾谈及使用 SOA 消除企业系统差异的场景,展示了如何重用来自一个或多个 SOA 的 Web 服务(以数据为中心且具有业务逻辑),以及如何将它们组合到组织控制之下的一个复合应用程序中。

在第二篇文章“在企业级 SOA 中使用 Web 服务,第 2 部分: 使外部 Web 服务互操作性最优”中,我给出了不引起多重 SOA 过载的服务互操作性实例,从简单的协议共存到复杂的多平台互操作性。并且您了解了如何更改每个 Web 服务的服务类型、位置和平台来实现原始应用程序的业务流程。

本系列的第三部分“在企业级 SOA 中使用 Web 服务,第 3 部分: 将您的 SOA 合并成三维的整合中心以提高速度和可靠性”中,我解释了您可以如何将 Web 服务和非 Web 服务的多重 SOA 合并成单个三维的集成中心来连接到各种后端企业大型机系统。在本文中,我将解释您可以如何使用来自 IBM® Rational® 软件的开发工具在三维空间中开发企业 SOA 中间件应用程序。同时您还将了解到如何将 Web 服务组件组合成跨多重 SOA 的中间件应用程序,以及如何使用下面四种不同的方法来开发它们:

  • 自顶向下
  • 自底向上
  • 旁路
  • 嵌入式

让我们首先从物理和逻辑的角度研究每种方法。







逻辑和物理 Web 服务

物理 Web 服务即在存储库中所发布和找到的 Web 服务。创建一个逻辑 Web 服务后,可以继续将一个逻辑 Web 服务与另一个物理 Web 服务组合起来,创建一个新的逻辑 Web 服务以供使用。之后,您可以将最后得到的逻辑 Web 服务与另一个物理或逻辑 Web 服务组合起来。您也可以将逻辑 Web 服务转换成物理 Web 服务组件,以在存储库中发布和发现它们。

通过定义中间件应用程序的业务模型和物理 Web 服务组件的业务模型之间的关系,您可以创建逻辑 Web 服务的 SOA 中间件应用程序。为此,您可以使用 Rational Software Architect 和 Rational Software Modeler 中的一个或同时使用它们来支持使用统一建模语言(Unified Modeling Language,UML)的模型驱动 (model-driven) 开发,以及支持分别记录系统的不同视图的 UML 可视化建模设计。







自顶向下方法

自顶向下方法从 Web 服务或非 Web 服务中间件应用程序金字塔(请参见图 1)的顶端开始。您需要将其划分成更小的 Web 服务或组件,在金字塔的每个低层继续这个过程,直到最小的部分或组件到达金字塔的底部为止。系统的所有部分都将顺利地集成在一起并进行互操作。


图 1. 自顶向下方法
自顶向下方法

然而,互操作性可能具有不同的含义,这取决于应用程序的预定用途。例如,如果应用程序是以数据为中心,那么互操作性就是以数据为中心的。但是如果应用程序的主要目标是实现业务流程,那么互操作性就是基于流程的。

现在,让我们从逻辑的角度来研究自顶向下方法。自顶向下方法考虑由企业 SOA 中间件应用程序组成的应用程序的目标。这个目标又分成子目标,每个子目标更进一步分成更小的单元。这个过程一直继续下去,直到达到 SOA 中间件应用程序的金字塔的底部为止。

显然,确保所有子目标都顺利地进行互操作非常重要。如果目标针对的是提供一个服务或一组服务,那么服务互操作性就成为首要关注的事情。然而,如果目标针对的是实现策略和规则,那么我们就需要将重点放在策略的互操作性上。

在现实世界中,并不存在单纯的以数据为中心、基于流程或策略互操作性。相反,我们通常碰到的都是数据、流程、服务和策略互操作性混合在一起。每种互操作性类型所占的比例可以动态地变化,这取决于每个 Web 服务如何模块化、设置优先级、最优化,以及如何通过松耦合的方式使彼此的交互达到最大程序。同样,它也依赖于 Web 服务所运行的平台(例如开放的 Eclipse 体系结构)。







自底向上方法

从物理的角度来说,自底向上方法将基本的 Web 服务组件定义为最小的基础部分。这使您可以将它与上一层更大的元素组合在一起,继续这个过程,直到所有部分都在金字塔顶点处集成为一个完整的复杂 Web 服务和关系的中间件应用程序为止,如图 2 所示。


图 2. 自底向上方法
自底向上方法

这个物理角度假定系统的所有部分都可以顺利地进行互操作。互操作性的含义依赖于 Web 服务交互的类型:以数据为中心、业务流程或组合。应用程序之间互操作性的每种类型所占的比例可以动态地变化。

从逻辑的角度来说,自底向上方法从作为 SOA 企业目标的基础构件的子目标(例如服务组件)开始。作为一名开发人员,您可以与分析人员一起,将它们组合成上一层的更大目标。继续这个过程,直到所有的子目标都在金字塔的顶点处集成为一个 SOA 中间件的企业目标为止。

确保所有的子目标都将顺利地进行交互非常重要。如果子目标针对的是提供一个服务或一组服务,我们首要关注的事情就是子目标之间的服务互操作性。然而,如果子目标针对的是实现策略和规则,那么我们关心的事情就变成子目标之间的策略互操作性。







旁路方法

从物理的角度来说,旁路方法(如图 3 所示)允许您在自顶向下或自底向上方法的旁路添加或删除 Web 服务组件。这使您能够在保持现有中间件完整的同时,更好地响应变更的设计和开发需求。旁路角度假定要添加的组件将可以与现有的组件顺利地交互。同样,它也假定要删除的组件将不会破坏剩余组件之间的互操作性。


图 3. 旁路方法
旁路方法

从逻辑的角度来说,旁路方法使您能够从在自顶向下或自底向上方法的旁路添加逻辑 Web 服务的子目标开始。这使您可以添加诸如新的 Web 服务的服务类型和位置这样的子目标。您可以使用任一方法的旁路从逻辑 Web 服务中删除子目标。

您还可以更改 Web 服务的子目标,以便重用它来开发各种中间件应用程序。请确保在逻辑上添加、删除或者更改子目标时,Web 服务之间的互操作仍然能够在生产环境中顺利地进行。您还需要确保在测试环境中运行的 Web 服务能够顺利地出色工作。







嵌入式方法

从物理和逻辑的角度来说,嵌入式方法是上述三种方法的混合,至少要嵌入金字塔某层中的两级或三级深。在这个嵌套、两级嵌入式方法示例中,您可以在自底向上方法中嵌入自顶向下方法(请参见图 4),或者反过来。您也可以在自顶向下或自底向上方法中嵌入旁路方法。


图 4. 嵌入式方法
嵌入式方法

您可以获得三级嵌套的嵌入式方法。例如,通过将旁路方法嵌入到自顶向下方法,接着嵌入到自底向上方法,您可以做到这一点。您也可以将自顶向下方法嵌入到第二个自顶向下方法,接着再嵌入到自底向上方法。







决定使用哪种方法

在开放的体系结构中开发 SOA 中间件应用程序依赖于(举例)您想要使用哪种关系型或 WebSphere® 包。正如前面提到的,您可以使用 Rational Software Architect 和 Rational Software Modeler 来对企业 SOA 中间件进行建模,将 Web 服务当作对象、关系实体或者两者的混合。您也可以使用 Rational Web Developer for WebSphere Software for Linux™、Windows® 2000、Windows 2003 Server 和 Windows XP 来简化您的 Web 服务开发。







结束语

开发企业 SOA 中间件需要事先计划好可以将多少 SOA 作为中间件应用程序组合在一起。最好就使用哪些方法开发中间件的问题与业务分析人员小组进行沟通。您还将发现,解决了这些问题使开发企业 SOA 中间件更加容易。您可以为中间件应用程序开发这样的 SOA,它们既重用,又可以交互和集成。而且通过事先决定使用哪些方法或方法的组合,使分析人员设计和分析中间件的工作变得简单。分析人员能够确定使用哪种方法以及将多少个 SOA 组合在一起,因为中间件基于它们之间各种类型的互操作性,并且可能引起企业 SOA 过载。

posted @ 2006-04-17 03:32 wsdfsdf 阅读(161) | 评论 (1)编辑 收藏

仅列出标题
共19页: First 11 12 13 14 15 16 17 18 19