随着IBM WebSphere Integration Developer和WebSphere Process Server的发布,出现了一种用于构建面向服务的体系结构(SOA)的新编程范式,称为服务组件体系结构,它是为在SOA中构建和组装业务解决方案而专门设计的一个新编程模型,旨在集成和组合服务。
您可能认为,这太棒了,又出现了一个编程模型,但事实并非如此。Web服务怎么样了?Enterprise JavaBeans发生了什么?服务组件体系结构(SCA)并非要替换任何现有的编程模型或者与其抗衡。相反,SCA向您提供一个以与技术无关的方式定义接口、实现和引用的模型,从而使您能够将这些元素绑定到所选择的某一技术的特定实现。
例如,我们可以用Java定义我们的接口,将我们的实现作为BPEL流程加以应用,或者将接口作为一个WSDL文档,而且我们的实现可以是一个Java类。图1演示了如何在IBM WebSphere Process Server中使用SCA。
图1. WebSphere Process Server中的SCA
使用WebSphere Process Server,集成开发人员可以拥有各种不同的现成实现技术,并且可以采用开放标准(如通过Java或者WSDL)来公开接口。此外,SCA还提供了一个客户机编程模型,通过该模型,客户机可以访问服务组件。这使得开发人员可以继续使用他们熟悉的各种技术(如Enterprise JavaBeans(EJB))进行开发,并且使用SCA将这些组件连接在一起。
SCA的另一个主要部分是它还定义了一个标准模型,用于定义组件之间的依赖项。因此,通过使用引用连接SCA组件,可以定义依赖项。
图2. 定义组件之间的依赖项
最后,SCA定义了一个标准的部署模型,用于将组件打包到服务模块。可以定义SCA组件以及与其相关联的依赖项,并且将它们打包到部署单元。
图3. 与依赖项一起打包的组件
SCA模块并非只是另一种类型的包。在WebSphere Process Server中,SCA服务模块等同于一个J2EE EAR文件和许多其他J2EE子模块。J2EE元素(如WAR文件)可以与SCA模块一起打包。非SCA构件(JSP以及其他构件)也可以同SCA服务模块打包在一起,这使得它们可以使用一种称为独立引用的特殊类型的引用,来通过SCA客户机编程模型调用SCA服务。
图4. 用于非SCA构件的独立引用
SCA与集成有着紧密的联系;我们将上述引用作为一种定义SCA组件之间的依赖项的方式进行了描述。例如,我们可以定义对同一个模块内的另一个SCA组件的引用。当使用引用调用同一个模块内的服务组件时,数据通过引用进行传递。SCA定义了调用组件或其他SCA服务(位于其他SCA模块内)的方式。
用于模块到模块和模块到外部服务调用的这两种机制称为导入和导出。
导入和导出是从模块的角度表述的。模块是一组执行特定业务功能的自包含(self-contained)组件。
当模块需要向另一个实体(外部服务或其他模块)提供功能来调用业务功能时,它将导出该功能。导出使得可以通过多种不同的传输协议来使用此服务。导出与模块内的某个特定组件相关联。
当模块需要利用另一个实体(外部服务或模块)的功能时,模块将导入该功能。导入还提供了通过多种传输协议与服务提供者交互的功能。
图5阐释了这些概念。
图5. SCA导入和导出
导入和导出是抽象概念。它们需要绑定到某一特定技术。WebSphere Process Server V6.0中提供的绑定类型有:
·SCA(用于SCA模块到模块)
·Web服务
·JMS
·无状态会话Bean。
当通过导入和导出调用SCA组件时,参数通过值进行传递。
图6. SCA导入和导出
连接SCA组件的网络将大部分基础结构级别的代码抽象出来。例如,我们可以将网络定义为同步或异步,将操作定义为单向或请求-响应,我们也可以定义组件之间的事务行为。SCA为您处理基础结构方面的细节。我们将在这一系列文章中对这些细节进行更详细的描述。
导入和导出还可以绑定到其他技术,例如JMS、Enterprise JavaBean或者Web服务。这样,Web服务客户机就可以调用SCA模块,而SCA模块就可以使用SCA编程模型调用现有的Enterprise JavaBean。
图7. 使用其他技术的导入和导出
我们将在本系列的后续文章中讨论导入和导出。
数据方面的情况如何?
SCA向我们提供了一个用于定义业务服务的通用模型。服务数据对象(SDO)提供了一种用通用模型来表示数据的方法。可以将SCA组件组合在一起,并且通过传递SDO来以一种中立的方式相互交换数据。SDO体系结构中的基本概念是数据对象,它是用于存放基元类型的数据和/或其他数据对象的数据结构。数据对象还存放对元数据的引用,元数据提供有关包含在数据对象中的数据的信息。
在SDO编程模型中,数据对象是以commonj.sdo.DataObject Java接口定义表示的。该接口包含方法定义,通过方法定义,客户机可以获取和设置与数据对象相关联的属性。SDO体系结构中的另一个重要概念是数据图,它是封装一组数据对象的结构。对于包含在数据图中的顶层数据对象,可以从根数据对象开始遍历引用来到达所有子数据对象。数据图中的另一个重要功能是更改摘要,用于记录关于在处理过程中已经更改的图中的数据对象和属性的信息。(有关SDO的详细信息,请参阅参考资料。)
WebSphere Process Server通过业务对象实现SDO规范。SCA组件可以通过传递业务对象来交换数据,如图8所示。
图8. WebSphere Process Server业务对象
与SDO包装在数据图中一样,业务图用于包装顶层业务对象,并且提供用来补充包含在图中的数据的附加信息。具体来说,业务图包括图中数据的更改摘要(类似于SDO更改摘要信息)、事件摘要和谓词信息(用于EIS系统之间的数据同步)。业务图与SDO体系结构中的数据图的概念非常相似。然而,新增信息的事件摘要和谓词部分没有包含在SDO数据图概念中。
SCA 101
既然我们已经概括地介绍了SCA,就可以通过一个示例来讨论某些具体细节。在构建示例的过程中,我们将对IBM WebSphere Integration Developer进行概述,您可以使用该工具来以可见的方式构建和集成SCA组件。
概述
为了演示SCA和业务对象的各个方面,我们将讨论与一个业务案例有关的这些概念。与所有开发工作一样,开发周期必须从需求开始。该场景中的需求包括创建信用审批服务,该服务将接收关于申请者(CreditApplication)的信息,并通过信用等级(CreditRating)进行响应。
SCA中最简单的部分是服务组件。如前所述,服务组件是由一个接口和一个实现构成的。用来“编码”这些构件的技术可以有所不同;在WebSphere Process Server中,接口可以是Java或者WSDL。Java接口可以是Plain Old Java Interface(POJI),如下所示:
清单1
public interface CreditRequest
{
public DataObject calulateCreditScore(DataObject creditApp)
throws ServiceBusinessException;
}
如果您使用Java实现,则可以创建一个简单的POJO。下面是一个用作SCA实现的POJO的示例:
清单2
public class CreditApprovalImpl implements CreditRequest {
public DataObject calulateCreditScore(DataObject creditApp) {
ServiceManager serviceManager = new ServiceManager();
BOFactory bof = (BOFactory)serviceManager.locateService (“com/ibm/websphere/bo/BOFactory”);
DataObject creditRating = bof.create (“http://CreditApproval”, “CreditRating”);
creditRating.setString(“customerId”, creditApp.getString (“customerId”));
creditRating.setInt(“creditScore”, 750);
creditRating.setDouble(“creditLimit”, 10000d);
return creditRating;
}
}
在这个实现类中,我们使用CreditApplication输入创建一个简单的CreditRating业务对象,然后我们将该业务对象返回到调用程序。
服务组件是在服务组件定义语言(Service Component Definition Language,SCDL)文件中定义的。使用SCDL创建的组件文件与EJB部署描述符有些类似,这是因为它定义了接口、实现和SCA组件的多个服务质量需求。上述Java类的SCDL文件如下所示:
清单3
<?xml version=”1.0″ encoding=”UTF-8″?>
<scdl:component
displayName=”CreditApproval” name=”CreditApproval”>
<interfaces>
<interface xsi_type=”java:JavaInterface” interface=”CreditRequest ” >
<method name=”calulateCreditScore”/>
</interface>
</interfaces>
<implementation xsi_type=”java:JavaImplementation” class=” CreditApprovalImpl”/>
</scdl:component>
类似地,我们可以使用WSDL表示接口,如下所示:
清单4
<?xml version=”1.0″ encoding=”UTF-8″?>
<wsdl:definitions
name=”CreditRequest”
targetNamespace=”http://CreditApproval/CreditRequest”>
<wsdl:types>
<xsd:schema targetNamespace=”http://CreditApproval/CreditRequest”
>
<xsd:import namespace=”http://CreditApproval”
schemaLocation=”xsd-includes/http.CreditApproval.xsd”/>
<xsd:element name=”calulateCreditScore”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”CreditApp” nillable=”true”
type=”bons1:CreditApp”/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name=”calulateCreditScoreResponse”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”CreditRating” nillable=”true”
type=”bons1:CreditRating”/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name=”calulateCreditScoreRequestMsg”>
<wsdl:part element=”tns:calulateCreditScore”
name=”calulateCreditScoreParameters”/>
</wsdl:message>
<wsdl:message name=”calulateCreditScoreResponseMsg”>
<wsdl:part element=”tns:calulateCreditScoreResponse”
name=”calulateCreditScoreResult”/>
</wsdl:message>
<wsdl:portType name=”CreditRequest”>
<wsdl:operation name=”calulateCreditScore”>
<wsdl:input message=”tns:calulateCreditScoreRequestMsg”
name=”calulateCreditScoreRequest”/>
<wsdl:output message=”tns:calulateCreditScoreResponseMsg”
name=”calulateCreditScoreResponse”/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
实现类可能与之相同(唯一不同的是,它显然没有实现任何Java接口,因为它定义为WSDL)。
我们的SCDL文件可以将接口绑定到WSDL文档:
清单5
<?xml version=”1.0″ encoding=”UTF-8″?>
<scdl:component
displayName=”CreditApproval” name=”CreditApproval”>
<interfaces>
<interface xsi_type=”wsdl:WSDLPortType” portType=”ns1:CreditRequest”>
<method name=”calulateCreditScore”/>
</interface>
</interfaces>
<implementation xsi_type=”java:JavaImplementation” class=”CreditApprovalImpl”/>
</scdl:component>
SCDL用于描述SCA的组成部分,如模块、引用、导入和导出。您将在本系列中看到它们的示例。SCDL定义是由多个文件组成的。例如,我们将接口和实现的SCDL存储在一个名为CreditApproval.component的文件中。引用可以包含在CreditApproval.component文件(内联)中,也可以包含在Module根目录下的一个单独的sca.references文件中。所有独立引用都将放置在sca.references文件中,如下所示。如前所述,同一个SCA模块内的非SCA构件(JSP)可以使用独立引用调用SCA组件。
清单6
<?xml version=”1.0″ encoding=”UTF-8″?>
<scdl:references
>
<reference name=”CreditRequestPartner”>
<interface xsi_type=”java:JavaInterface” interface=”approval.credit.credit.request.CreditRequest”>
<method name=”calulateCreditScore”/>
</interface>
<wire target=”CreditApproval”/>
</reference>
</scdl:references>
在我们的示例中,我们将定义的第三个文件是sca.module。该SCDL文件包含模块的定义:
清单7
<?xml version=”1.0″ encoding=”UTF-8″?>
<scdl:module name=”CreditApproval”/>
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
谁知道阿里云河南服务中心是干什么的?
一直接到阿里云服务中心的电话,说是阿里云的授权中心,主要提供阿里云的区域服务的?请问其他地方也有阿里云的服务中 […]
-
事件驱动框架和SOA在空军的应用
空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。
-
揭秘New Relic APM技术细节
New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响
-
仅凭SOA和云无法解决业务数据管理风险问题
SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。