使用服务组件体系结构构建 SOA 解决方案——第 1 部分

ZDNet软件频道 时间:2009-02-04 作者:王洪伟 | CSDN 我要评论()
本文关键词:王洪伟 服务组件 体系结构 SOA
用于构建面向服务的体系结构 (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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java
="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:ns1
="http://CreditApproval/CreditRequest" 
xmlns:scdl
="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" 
xmlns:wsdl
="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" 
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 xmlns:bons1="http://CreditApproval" 
xmlns:tns
="http://CreditApproval/CreditRequest" 
xmlns:wsdl
="http://schemas.xmlSOAp.org/wsdl/" 
xmlns:xsd
="http://www.w3.org/2001/XMLSchema" name="CreditRequest" 
targetNamespace
="http://CreditApproval/CreditRequest">
  
<wsdl:types>
    
<xsd:schema targetNamespace="http://CreditApproval/CreditRequest" 
    xmlns:bons1
="http://CreditApproval" 
    xmlns:tns
="http://CreditApproval/CreditRequest" 
    xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
      
<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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java
="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:ns1
="http://CreditApproval/CreditRequest" 
xmlns:scdl
="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" 
xmlns:wsdl
="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0" 
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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:java
="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0" 
xmlns:scdl
="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0">
  
<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 xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApproval"/>

        虽然我们为组件定义了一个 WSDL 接口,但是请注意,我们能够将另一个 Java 接口添加到独立引用,并将其连接到我们的目标组件。通过这种方式,Java 客户机可以使用一个简单的 POJI 调用 SCA 组件。WebSphere Integration Developer 将提供在 Java 接口和 WSDL 接口之间转换调用的选项。在创建了第一个 SCA 组件后,您将很快看到这样一个示例。

        在这一系列文章中,我们将看到 SCDL 如何定义其他 SCA 构件(如服务引用、导入和导出)的示例。WebSphere Integration Developer 使用上述 SCDL 文件的命名约定,实际情况就是如此。在我们的示例中,在构建第一个 SCA 组件时,您将使用 WebSphere Integration Developer。然而,SCA 应用程序也可以使用记事本进行构建。

         在本文中,您将使用 WebSphere Integration Developer 和 WebSphere Process Server 来构建并运行 SCA 组件。

WebSphere Integration Developer 用于开发运行于 WebSphere Process Server V6 上的应用程序。WebSphere Integration Developer 基于 Eclipse 3.0 平台,它为集成项目提供了基于角色的开发。您可以将 WebSphere Integration Developer 和 IBM WebSphere Business Modeler V6 与 IBM Rational® Application Developer V6 或 IBM Rational Software Architect V6 一起作为集成开发平台。J2EE 开发人员、业务分析人员或集成开发人员可以使用基于其独特角色的工具透视图,这样每个开发人员都可以将注意力集中在这些角色所需的编辑器和工具上,从而大大提高了工作效率。

WebSphere Process Server 是一个基于 WebSphere Application Server V6 的综合集成平台。WebSphere Process Server 用于在面向服务的体系结构中执行基于组件的业务集成应用程序。由于它基于 WebSphere Application Server 提供的 J2EE 1.4 基础结构和平台服务,因此 WebSphere Process Server 包括诸如业务流程自动化之类的功能。

 

构建第一个 SCA 项目

现在,您可以构建第一个 SCA 项目了。在本例中,您将构建一个简单的信用审批组件。该组件接收一个具有 ID 和名称的数据对象,然后返回另一个包含信用分数和信用额度的数据对象。下载本文所附的 zip 文件,并将其解压缩到硬盘上。本指导假设您将 zip 文件解压缩到 C: 盘上。

WebSphere Integration Developer V6.0 是一个灵活的开发环境,它为自底向上或自顶向下开发 SCA 应用程序提供了工具和向导。

为了创建信用审批服务,我们将研究自顶向下开发的各个方面。自顶向下开发过程的一般步骤大致如下:

  1. 创建 SCA 模块。
  2. 创建业务对象。
  3. 定义服务接口。
  4. 生成组件并提供实现。
  5. 对 SCA 组件进行单元测试。
  6. 提供独立引用。
  7. 使用简单的 JSP 客户机测试服务。

 创建 SCA 模块

首先,您需要创建一个 SCA 模块。如前所述,SCA 模块是 SCA 组件的打包构造。

  1. 在 WebSphere Integration Developer 中打开一个空白工作区。(图 9)

    图 9. 在 WebSphere Integration Developer 中打开一个空白工作区


  2. 关闭 Welcome 屏幕。

  3. 接下来,您需要创建一个新模块。

    1. 在 WebSphere Integration Developer 工作台中,打开业务集成透视图。找到 Business Integration 视图。

    2. 在 Business Integration 视图内单击鼠标右键,然后选择 New => Module。(图 10)
      图 10. 创建新模块


    3. New Module 向导应该出现(图 11)。将该模块命名为 CreditApprovalSCAModule
      图 11. 创建新模块

    4. 现在,Business Integration 视图中应该显示一个新项目。SCA 模块是作为 SCDL 文件描述的。Business Integration 视图向您展示了 SCA 模块的逻辑视图。如前所述,您可以打开 Physical Resource 视图,来查看包含在 SCA 模块中的物理资源。SCA 模块的 SCDL 包含在名为 sca.module 的文件中。如果您使用文本编辑器打开该文件,应该看到以下内容:

      清单 8
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApprovalSCAModule"/>

 


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134