内容


使用 SoaML 与 XSD 转换概要文件设计 SOA 服务与模式定义

比 WSDL 更轻松,更结构化的方法

Comments

本文都讲了什么

面向服务架构(Service-Oriented Architecture,SOA)就是关于提供的和使用的服务。服务提供商和客户一般叫做 参与者。一个服务提供商会发布服务的描述,并提供服务的实施。服务消费者依赖这些描述来构建服务客户端,以调用和享用服务。因此,按照适当的方式来设计服务,对于一个 SOA 项目的成功来说十分重要。

使用 UML 来建模 Web 服务有三个主要的价值:

  1. 第一个价值是抽象掉所有不需要的枝节,例如 Web 服务描述语言(Web Services Definition Language,WSDL)及 XML 模式定义(XML Schema Definition,XSD)的语法,并关注 Web 服务的主要结构,包括 XML 模式的数据类型, Web 服务界面的操作,以及该界面与协议和末端的绑定。
  2. 第二个价值是提供一个标准的方法,它是一个 UML 模型,来与 SOA 项目的业务涉众和技术性团队交流 Web 服务的设计工作。通过 WSDL 和 XSD 文件与业务涉众交流 Web 服务的设计并不轻松,当 Web 服务的数量增加时,情况更加明显。
  3. 第三个价值在于更好地管理,并轻松地表达 Web 服务 WSDL 和 XSD 之间的关系,例如包含两个或者多个服务的组合服务中两者之间的关系。

这三个价值将会在本文展示的范例中进行演示。自从引入软件服务统一建模语言(UML)2.0 概要文件之后,描述服务的建模语言思想已经实现了。而现在该概要文件已经过时,并被面向服务架构建模语言(SoaML)UML 概要文件所替换。对象管理组(OMG)标准描述了 SOA 之中服务规格和设计的 UML 概要文件和元模型。本文会使用概要文件来设计 Web 服务界面(WSDL)。本文中使用到的其他概要文件是 XSD 转换 UML 概要文件,它为 XML 模式构件之中生成的 UML 构筑提供了构造型和属性。

IBM® Rational® Software Architect for WebSphere® 软件从 7.5.4 版本开始可以支持 SoaML。本文中所使用的范例是用 7.5.5 版本开发的。该软件为使用 SoaML 的设计服务工件提供了一系列丰富的工具和模型模板。

本文显示了设计一个 Web 服务的主要步骤,以及使用 XSD 及 SoaML 转换概要文件的 XML 信息模式:

  1. 普通的模式定义设计
  2. XML 模式定义设计
  3. 服务规格或者服务界面定义设计
  4. 服务绑定设计
  5. 转换配置
  6. 模型向 WSDL 和 XSD 的转换

首先,我们将会介绍本文中用于解释和应用的范例。

本文中的治理 SOA 范例

机构想要应用一个空白的治理服务站,来发布一些治理机构提供的服务。其他的治理机构可以使用这些服务。图 1 显示了范例的图表。

图 1. 政府 SOA 范例
ESB,服务提供商,以及消费者交流
ESB,服务提供商,以及消费者交流

机构拥有由所有治理机构所共享的一般模式。每个治理机构都可以是服务的提供商,或者其他服务的消费者。在范例之中会使用普通的名字以避免与真实名字的偶然性冲突。每一个治理机构都会提供一个服务,并拥有一个 XML 模式。出于简便性的考虑,范例将会涉及到创建带有 XML 模式和普通模式的服务。

我们将会从构建项目的空白结构开始。我们假设机构拥有构建 Web 服务的子系统。假设 Web 服务来展示该子系统的功能。一般来说,每个 Web 服务都拥有三个工件:

  • XML 模式或者 XSD
  • 界面定义的规格
  • 服务或者绑定

这就是为什么我们准备构建的文件夹结构简单地反映了这一点。

接下来的步骤显示了怎样创建 UML 项目,在本文中将会使用到该 UML 项目:

  1. 创建带有以下名字的 UML 项目:soaml_example。除了以下的设置,您可以保持向导的默认设置不变:
    1. Create Model 项目之中,确定选择了 Categories 窗格之中的 General 以及 Templates 窗格之中的 Blank Package,然后在文件名区域之中输入 gov_agency1_serviceModel,以为 Government Agency Service Provider 1 创建一个模型。
    2. Package Detail 项中,在 Package Type 之中选择 Model 并取消 Default Diagram 框架之中的 在新包中创建一个默认的图表 选择。
    3. Model Capabilities 项目之中,选中 Customize UI 并选择 ModelingUML Diagram Building BlocksUML Element Building Blocks,以及 XSD 转换概要文件,然后点击 Finish
  2. 按照下面的步骤对模型应用 SoaMLXSD 转换 UML 概要文件:
    1. 点击 gov_agency1_serviceModel 模型。
    2. 在 Properties 视图之中,点击 Profiles 项目。
    3. 点击 Add Profile,然后从 Deployed Profile 下拉菜单之中选择 SoaML
    4. 重复上面的步骤,来添加 XSD 转换 概要文件。

模型的 Properties 视图如图 2 所示。

图 2. Rational Software Architect 之中模型的 Properties 视图
Properties 视图的 UML 模型概要文件
Properties 视图的 UML 模型概要文件
  1. 右击模型并选择 Add UML > Package,创建一个名为 govSrvProvider1.gov 的包。
  2. 然后,删除默认创建的自由表格。
  3. 在该包的下面,创建名为 subSystem1 的另一个包。在该包下面,创建三个包:servicesspecifications,以及 xml
  4. 然后删除默认条件下由包创建的自由表格。
  5. 按照下面的步骤来创建以下的包:
    1. services 包的下面,创建一个名为 v1_0 的包。
    2. specifications 包的下面,创建一个名为 v1_0 的包。
    3. xml 包的下面,创建一个名为 schemas 的包。
    4. schemas 包的下面,创建一个名为 v1_0 的包,然后删除默认条件下由 schemas 包所创建的自由表格。
  6. 按照下面的操作对您在前面步骤中所创建的所有名为 v1_0 的包应用构造型模式:
    1. 点击包 v1_0
    2. Properties 视图之中点击 Stereotypes 项。
    3. 点击 Apply Stereotypes,然后从列表之中选择 schema
  7. 向模型导入 XSD primitive Data Types(您可以使用原始数据类型来利用原始类型,例如模式之中的字符串,整数以及浮动数):
    1. 右击 gov_agency1_serviceModel 模型,并选择 UML Properties
    2. 从左边框架之中选择 ElementImport,并点击右边窗格之中的箭头按钮。
    3. 在 Search 区域之中,输入 XSD 并选择 «modelLibrary» XSDDataTypes – XSDDataTypes

项目如图 3 所示。

图 3. 为机构提供商创建模型和包的项目
Project Explorer 视图之中的 SoaML 项目
Project Explorer 视图之中的 SoaML 项目
  1. 创建另一个模型 gov_commonSchema
  2. 在该模型之下,创建包 government.gov > commonTypes > xml > schemas > v1_0,并删除默认条件下由这些包创建的所有自由表,除了包 v1_0 创建的自由表之外。
  3. 对包 v1_0 以及模型 gov_commonSchema 重复第 6 到第 7 步。

项目如下面的图所示。

图 4. 为所有治理机构创建模型和包之后的项目
Project Explorer 视图之中的 SOAML 项目结构
Project Explorer 视图之中的 SOAML 项目结构

在一个真实的环境之中,为了更好的模型管理和治理,您可以在一个单独的项目之中创建普通的模式。但是,出于简便性的考虑,在该范例之中的项目做了一切安排。

提示:
不管是源控制管理的视角出发,还是从开发的视角出发,按照隔离数据模型,服务规格以及服务绑定的方式创建文件夹结构,都是最佳实践方式。同样,让版本号,v1_0,成为文件夹结构和名字区(简单地显示)的一部分,也是治理的最佳实践方式。

XML 模式定义设计

消息是在 Web 服务提供商和消费者之间传递的。信息由一系列拥有数据类型的元素组成。这些数据类型是在模式中定义的。在我们浏览范例之前,我们将会简单地介绍怎样创建任意模式的主要结构。如果您想要得到关于它的更多信息,那么您可以在 参考资料 之中查看 XML 模式转换概要文件链接。您可以使用 XSD 转换概要文件来将 UML 结构转换为模式定义。

简单的数据类型

对 XML 模式简单类型定义之中的 UML 类结果应用 «SimpleType» 构造型。通过对 XML 一般关系应用 «restriction» 构造型,可以对原始 XSD 数据类型实现简单类型的限制。您可以控制 Properties 视图之中 XSD SimpleType 项目内 XSD 简单类型的限制属性。原始数据类型可以导入到前面创建项目和模型步骤之中的模型。控制简单数据类型属性的范例,在 EmailAddressType 简单类型之中,模板值会设置为以下内容,如下面的图所示:

[0-9A-Za-z'\.\-_]{1,127}@[0-9A-Za-z'\.\-_]{1,127}
图 5. UML 之中的 XSD 简单类型
XSD 简单类型的类图

在转换为 XSD 时,该图如代码清单 1 中的代码所示。

清单 1. XML 之中的 XSD 简单类型
<xsd:simpleType name="EmailAddressType">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[0-9A-Za-z'\.\-_]{1,127}@[0-9A-Za-z'\.\- _]{1,127}"/>
    </xsd:restriction>
  </xsd:simpleType>

枚举

枚举是简单类型的特殊类型。当枚举定义的简单类型使用常数的特殊列表时,就会需要这种类型了。枚举类型的一般范例如下面的图所示。

图 6. UML 之中的 XSD 枚举
XSD 枚举类型的类图
XSD 枚举类型的类图

在转换为 XSD 时,如接下来的代码所示。

清单 2. XML 之中的 XSD 枚举
<xsd:simpleType name="GenderType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="MALE"/>
      <xsd:enumeration value="FEMALE"/>
    </xsd:restriction>
  </xsd:simpleType>

复杂的数据类型

为了创建一个复杂的类型,必须对 UML 类(见于接下来的图)应用一个 «complexType» 构造型。复杂类型的属性可以在 Properties 视图的 XSD Complex Type 项目之中控制。您可以向 UML 类添加带有 «element» 构造型的属性,来向复杂类型添加元素。这些属性要么直接由原始 XSD 数据类型添加,要么与特定用户模式之中定义的其他类型相联系。

注意:
元素的 minOccurs 属性可以通过设置属性的 Multiplicity 来指定。

图 7. UML 之中的 XSD 复杂类型
XSD Complex Type 的类图
XSD Complex Type 的类图

代码清单 3 显示了该模型。

清单 3. XML 之中的 XSD 复杂类型
<xsd:complexType name="PersonInfoType">
    <xsd:sequence>
      <xsd:element name="ID" type="xsd:string"/>
      <xsd:element name="personName" type="xsd:string"/>
      <xsd:element minOccurs="0" name="emailAddress" type="govxsd:EmailAddressType"/>
      <xsd:element name="gender" type="govxsd:GenderType"/>
    </xsd:sequence>
  </xsd:complexType>

普通模式定义

普通模式定义了 SOA 项目之中所有参与者所共享的 XSD 数据类型,因此也就定义了该范例中所有其他治理机构之中的数据类型。普通模式有一个主要的优势,那就是在特定的服务提供商之外定义所有普通的数据类型。它支持对普通类型有更多的控制和治理,并将服务提供商的模式之间的联系最小化。但是,普通模式也有一个主要的劣势:对普通模式的任何更新都需要相互关联的所有服务参与者保持同步化。在 UML 之中创建模式只是创建一个类图,并应用适当的构造型,如上所述。接下来的图描述了文中范例演示的普通范例。

图 8. XSD 普通模式范例
SoaML 范例 XSD 普通模式的类图
SoaML 范例 XSD 普通模式的类图

注意:
您可以在 Properties 视图的 XSD Schema 内得到完整系列的模式属性。在范例之中,只有三个属性会得到设置,如下面的图所示。

图 9. XSD 模式属性
Properties 视图的普通 XSD 模式项目
Properties 视图的普通 XSD 模式项目

按照下面的步骤来更改这些属性:

gov_commonSchema 项目之下,government.gov > commonTypes > xml > schemas > v1_0 之下选择模式 v1_0,并在 Properties 视图之中的 XSD Schema 项中设置属性:

  1. Element from Default 设置为 qualified
  2. Target Namespace 设置为 urn:government.gov/commonTypes/xml/schemas/v1_0/
  3. Target Namespace Prefix 设置为 govxsd

提示:
让 Target Namespace 遵循模式相同的包结构,是一种不错的实践方式。同样,您可以通过 Properties 视图的 Documentation 项,来向模式之中的模式或者元素添加文献。项目结构的模式模型如下面的屏幕截图所示。

图 10. Project Explorer 之中的普通模式模型视图
目录(树形视图)视图
目录(树形视图)视图

Web 服务 XML 模式定义设计

现在是时候开始处理 Web 服务工件了。一般情况下,该活动从 Web 服务模式定义开始,然后要创建 Web 服务 WSDL 定义或者 Web 服务界面,最后,创建 Web 服务 WSDL 绑定。本文中所演示的 Web 服务,是由 Government Agency Service Provider 1 所提供的 Web 服务提供商,主要是为了确认一个人的出生日期。该服务的模式在接下来的图中进行了描述。

图 11. Government Agency 1 的 XSD 模式,服务范例
范例之中机构 XSD 的类图
范例之中机构 XSD 的类图

图 11 的大图

创建 UML 形式的模式,就是创建一个应用适当构造型的类图。在开始处理普通模式定义之前,您需要设置模式的三个属性。

  1. 为了更改这些属性,您可以在 gov_agency1_serviceModel 项目之中,govSrvProvider1.gov > subSystem1 > xml > schemas > v1_0 之下,点击 v1_0 schema 并在 Properties 视图之中的 XSD Schema 中设置这些属性:
    1. Element from default 设置为 qualified
    2. Target Namespace 设置为 urn:govSrvProvider1.gov/subSystem1/xml/schemas/v1_0/
    3. Target Namespace Prefix 设置为 govprv1xsd

Web 服务规格设计

现在,是时候构建 Web 服务的 WSDL 界面定义了。分割 Web 服务界面定义是较好的,它是来自 Web 服务 WSDL 绑定 WSDL 端口类型的。绑定定义了操作和信息的信息格式具体内容。除了分开关注之外,将 WSDL 端口类型与两个文件之中的 WSDL 绑定隔离开来,支持给定端口类型下任意数量的绑定。接下来的步骤显示了怎样在 UML 之中创建一个 Web 服务 WSDL 端口类型。

  1. govSrvProvider1.gov > specifications > v1_0 之下,打开 Main 自由表
  2. 为了添加一个 Web 服务界面,您可以从 Palette 的 Service 托盘之中,点击 服务界面(简单),并点击图表。然后将其命名为 BirthCertificateInfo
  3. 向该界面添加一个操作,就像向一个 UML 界面添加任意的操作,然后将其命名为 getBirthCertById
  4. 为您刚刚创建的操作创建信息。信息的目的在于向请求信息和响应信息中的操作集成输入或者输出参数。
    1. 从 Palette 的 Class 托盘之中,点击 Stereotyped Class 并点击图表。然后从下拉菜单之中选择 Create «MessageType» Class,并并将其命名为 getBirthCertByIdRequest
    2. 重复上述的步骤来创建名为 getBirthCertByIdResponse的另一条信息。
    3. 向 getBirthCertByIdRequest 添加一个 attribute,并将其命名为 ID。将其类型设置为 string,然后向它添加 «element» 构造型。
    4. getBirthCertByIdResponse 添加一条属性,并将其命名为 birthcertificate。并在服务的模式之中将其类型设置为 BirthCertificate,并向其添加 «element» 构造型。
  5. 在 Properties 视图的 Operations 项中,点击您刚刚创建的界面。
  6. 点击 Owned Parameter 按钮,当一个弹出窗口打开时,您可以点击 Insert New Parameter 按钮三次,以添加三个参数。
    1. 首个参数是对参数的 input 参数。对于首个参数,将其名字更改为 Id,并将其类型设置为 getBirthCertByIdRequest,您可以在 Search 区域中输入来完成该操作。提示: 您可能需要向右切换以设置该参数的属性。
    2. 第二个参数是操作的 output 参数。将其名字更改为 birthCert,在 Search 区域之中将其 Direction 设置为 Return,然后将其 Type 设置为 getBirthCertByIdResponse提示: 您可能需要切换以查看该参数的属性。
    3. 第三个参数是操作的 exception 。将其名字更改为 fault,将其 Direction 设置为 Return,将 Exception 设置为 true,然后点击 Browse 并选择 government.gov > commonTypes > xml > schemas > v1_0。将参数类型设置为 ExceptionType
  7. 选择 govSrvProvider1.gov > xml > schemas,然后点击 v1_0 模式以在 Properties 视图中 XSD Schema 设置以下的属性:
    1. Element from Default 设置为 qualified
    2. Target Namespace 设置为 urn:govSrvProvider1.gov/subSystem1/specifications/v1_0/
    3. Target Namespace Prefix 设置为 srvspc1xsd

然后 Web 服务界面如下面的图所示。

图 12. Web 服务 WSDL 界面 UML 范例
范例机构 WSDL 界面的类图
范例机构 WSDL 界面的类图

Web 服务界面现在已经完成了,这样您就可以定义该界面的绑定了。

Web 服务绑定设计

现在是时候为 Web 服务的 WSDL 界面指定绑定了。绑定会引用它绑定的端口类型。按照下面的步骤来在该范例之中添加一个绑定。

  1. 选择 govSrvProvider1.gov > services > v1_0,打开 Main 自由图表。
  2. 从 Palette 中的 Service 托盘内,点击 Participant 然后点击图表。将其命名为 BirthCertificateInfoService
  3. 在 Project Explorer 之中,右击 «Participant» BirthCertificateInfoService 并选择 Add Service Modeling > Service Point。 然后点击 Select Existing Element 并搜索 «ServiceInterface»BirthCertificateInfo,然后选择它。在此之后,将其命名为 BirthCertificateInfoPort

Web 服务 WSDL 绑定构件如下面的图所示。

图 13. 绑定 UML 范例的 Web 服务 WSDL
WSDL 绑定机构的类图

在 Web 服务的 UML 模型就绪之后,就是时候将该 UML 模型转换为 WSDL 和 XSD 工件了。为了实现这一点,您需要创建一个转换配置。

转换配置

您最好有两个不同的转换配置:一个对 WSDL,一个对 XSD。这就对 WSDL 和 XSD 提供了更好的变更管理。例如,大多数时间内,模式会产生一些变化,然后 XSD 会产生一些更新,而 WSDL 却不会产生任何的改变。所以,对本例来说,您将会创建三个转换配置文件:

  • 一个对普通模式 UML 到 XSD 的转换
  • 另一个对治理机构 UML 到 XSD 的转换
  • 最后一个对治理机构 UML 到 WSDL 的转换

UML 到 XSD 的转换配置

从为一般模式创建 UML 到 XSD 转换配置的步骤开始:

  1. 右击项目并选择 New > Folder,创建一个文件夹,并将其命名为 New > Folder。该文件夹包含了生成的 WSDL 和 XSD 文件。
  2. 为了创建一个转换配置,在菜单之中点击 Modeling > Transform > New Configuration。将其命名为 gov_commonSchema_uml2xsdV1_0,并从面向服务架构转换文件夹之中,Transformation 菜单之中选择 UML to XSD。然后,点击 Next
  3. Selected source 菜单的 Source 和 Target 窗格之中,从 gov_commonSchema>government.gov>commonTypes>xml>schemas 之中选择 «schema» v1_0。接下来,在 Selected target 菜单之中选择 WSDL 文件夹。然后点击 Finish。gov_commonSchema_uml2xsdV1_0.tc 文件会得到创建和打开。
  4. 在 Main 项中,Merge options 内,选择 不要合并:覆盖任意文件之前进行警告 选项。
  5. 在 Output Options 项中,在表格的 File Name 之中选择 v1_0。然后,取消 Add suffix 复选框的选择,并在 Add prefix 区域内,输入 commonSchema,这样文件名就会是 commonSchema_v1_0。点击桌面图标或者点击 Control + s 以保存文件。

对适当的源和目标重复上述的步骤,以为治理机构的服务模式创建一个名为 gov_agency1Schema_uml2xsdV1_0.tc 的转换配置,一个名为 govAgency_srvSchema_v1_0 的模式文件。

服务转换配置

现在,让我们为服务本身创建一个转换配置:

  1. 在菜单之中点击 Modeling > Transform > New Configuration。将配置命名为 gov_agencyPrv_Srv1_uml2wsdlV1_0并从 Service Oriented Architecture Transformations 文件夹的 Transformation 菜单之中,选择 UML to WSDL。然后点击 Next
  2. 从 Source 及 Target 窗格中的 Selected source 菜单中,gov_agency1_serviceModel>govSrvProvider1.gov>subSystem1>services>v1_0 内,选择 «Participant» BirthCertificateInfoService.. 接下来选择 Selected target 菜单之中的 WSDL 文件夹。然后点击 Finish。gov_agencyPrv_Srv1_uml2wsdlV1_0.tc file is created and opened.
  3. 在 Main 项中,Merge options 内,选择 不要合并:覆盖任意文件之前进行警告
  4. 在 Output Options 项之中,做以下的操作:
    1. 在表格的 File Name 列中选择 BirthCertificateInfoService,取消 Add prefix 复选框的选择,并在 Add suffix 区域之中,输入 _v1_0
    2. 在与规格相关表格的 File Name 之中选择 v1_0。然后取消 Add suffix 复选框的选择,并在 Add prefix 区域之中,输入 BirthCertificateInfo,所以文件夹应该是 BirthCertificateInfo_v1_0。
    3. 在与 subsystem/xml/schema 相关表格的 File Name 列之中选择 v1_0。然后取消 Add suffix 复选框的选择,并在 Add prefix 区域之中,输入 govAgency_srvSchema,这样文件名将会是 govAgency_srvSchema_v1_0。
    4. 在与 commonTypes 相关表格的 File Name 列之中选择 v1_0。然后取消 Add suffix 复选框的选择,并在 Add prefix 区域之中,输入 commonSchema,这样文件名将会是 commonSchema_v1_0。点击桌面图标,或者点击 Control + s 以保存文件。

Project Explorer 之中的 Web 服务现在如接下来的图所示。

图 14. Government Agency 1 服务范例 Project Explorer 视图
目录(树形视图)屏幕截图
目录(树形视图)屏幕截图

将 Web 服务模型转换为 WSDL 及 XSD

在服务工件之前转换一般模式,是可以的,因为后者依赖于前者。所以,您可以按照下面的步骤来将模型转换为 WSDL 和 XSD 文件:

  1. 如果尚未打开就打开 gov_commonSchema_uml2xsdV1_0
  2. 点击 Run 按钮。

一个名为 commonSchema_v1_0.xsd 的文件,以及文件夹结构 government > gov > commonTypes > xml > schemas > v1_0, 将会得到创建。

按照与 gov_agency1Schema_uml2xsdV1_0.tcgov_agencyPrv_Srv1_uml2wsdlV1_0.tc 相类似的步骤,来分别创建 BirthCertificateInfo_v1_0.wsdl 及 BirthCertificateInfoService_v1_0.wsdl。

注意:
再次运行转换配置将会让您替换输出文件,因为在创建转换配置的 Merge options 步骤之中,您选择了 不要合并:覆盖任意文件时都要警告 选项。

总结

使用一个范例,本文演示了通过 SoaML 和 XSD 转换 UML 概要文件为 SOA 项目设计 Web 服务和模式定义的典型方法。想要以从顶到底的方式构建 Web 服务的构造师和开发员可以使用这种方法,使用 UML,并从 XML 的具体内容之中抽象出来。现在您知道了建模一个 Web 服务及其数据模型所需要的步骤。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=761364
ArticleTitle=使用 SoaML 与 XSD 转换概要文件设计 SOA 服务与模式定义
publish-date=09262011