服务映射简介: 将不断演化的 Web 服务集成到 WebSphere Application Server V8.5.5 中

SOA 和 Web 服务在不断演化 - 不断部署新的服务版本,或者全新的服务必须与现有客户端相集成。通常,必须扩大开发工作才能确保 Web 服务客户端能够继续与 Web 服务提供程序协同工作。IBM® WebSphere® Application Server V8.5.5 和 IBM Rational® Application Developer V9.0 引入了服务映射,该功能通过服务客户端与服务提供程序之间的请求和响应拦截、路由和转换,帮助您消除服务客户端对服务提供程序的位置和接口的依赖。本文将介绍服务映射的概念,并提供一个实用的示例,展示原始服务客户端如何通过开发和使用服务映射技术,调用一个服务提供程序的多个版本。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

Andrew Borley, 软件开发人员, IBM

Andrew Borley 领导着英国 IBM 赫斯利软件实验室的 WebSphere ESB Development 团队。他自 2007 年开始在 WebSphere ESB 团队工作,在这之前,曾在 Apache Tuscany 工作过,研究过各种面向服务的体系结构项目。



2014 年 3 月 13 日

简介

在许多场景中,演化和变革影响着面向服务的架构 (SOA) 和它们依赖的 Web 服务。例如,可能推出了一个服务提供程序的新版本,提供了对现有功能的扩展或全新的功能。在推出新版本后,依赖于该服务提供程序的服务客户端可能必须更新,或者必须继续支持该服务提供程序的原始版本。作为第二个例子,一家企业中的一次收购或重组可能意味着,想要使用新推出的服务提供程序的现有服务客户端发现客户端和提供程序使用的接口不匹配。

服务映射对这些场景有所帮助,它将使用服务的应用程序与该服务提供程序的接口或位置的细节隔离开。实现此目的的方式是,提供一种简单方式来执行基于内容的路由和消息转换,这些操作可应用于从服务客户端发出的 Web 服务消息,无需更改服务客户端或服务提供程序。

在一个服务客户端与一个可能位于不同位置或可能具有不同接口的服务提供程序进行交互时,必须解决几个考虑因素:

  • 您将一条消息路由到哪个服务位置?
  • 在处理来自一个服务使用者的请求时,应在服务提供程序上调用哪个操作?
  • 对于任何具体的操作,需要多大程度地转换每条输入、输出和错误消息?

在 IBM WebSphere Application Server V8.5.5 之前,服务客户端仅在它配置了服务提供程序的端点地址并使用相同的服务规范时,才会将消息发送给该服务提供程序。要将请求发送到不同的服务提供程序,服务客户端必须手动重新配置新地址。如果服务提供程序的规范不同,那么通常需要更新服务客户端才能让服务客户端符合新规范。

在图 1 中,服务客户端配置为与服务提供了程序交互。如果打算引入一个新的服务提供程序,服务客户端必须手动重新配置才能将请求发送到新的服务提供程序。

图 1. 静态 Web 服务路由
静态 Web 服务路由

WebSphere Application Server V8.5.5 引入了服务映射的概念,它支持将服务客户端与服务提供程序之间的交互拆开。服务映射功能支持拦截、转换请求和响应并路由到其他服务提供程序。

如图 2 所示,服务映射包含以下两个对象:

  • 一个服务映射,定义请求和响应如何路由和转换。
  • 一个本地映射服务,拦截服务客户端与服务提供程序之间的请求和响应。
图 2. 包含路由和转换的服务映射
包含路由和转换的服务映射

服务映射

服务映射是一个可部署的工件,包含在服务客户端与服务提供程序之间转换和路由请求和响应所需的定义。服务映射使用 IBM Rational Application Developer V9.0 中的服务映射编辑器来开发,依赖于定义原始来源 Web 服务提供程序和新的目标 Web 服务提供程序的接口和端点的 WSDL(Web Service Definition Language,Web 服务定义语言)文档。在开发服务映射的过程中,会创建转换映射,以定义如何在来源服务接口与目标服务接口之间转换消息。

创建转换映射之后,服务映射和它依赖的文件会从 Rational Application Developer 导出到一个服务映射库,这是一个包含后缀 .slibzip 的压缩文件。服务映射库然后部署到 WebSphere Application Server 运行时,在这里可以安装库中的任何服务映射,然后将它附加到一个本地映射服务。


本地映射服务

本地映射服务拦截服务客户端与服务提供程序之间的请求和响应,在 WebSphere Application Server 中管理性地创建和配置。本地映射服务使用一个服务提供程序端点来定义,在完成配置之后,它会拦截发往这个特定服务提供程序的所有调用,无论哪个服务客户端发起该调用。一个本地映射服务可附加一个服务映射,这意味着在拦截请求时,该服务映射会应用到消息上。在这种情况下,服务映射用于选择一个服务提供程序,然后转换消息以与所选的服务提供程序的接口进行匹配。如果本地映射服务没有与之关联的服务映射,则会调用最初的服务提供程序。

启动和停止本地映射服务

本地映射服务可启动和停止,它支持调用服务提供程序来实现管理性控制。在首次创建并且没有将它附加到服务映射时,本地映射服务的默认状态为 started。这意味着新创建的本地映射服务允许任何活动的 Web 服务客户端继续向其关联的 Web 服务提供程序发送消息;本地映射服务将拦截这些消息,但不会对它们执行任何操作。在服务映射附加到本地映射服务时,本地映射服务的状态可能改变,具体取决于服务映射本身的状态。表 1 显示了本地映射服务的可能状态和这些状态对 Web 服务请求有何影响。

表 1. Web 服务请求在被本地映射服务拦截时的行为
本地映射服务状态服务映射附加状态Web 服务请求行为
Started服务映射未附加请求被继续发送到服务客户端指定的最初的目标服务
Stopped服务映射未附加请求失败并向服务客户端返回一个错误
Started服务映射已附加向请求和任何响应应用服务映射中定义的路由和转换
Stopped服务映射已附加请求失败并向服务客户端返回一个错误
Unknown附加了服务映射,但服务映射还未保存到主要配置中请求被继续发送到服务客户端指定的最初的目标服务

从本地映射服务发出的事件

本地映射服务支持您在服务请求和响应被拦截时发出事件,支持监视 WebSphere Application Server 中的应用程序发出的 Web 服务客户端调用。在本地映射服务配置为发出事件时,事件会使用一个指定的 JMS 提供程序发布到一个 JMS 主题,可包含有关拦截的消息的详细信息。JMS 主题的订户可使用此事件信息监视其系统的业务状态。作为一个示例,事件可发送到 IBM Integration Bus 数据捕获存储区,并在 IBM Integration Bus Web 用户界面中进行查看。

要支持本地映射服务发出事件,必须在本地映射服务上管理性地配置一个事件点。事件点确定了要包含在事件中的细节,一个事件何时将发出,以及事件将发布到何处。


一个服务版本场景

举例而言,假设您有一项提供车辆管理服务的业务。具体而言,您提供一个基于 SOAP 的 Web 服务,向它提供客户 ID 后,它就会提供有关客户及其车辆的信息。各种客户端使用该 Web 服务,具体地讲,一个应用程序提供了该 Web 服务的一个简单的 Web 前端。

再现这个示例所需的文件包含在本文的 下载 部分中。

最近的一次收购意味着将会开发该 Web 服务的一个新版本,提供最初的服务的一个更新版本。无需重新开发 Web 前端客户端,您就可以使用服务映射将客户端调用重新路由到新提供程序,转换发送和接收的消息。

先决条件

要部署本文中提供的示例,您需要:

  • 安装了完整的配置文件(不是 Liberty 配置文件)的 IBM WebSphere Application Server V8.5.5 或更高版本。
  • IBM Rational Application Developer V9.0 或更高版本。安装 Rational Application Developer 时,确保启用了服务映射工具功能。您还可以使用 IBM Installation Manager 修改现有的 Rational Application Developer 安装。

本文中的操作说明基于一个 Application server(非连锁的)WebSphere Application Server 配置文件。如果使用了一个包含单独的部署管理器和连锁的服务器的配置文件,那么您可能需要使用与本练习中提供的不同的服务器名称和端口号,可能还需要在使用 Integrated Solutions Console 时同步节点。


开始

我们首先看看最初的应用程序。这个应用程序提供了 Web 前端(使用一个 Java™ servlet 实现),该前端使用一个 Web 服务客户端调用 Web 服务提供程序的版本 1。在 WebSphere Application Server 中安装并启动 DevWorksCars.ear 企业应用程序后(如果不熟悉 WebSphere Application Server 上安装企业应用程序,请按照下一节中的说明进行操作),在您的浏览器中访问应用程序地址 http://localhost:9080/DevWorksCarsWeb/DevWorksCarsClient(您的服务器名称和端口号可能有所不同,具体情况取决于您的 WebSphere Application Server 实例的设置),您会看到 DevWorksCars 应用程序的 Web 前端,类似于图 3。

图 3. 初始 DevWorksCars 应用程序
初始 DevWorksCars 应用程序

该 Web 服务提供程序实现包含一个简单的客户数据库。如果在 Customer ID 字段中键入值 1A 并单击 Submit 按钮,您会收到一些作为响应的数据,类似于图 4。Web 前端还支持您在 Version1 Service URL 字段中指定 Web 服务提供程序的版本 1 的端点地址;这是 Web 服务客户端用于调用 Web 服务提供程序的版本 1 的地址。根据您的 WebSphere Application Server 实例,您可能需要更新地址中的服务器名称和端口号。

图 4. 从 Web 服务提供程序的版本 1 获取的客户和服务信息
从 Web 服务提供程序的版本 1 获取的客户和服务信息

Service information 是附加的信息,用于告诉您服务进展状况。在最初的情况下,过程很简单:Web 浏览器将客户 ID 和服务 URL 发送到 Web 服务前端,后者在 Web 服务客户端中使用该信息调用 Web 服务提供程序的版本 1,Web 服务提供程序返回会在 Web 浏览器上显示的数据。

可用于 Web 服务的版本 1 的其他客户 ID 包括:1B1C。如果尝试其他任何客户 ID,您会看到一条 Customer ID was not found 错误消息。


安装示例应用程序

  1. 下载 本文中包含的所有文件。
  2. 确保您的 WebSphere Application Server 实例已启动。
  3. 在浏览器中访问 http://localhost:9060/ibm/console/login.do,以便转到 WebSphere Application Server Integrated Solutions Console(取决于您的 WebSphere Application Server 实例,服务器名称和端口号可能有所不同)。如果开启了管理安全,请先登录。
  4. 展开 Applications > New Application.> New Enterprise Application
  5. 单击 Choose File 按钮并从文件选择对话框中选择(您已下载的)DevWorksCars.ear 文件。单击 Open
  6. 单击 Next
  7. 单击 Next 选择应用程序安装的快速路径。
  8. 在接下来的一些页面中接受所有默认设置,单击 Next,直到到达摘要页面,然后单击 Finish
  9. 然后我们将安装 DevWorksCars 应用程序。单击 Save 保存 WebSphere Application Server 主要配置。
  10. 展开 Applications > Application Types > WebSphere enterprise applications。您会在企业应用程序列表中看到 DevWorksCars
  11. 选择 DevWorksCars 应用程序旁边的复选框,然后单击 Start 启动该应用程序。

Web 服务提供程序的新版本

除了 Web 服务提供程序的版本 1 之外,DevWorksCars 应用程序还包含 Web 服务提供程序的版本 2,这两个版本只有细微区别。这两个服务都使用 WSDL 文档进行了描述。将 DevWorksCars 应用程序导入 Rational Application Developer 中并检查这两个 WSDL 文件:

  1. 启动 Rational Application Developer。如果 Rational Application Developer 启动并显示了欢迎页面,那么请转到 Workbench。
  2. 如果 Java EE 透视图未打开,则导航到 Window > Open Perspective > Other…,选择 Java EE 透视图并单击 OK 来打开它。
  3. 选择 File > Import… 打开 Import 对话框,以便导入 DevWorksCars 应用程序。选择 General > Existing Projects into Workspace 并单击 Next
  4. 选择 Select archive file,单击 Browse...,在文件选择对话框中选择(您下载的)DevWorksCarsSrc.zip 文件,然后单击 Open 按钮。
  5. 确保已在 Import 对话框的 Projects 部分中选中这两个项目,单击 Finish
  6. 您可能需要完成 Workspace Migration 对话框。接收每个对话框页面上的默认设置,单击 Next 按钮,直到可以单击 Finish 按钮。
  7. 打开两个不同的 WSDL 文件,方法是展开 DevWorksCarsWeb 项目,展开 WebContent/WEB-INF/wsdl 文件夹,然后双击 DevWorksCarsV1.wsdl 文件和 DevWorksCarsV2.wsdl 文件。

DevWorksCars 服务的版本 1 应类似于图 5,包含一个 getCarInfo 操作、一个输入、一个输出和一条错误消息。

图 5. DevWorksCarsV1.wsdl 文件
DevWorksCarsV1.wsdl 文件

如果将鼠标悬停在 InfoReturn 类型旁边的箭头上(已在图 5 中突出显示),类型结构会显示在一个悬停帮助窗口中,如图 6 所示。

图 6. InfoReturn 类型的版本 1
InfoReturn 类型的版本 1

可以看到,InfoReturn 类型的版本 1 拥有命名空间 http://example.ibm.com/DevWorksCarsV1/,并包含独立的 CustomerInfo 和 CarInfo 结构。

DevWorksCars 服务的版本 2 类似于图 7,版本 1 中的 getCarInfo 操作已更新为版本 2 中的 getInfo 操作,而且在缺少一位客户的车辆登记信息时,版本 2 拥有一条额外的错误消息。

图 7. DevWorksCarsV2.wsdl 文件
DevWorksCarsV2.wsdl 文件

如果将鼠标悬停在 InfoReturn 类型旁边的箭头上(已在图 7 中突出显示),版本 2 的类型结构会显示在一个悬停帮助窗口中,如图 8 所示。

图 8. InfoReturn 类型的版本 2
InfoReturn 类型的版本 2

可以看到,InfoReturn 类型的版本 2 拥有命名空间 http://example.ibm.com/DevWorksCarsV2/ 并包含一组不同的结构;具体而言,CustomerInfo 结构现在包含 CarInfo 结构。

这两个服务很接近,但不匹配,表明基于服务提供程序的版本 1 的客户端发送和接收的 SOAP 消息无法被服务提供程序的版本 2 理解。这意味着需要重写您的 DevWorksCars 应用程序的 Web 前端才能使用版本 2 的 Web 服务客户端,才能调用 Web 服务提供程序的版本 2。

要让 Web 服务提供程序的版本 2 适用于版本 2 的 Web 服务客户端,一种更简单的方法是使用服务映射。接下来的几节介绍如何创建一个服务映射,在两个版本之间建立映射,如何创建一个本地映射服务来拦截版本 1 的 Web 服务调用,然后安装服务映射并将它附加到本地映射服务,以便将版本 1 的消息重新路由并转换到 Web 服务提供程序的版本 2。


创建服务映射

您将使用 Rational Application Developer 创建一个服务映射,以便定义两个服务版本之间的映射。创建一个服务映射库,创建服务映射,然后为请求、响应和错误消息创建消息映射:

  1. 在 Rational Application Developer 中,导航到 File > New > Other...。在 New 对话框中,展开 Service Map 并选择 Service Map Library。您可能需要勾选 Show All Wizards 复选框来查看 Service Map 选项。如果仍未看到 Service Map 选项,可能服务映射工具功能未安装在您的 Rational Application Developer 实例中。如果是这种情况,可以使用 IBM Installation Manager 修改 Rational Application Developer 安装。
  2. 单击 Next
  3. 将 Service map library name 设置为 DevWorksCarsServiceMapLibrary,保留位置的默认设置,单击 Finish 按钮。创建了一个新的服务映射库。
  4. 右键单击新创建的服务映射库并选择 Service Map > Service Map,如图 9 中所示。
    图 9. 在服务映射库中创建一个新的服务映射
    在服务映射库中创建一个新的服务映射
  5. New Service Map 对话框将会打开。将 Service map name 字段设置为 DevWorksCarsRouteToV2.srvcmap,如图 10 中所示。单击 Next 按钮。
    图 10. New Service Map 对话框,第一页
    New Service Map 对话框,第一页
  6. 单击 Browse... 选择一个来源服务 WSDL 文件。这个 WSDL 描述了您想要拦截其调用的最初的(版本 1)服务。打开嵌套的目录,直到打开 DevWorksCarsWeb/WebContent/WEB-INF/wsdl 目录,然后选择 DevWorksCarsV1.wsdl 文件。单击 OK。其他字段已自动填充。如果来源 WSDL 拥有多个端口类型或绑定,可在这个对话框中选择您想要映射的端口类型和绑定。DevWorksCarsV1.wsdl 文件仅有一个端口类型和绑定,所以完成的对话框页面将类似于图 11。单击 Next
    图 11. 在 New Service Map 对话框中选择来源服务
    New Service Map 对话框,第一页
  7. 单击 Browse... 选择一个目标服务 WSDL 文件。这个 WSDL 描述您想要将调用路由到的新(版本 2)服务。再一次打开嵌套的目录,直到打开 DevWorksCarsWeb/WebContent/WEB-INF/wsdl 目录,这一次选择 DevWorksCarsV2.wsdl 文件。单击 OK。其他字段已自动填充。将 Service Name 字段设置为 targetV2。如果 Endpoint address 字段中的服务器名称和端口号不正确,则勾选 Override defaulst endpoint address 复选框,将 Endpoint address 字段修改为您的版本 2 服务的 URL。检查是否拥有正确的 URL 的一种快捷方式是,在 Web 浏览器中访问该地址(例如单击 http://localhost:9080/DevWorksCarsWeb/DevWorksCarsV2);如果该地址上有一个 Web 服务,您的浏览器应显示 Hello!This is an Axis2 Web Service! 消息。完成的对话框页面将类似于图 12。单击 Finish 按钮创建服务映射文件。
    图 12. 在 New Service Map 对话框中选择目标服务
    New Service Map 对话框,第一页
  8. 将打开服务映射编辑器。您会看到 sourcetargetV2 服务和每个服务拥有的单一操作:分别为 getCarInfo 和 getInfo。要在这两个操作之间建立映射,可将鼠标悬停在 getCarInfo 操作上时会出现映射手柄。单击该手柄并将连接拖到 targetV2 服务上的 getInfo 操作。将建立一个新的 Operation Map 连接,服务映射编辑器的 Operation Map 部分将显示两个操作和它们的请求、响应及错误消息,以及请求和响应消息之间的初始 Data Map 连接。
  9. 在两个操作的错误消息之间创建 Data Map 连接:将鼠标悬停在 getInfo fault1 消息上方会出现拖动手柄。单击该手柄并将连接拖到 getCarInfo 错误消息。将创建一个新的 Data Map 连接。对 getInfo fault2 消息重复该过程,以便 fault1 和 fault2 消息都被映射到 getCarInfo 错误消息,这意味着如果该服务的版本 2 返回 fault1 或 fault2 消息,Web 服务客户端的版本 1 将收到一条 getCarInfo 错误消息。服务映射编辑器现在应类似于图 13。
    图 13. 服务映射编辑器,其中包含一个新的操作映射,以及请求、响应和所有错误消息的消息映射
    服务映射编辑器,其中包含一个新操作映射,以及请求、响应和所有错误消息的消息映射
  10. 选择 File > Save 保存该服务映射。
  11. 为请求消息创建一个数据映射转换,方法是右键单击 getCarInfoRequestgetInfoRequest 消息之间的 Data Map 连接并选择 Show In > Properties View。Properties 视图将会打开。单击 Properties 视图中的 New… 按钮将会打开 New Data Map 对话框。接受新数据映射文件的默认名称和位置,然后单击 Finish
  12. 将打开数据映射编辑器。您在数据映射编辑器的输入和输出端都应看到 ServiceMapMessage。展开输入 ServiceMapMessage 的 Body 部分,您会看到输入请求消息元素,也就是 getCarInfo。展开 getCarInfoRequestInfo 以显示输入消息中的 CustomerId 字段。在输出端,展开 BodygetInfoRequestInfo,以显示输出消息的 CustomerId 字段。将鼠标悬停在一个 CustomerId 字段上会出现一个手柄。单击该手柄并将连接拖到另一个 CustomerId 字段,以便创建一个 Move 连接。这将从 getCarInfo 请求消息(它具有命名空间 http://example.ibm.com/DevWorksCarsV1/)映射到 getInfo 请求消息(它具有命名空间 http://example.ibm.com/DevWorksCarsV2/),如图 14 所示。如果想要映射 SOAP 标头、HTTP 传输标头,或者使用上下文信息(比如来源和目标操作名称),您可以通过 ServiceMapMessage 结构中的其他部分访问这些信息。对于本例,您无需这么做,所以请保存请求数据映射文件并关闭数据映射编辑器。
    图 14. 完成的请求消息数据映射编辑器
    完成的请求消息数据映射编辑器
  13. 在服务映射编辑器中对 getCarInfoResponsegetInfoResponse 消息之间的 Data Map 连接执行第 11 步中的相同操作,为响应消息创建一个数据映射。
  14. 在打开响应消息的数据映射编辑器后,完全展开输入和输出 ServiceMapMessages 的 Body 部分,执行第 12 步中的相同操作,在以下字段之间创建 Move 连接:
    • CustomerInfo > Id to CustomerInfo > Id
    • CustomerInfo > Name to CustomerInfo > Name
    • CustomerInfo > Car > Make to CarInfo > Make
    • CustomerInfo > Car > Model to CarInfo > Model
    • CustomerInfo > Car > EngineSize to CarInfo > EngineSize
    • CustomerInfo > Car > Colour to CarInfo > Colour
    • CustomerInfo > Car > Registration to CustomerInfo > CarRegistration
    • ServerInfo > ServerId to ServerInfo > ServerId
    • ServerInfo > Version to ServerInfo > Version

    完成的数据映射将类似于图 15。保存响应数据映射文件并关闭数据映射编辑器。

    图 15. 完成的响应消息数据映射编辑器
    完成的响应消息数据映射编辑器
  15. 在服务映射编辑器中重复第 11 步和第 12 步,创建一个从 getInfo fault1getCarInfo fault 消息映射的数据映射。在以下字段之间创建 Move 连接:
    • CustomerNotFoundFault > CustomerId to CustomerNotFoundFault > CustomerId
    • CustomerNotFoundFault > ServerInfo > ServerId to CustomerNotFoundFault > ServerInfo > ServerId
    • CustomerNotFoundFault > ServerInfo > Version to CustomerNotFoundFault > ServerInfo > Version

    完成的数据映射将类似于图 16。保存错误数据映射文件并关闭数据映射编辑器。

    图 16. 完成的第一个错误消息映射的数据映射编辑器
    完成的第一个错误消息映射的数据映射编辑器
  16. getInfo fault2getCarInfo fault 消息之间的其他错误消息映射重复第 15 步。在以下字段之间创建 Move 连接:
    • MissingCarRegistrationFault > customerId to CustomerNotFoundFault > CustomerId
    • MissingCarRegistrationFault > ServerInfo > ServerId to CustomerNotFoundFault > ServerInfo > ServerId
    • MissingCarRegistrationFault > ServerInfo > Version to CustomerNotFoundFault > ServerInfo > Version

    完成的数据映射将类似于图 17。保存错误数据映射文件并关闭数据映射编辑器。

    图 17. 完成的第二个错误消息映射的数据映射编辑器
    完成的第二个错误消息映射的数据映射编辑器
  17. 服务映射文件将使用您创建的 4 个数据映射的链接进行更新。保存服务映射,它现在将类似于图 18,然后就大功告成了。
    图 18. 完成的服务映射
    完成的服务映射

您现在已成功创建了第一个服务映射并指定了操作级和消息级映射。

接下来,为了运行服务映射,您需要导出服务映射库,然后创建一个本地映射服务并附加到它。


导出服务映射库

服务映射导出在服务映射库中,这支持多个服务映射一起导出和安装。要从 Rational Application Developer 导出您刚创建的服务映射,按照以下说明进行操作:

  1. 在 Rational Application Developer 中的 Enterprise Explorer 视图中,右键单击 DevWorksCarsServiceMapLibrary 项目,然后选择 Service map > Export…。这将打开 Export Service Map 对话框。
  2. 选择 DevWorksCarsRouteToV2.srvcmap 文件并确保选中了它旁边的复选框。在右侧面板中,您将看到服务映射所依赖的文件列表,包括您创建的 4 个数据映射和您最开始拥有的两个 WSDL 文件。单击 Browse... 按钮,提供一个文件名和目录来保存服务映射库,比如 C:\developerworks\DevWorksCarsRouteToV2.slibzip(*.slibzip 是服务映射库文件的扩展名),然后单击 Save。完成的对话框将类似于图 19。
    图 19. 完成的 Export Service Map 对话框
    完成的 Export Service Map 对话框
  3. 单击 Finish 将服务映射和所有相关文件导出到您的服务映射库文件。

安装服务映射

您现在已经有了一个可供部署的服务映射。返回到 WebSphere Application Server 来安装该服务映射:

  • 确保您的 WebSphere Application Server 实例已启动。
  • 转到 WebSphere Application Server Integrated Solutions Console:http://localhost:9060/ibm/console/login.do(服务名称和端口号可能不同)。如果开启了管理安全,请先登录。
  • 展开 Service integration > Service mapping 并单击 Service maps。显示了已安装服务映射的(空)列表。单击 Install 按钮。
  • 单击 Choose File 按钮并在文件选择对话框中选择(您之前导出的)DevWorksCarsRouteToV2.slibzip 服务映射库文件。单击 Open
  • 单击 Next 显示 Install service map 向导的第 1 步。向服务映射添加一段描述,比如 Routes and transforms to version 2 of the DevWorksCars service。此刻,您拥有另一个机会设置用于将转换的消息发送到新目标服务的端点地址。如果需要的话,可以设置正确的服务器名称和端口名称(但您在 Rational Application Developer 中创建服务映射时已完成)。完成的页面将类似于图 20。单击 Next
    图 20. Install Service Map 向导的第 1 步
    Install Service Map 向导的第 1 步
  • 如果您在一个连锁的 WebSphere Application Server 环境中工作,Install service map 向导的第 2 步将为您提供机会决定服务映射将安装到哪些服务器或集群中。如果使用的是 Application server(非连锁)配置文件,您只会在列表中看到一个服务器。选择合适的集群或服务器并单击 Next
  • 该向导的第 3 步显示您安装的服务映射的摘要和它们的详细信息。单击 Finish 安装服务映射。
  • 单击 Save 保存 WebSphere Application Server 主要配置。安装的服务映射会出现在服务映射列表中,但目前尚未附加到本地映射服务,所以还无法使用。图 21 显示了服务映射列表。
    图 21. WebSphere Application Server 中安装的服务映射列表
    WebSphere Application Server 中安装的服务映射列表

创建本地映射服务

现在您已经安装了一个服务映射,您需要设置本地映射服务。本地映射服务将拦截由版本 1 的 Web 服务客户端发送到版本 1 的 Web 服务提供程序的所有请求。事实上,它将拦截任何从这个 WebSphere Application Server 实例发送到版本 1 Web 服务客户端的请求,这意味着如果您有多个客户端应用程序调用版本 1 Web 服务提供程序,那么所有这些调用都将被拦截,如果一个服务映射附加到了本地映射服务,所有这些调用都将依据该服务映射来路由和转换。

创建本地映射服务:

  1. 转到 WebSphere Application Server Integrated Solutions Console。如果开启了管理安全,请先登录。
  2. 展开 Service integration > Service mapping 并选择 Local mapping services。显示了本地映射服务列表。
  3. 单击 New 按钮。显示了 New local mapping service 向导的第 1 步。将 Name 字段设置为 DevWorksCarsV1LMS,并将 Description 字段设置为 Intercepts calls for version 1 of the DevWorksCars service,如图 22 所示。单击 Next
    图 22. “New local mapping service” 向导的第 1 步
    “New local mapping service” 向导的第 1 步
  4. 该向导的第 2 步支持您在创建本地映射服务的同时附加一个服务映射。从下拉列表中选择 DevWorksCarsRouteToV2,也就是您刚刚创建的服务映射。单击 Next
  5. 向导的第 3 步已根据您在上一步中选择的服务映射的来源服务细节预先填充了大部分字段。您惟一需要指定的字段是 Endpoint address,它应设置为 Web 服务客户端用于调用 Web 服务提供程序的版本 1 的地址。这是 Web 服务前端 Version1 Service URL 字段中使用的地址,该地址的默认值为 http://localhost:9080/DevWorksCarsWeb/DevWorksCarsV1,但也有可能需要更新服务器名称和端口号。图 23 显示了向导的第 3 步及已完成的字段。
    图 23. “New local mapping service” 向导的第 3 步
    “New local mapping service” 向导的第 3 步

    此页面上的字段确定此本地映射服务将拦截的准确的 Web 服务客户端请求;这些调用必须与这里指定的端点地址、服务名称、端口号、端口类型和命名空间相匹配。基于 Web 服务提供程序的版本 1 的 WSDL 的 Web 服务客户端请求对与这些值进行匹配。

  6. 该向导的第 4 步显示了您创建的本地映射服务的摘要。单击 Finish 创建本地映射服务。
  7. 新创建的本地映射服务已显示在列表中,但它目前处于停止状态,因为它附加到一个还未启动的服务映射。安装一个服务映射时,系统会为它创建一个新的业务级应用程序 (BLA),必须首先启动它才能使用服务映射。附加的本地映射服务的状态反映了附加的服务映射的状态。勾选 DevWorksCarsV1LMS 本地映射服务旁边的复选框,单击 Start 按钮同时启动服务映射 BLA 和本地映射服务本身。
  8. 单击 Save 保存 WebSphere Application Server 主要配置。新的本地映射服务将显示在列表中,这表明它已被附加到了一个服务映射并且已经启动。图 24 显示了服务映射列表。
    图 24. WebSphere Application Server 中配置的本地映射服务列表
    WebSphere Application Server 中配置的本地映射服务列表

测试服务映射

现在您已创建、导出和安装一个服务映射,并将它附加到新创建的本地映射服务,您已准备好测试它了。

在您浏览器中返回到 DevWorksCars 应用程序的 Web 前端(地址为 http://localhost:9080/DevWorksCarsWeb/DevWorksCarsClient,服务器名称和端口号可能不同),在 Customer ID 字段中输入版本 2 的客户 ID 2A。确保 Version1 Service URL 字段仍包含版本 1 Web 服务提供程序的端点地址。单击 Submit 按钮时,您会看到来自版本 2 Web 服务提供程序的客户的信息,如图 25 所示。

图 25. 通过一个服务映射从 Web 服务提供程序的版本 2 获取的客户和服务信息
通过一个服务映射从 Web 服务提供程序的版本 2 获取的客户和服务信息

我们总结一下这里介绍的内容。

Web 前端使用基于版本 1 服务的 Web 服务客户端,将一个请求发送到版本 1 服务提供程序。该请求被本地映射服务拦截并传递到服务映射,该请求在这里被转换(使用您指定的数据映射),然后路由到版本 2 Web 服务提供程序。版本 2 Web 服务提供程序收到一个标准的版本 2 消息并返回一个版本 2 响应消息,该消息再次在客户端上被本地映射服务拦截,并被服务映射转换为版本 1 响应消息,然后传递回 Web 服务客户端和 Web 前端。

您完全不需要对 Web 服务客户端或客户端应用程序执行任何更改。版本 1 Web 服务客户端发送并接收版本 1 消息,版本 2 Web 服务提供程序接收并返回版本 2 消息 – Web 服务消息的拦截、转换和路由完全对所涉及的应用程序透明。

可用于版本 2 Web 服务的其他客户 ID 包括 2B2C2D。客户 2D 已存在,但没有车辆,所以这里返回了版本 2 的 MissingCarRegistrationFault,该消息转换为版本 1 CustomerNotFoundFault 消息(包含来自 MissingCarRegistration SOAP 错误的消息)。如果尝试使用其他任何客户 ID,您会看到 Customer ID was not found 错误消息,它已从版本 2 转换为版本 1。

但是,因为您现在始终路由到版本 2 Web 服务提供程序,所以您不再能够查找来自版本 1 的客户。如果在添加服务映射之前尝试了任何有效的客户 ID(1A、1B 和 1C),您将获得 Customer ID was not found 消息,因为请求已发送到版本 2 的服务。要修复此问题,需要返回到 Rational Application Developer 中的服务映射编辑器,定义一种基于内容的路由。


更新服务映射,以便根据消息内容来路由消息

要使消息能够路由到版本 1 或版本 2 的 Web 服务提供程序,您需要使用 Rational Application developer 更新之前创建的服务映射。您可使用一条简单规则来确定请求路由到版本 1 还是版本 2 的服务 - 如果客户 ID 以数字 2 开头,那么它应路由到版本 2 的 Web 服务提供程序。按照以下说明将一个额外的目标服务添加到服务映射,设置决定一条消息何时应路由到版本 1 或版本 2 的条件。

  1. 在 Rational Application Developer 中的 Enterprise Explorer 视图中,展开 DevWorksCarsServiceMapLibrary 项目并双击 DevWorksCarsRouteToV2.srvcmap 文件。将打开服务映射编辑器(如果它已关闭)。
  2. 单击 Add a target service 添加一个新目标服务。将打开 Add service 对话框。
  3. 单击 Browse… 按钮选择一个目标服务 WSDL 文件。这个 WSDL 描述您还想将调用路由到的原始(版本 1)服务。打开嵌套的目录,直到打开了 DevWorksCarsWeb/WebContent/WEB-INF/wsdl 目录,然后选择 DevWorksCarsV1.wsdl 文件。单击 OK。其他字段已自动填充。将 Service Name 字段设置为 targetV1。如果 Endpoint address 字段中的服务器名称和端口号不正确,则勾选 Override defaulst endpoint address 复选框,将 Endpoint address 字段修改为版本 1 服务提供程序的 URL。完成的对话框页面将类似于图 26。单击 OK 添加版本 1 服务作为服务映射中的另一个目标服务。
    图 26. 向服务映射添加一个新目标服务
    向服务映射添加一个新目标服务
  4. 您应该在服务映射编辑器中看到来源、targetV2 和 targetV1 服务。通过将鼠标悬停在来源服务 getCarInfo 操作上并单击出现的映射手柄,在来源 getCarInfo 操作和 targetV1 getCarInfo 操作之间添加一个映射。将连接拖到 targetV1 服务上的 getCarInfo 操作。此时会出现一条确认消息,询问您是否确定将现有操作映射转换为条件映射。单击 OK,一个新的条件映射将被添加到服务映射中,并会显示 Routing conditions 对话框。
  5. 在 Routing conditions 表中,单击第一个条件的 Name 单元(默认设置为 Condition)并将它重命名为 RouteToV2。单击第二个条件的 Name 单元 Condition0 并将它重命名为 RouteToV1。仍然选中第二个条件行,单击 Set As Default 按钮更改 Order cell to *,这意味着如果第一个条件在服务映射收到一条消息时不匹配,那么将会使用第二个 RouteToV1 条件。现在单击第一个条件的 Expression 单元,单击显示的 按钮来启动 XPath Expression Builder。
  6. 在 XPath Expression Builder 中,展开 $BodygetCarInfoRequestInfo 结构以显示 CustomerId 字段。双击 CustomerID 字段,将 $Body/tns:getCarInfo/RequestIcnfo/CustomerId 添加到 XPath Expression 字段中。现在编辑 XPath Expression 字段,创建一个会在 CustomerId 字段中的值以数字 2 开头时匹配的 XPath。为此,最简单的方法是使用 starts-with XPath 函数,让 XPath Expression 字段包含:

    starts-with( $Body/tns:getCarInfo/RequestInfo/CustomerId , '2')

    图 27 显示了完成的 XPath Expression Builder 对话框。单击 Finish 设置条件 XPath。

    图 27. 完成的 XPath Expression Builder 对话框
    完成的 XPath Expression Builder 对话框
  7. 图 28 显示了完成的 Routing conditions 对话框。路由条件的顺序很重要,因为列表中第一个与消息匹配的条件将提供该消息路由到的目标服务,即使其他的条件也匹配。可使用 Routing conditions 对话框中的 Up 和 Down 按钮对条件重新排序。单击 OK 设置服务映射中的条件。
    图 28. 完成的 Routing conditions 对话框
    完成的 Routing conditions 对话框
  8. 您现在为服务映射设置了条件,以决定何时路由到版本 2 或版本 1 的服务提供程序。如果单击服务映射编辑器中的 RouteToV1 条件,您会看到服务映射现在已经可供使用,因为 Operation Map 部分中的消息映射已为您创建好了。因为来源服务和 targetV1 服务使用了相同的 WSDL,所以不需要对请求、响应和错误消息进行修改,您拥有一组 Move 连接来简单地传递未修改的消息。图 29 显示了为 RouteToV1 条件操作映射设置的消息映射。
    图 29. RouteToV1 条件操作映射的消息映射
    RouteToV1 条件操作映射的消息映射
  9. 您将进行一次额外的更新,让您的 Web 前端能够显示一条消息何时映射到版本 1 的 Web 服务提供程序。单击 getCarInfoResponse 消息的 Move 连接旁边的向下箭头。在 Transform selector 出现后,单击 Data Map 转换,这已在图 30 中突出显示。
    图 30. 选择 getCarInfoResponse 消息的 Data Map 转换
    选择 getCarInfoResponse 消息的 Data Map 转换
  10. 现在右键单击 getCarInfoResponse 消息之间的 Data Map 连接并选择 Show In > Properties 视图。Properties 视图将会打开。单击 New… 按钮,这将打开 New Data Map 对话框。接受新数据映射文件的默认名称和位置,然后单击 Finish 按钮。
  11. 此时打开数据映射编辑器。按照以前的数据映射中用于创建 Move 连接的说明,在以下结构之间创建 Move 连接:
    • ReturnInfo > CustomerInfo to ReturnInfo > CustomerInfo
    • ReturnInfo > ServerInfo > ServerId to ReturnInfo > ServerInfo > ServerId
    • ReturnInfo > ServerInfo > Version to ReturnInfo > ServerInfo > Version
    • ReturnInfo > CarInfo to ReturnInfo > CarInfo

    单击两个 ServerId 字段之间的 Move 连接旁边的向下箭头,将转换更改为 fn:concat 转换。fn:concat 转换可通过展开 Transform selector 的 String Functions 部分来找到。这是一个 XPath 2.0 函数,它将两个或多个值串联到一个字符串中。在 Properties 视图的 Parameters 表中,将 string1 值保留为 $ServerId,单击 string2 参数的 Value 单元,将它设置为值 'MAPPED'(包含单引号)。图 31 显示了已选择 fn:concat 转换的已完成的数据映射。保存响应数据映射文件并关闭数据映射编辑器。

    图 31. 完成的版本 1 响应消息数据映射编辑器
    完成的版本 1 响应消息数据映射编辑器
  12. 保存服务映射。完成的服务映射现在类似于图 32。
    图 32. 完成的服务映射,包含版本 1 消息的路由和转换
    完成的服务映射,包含版本 1 消息的路由和转换
  13. 按照前面的 导出服务映射库 一节中使用的相同说明,从 Rational Application Developer 导出服务映射库。如果不希望重写以前导出的服务映射库,可使用不同的文件名。
  14. 现在按照前面的 安装服务映射 一节中使用的相同说明,将服务映射安装到 WebSphere Application Server 中。在 Install service map 向导的第 1 步中,为更新的服务映射提供一个新名称,将 Name 字段设置为 DevWorksCarsRouteToV1AndV2,并将 Description 字段设置为 Routes and transforms to version1 and version 2 of the DevWorksCars service。如果有必要的话,可以使用正确的服务器名称和端口号更新目标服务端点地址。安装服务映射并保存 WebSphere Application Server 主要配置后,您将获得两个可用的服务映射,如图 33 所示。
    图 33. WebSphere Application Server 中安装的服务映射列表
    WebSphere Application Server 中安装的服务映射列表
  15. 目前本地映射服务已附加到第一个服务映射 DevWorksCarsRouteToV2,但这很容易调整。单击 DevWorksCarsV1LMS 链接,调出本地映射服务的细节页面。在 Service Maps 部分中,使用下拉列表将附加的服务映射从 DevWorksCarsRouteToV2 切换到新服务映射 DevWorksCarsRouteToV1AndV2。单击 OK,您将看到本地映射服务列表,其中 DevWorksCarsV1LMS 本地映射服务现在已附加到 DevWorksCarsRouteToV1AndV2 服务映射。
  16. 再次申明,您需要启动本地映射服务,因为新创建的服务映射 BLA 尚未启动。勾选 DevWorksCarsV1LMS 本地映射服务旁边的复选框,单击 Start 按钮同时启动服务映射 BLA 和本地映射服务本身。单击 Save 保存 WebSphere Application Server 主要配置。
  17. 现在您已经更新了本地映射服务以使用您更新的服务映射,您可再次测试它了。返回到 DevWorksCars 应用程序的 Web 前端,方法是在 Web 浏览器中打开 http://localhost:9080/DevWorksCarsWeb/DevWorksCarsClient(服务器名称和端口号可能不同),在 Customer ID 字段中输入一个版本 1 客户 ID1A。确保 Version1 Service URL 字段仍然包含版本 1 Web 服务提供程序的端点地址。单击 Submit 按钮时,您会看到来自版本 1 Web 服务提供程序的客户的信息,Service information 画面表明一个映射已发生,如图 34 所示。
    图 34. 通过一个服务映射从 Web 服务提供程序的版本 1 获取的客户和服务信息
    通过一个服务映射从 Web 服务提供程序的版本 1 获取的客户和服务信息
  18. 如果现在尝试一个版本 2 客户 ID,比如 2A,您将看到服务映射也支持路由到版本 2 Web 服务提供程序。您会看到与之前在 图 25 中看到的相同的结果,但这一次,服务映射已在请求消息中检查了该客户 ID,确定它是以数字 2 开头的,然后将该请求消息转换并路由到版本 2 Web 服务提供程序。

问题排除

如果发现您的服务映射未正常工作,请仔细回溯您的步骤,确保服务映射、数据映射和本地映射服务都已正确设置并彼此附加。在指定 Web 服务端点地址和 Web 浏览器 URL 时,确保服务器名称和端口号是正确的。

下载材料 中包含已完成的服务映射库文件 DevWorksCarsRouteToV2-Complete.slibzip,它同时包含 DevWorksCarsRouteToV2 和 DevWorksCarsRouteToV1AndV2 服务映射。此服务映射库可导入到 Rational Application Developer 中(如果您希望检查服务映射),或者安装在 WebSphere Application Server 中(如果您希望运行它们)。


结束语

在面向服务的架构发生演变时,常常需要更改它来确保更新的和新的服务提供程序能够继续适用于服务客户端。服务映射使您能够通过基于内容的路由和消息转换,将使用一个服务的应用程序与该服务提供程序的接口或位置隔离开。

服务映射在 Rational Application Developer 中开发,并且安装在 WebSphere Application Server 上,包含基于内容的路由条件和数据映射转换的规范。

本地映射服务在 WebSphere Application Server 中配置并静默拦截 Web 服务消息,如果附加了服务映射,那么还可以将服务映射应用到发送到 Web 服务提供程序或从中接收的请求、响应和错误消息。也可以对本地映射服务进行配置,在 Web 服务请求、响应或错误被拦截时发送事件。

本文包含了一个示例,展示了最初的服务客户端如何通过开发和使用一个服务映射和一个本地映射服务,调用一个服务提供程序的不同版本。


下载

描述名字大小
示例代码1312_borley_downloads.zip197 KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Rational
ArticleID=965601
ArticleTitle=服务映射简介: 将不断演化的 Web 服务集成到 WebSphere Application Server V8.5.5 中
publish-date=03132014