为 WebSphere DataPower 实现 Enterprise Gateway Framework 服务

WebSphere® DataPower 环境中的 Enterprise Gateway Framework 服务是一个基于服务的实现,可最大限度地减少内部 DataPower 端口及其配置在防火墙上的曝光。本文将向您介绍如何实现该框架,以帮助您简化在 DataPower 中的新服务开发。

简介

在 WebSphere DataPower 中运行的所有服务都需要在设备的 IP 地址和端口上进行安装。随着设备上的服务数量的增加,在任何环境中都会产生复杂性和下列问题:

  • 在其托管网络的外部暴露内部端口(在某些情况下,还会暴露 IP 地址)。
  • 多个防火墙配置,允许在 DataPower 的不同端口和 IP 地址上具有流量。
  • 随着设备上服务数量的增加,IP 地址和端口的维护量也增大。

处理上述问题,可能还有其他解决方案,但其中一个最简单且容易的解决方案是在 DataPower 环境中实现框架服务,以尽量减少端口及其配置在防火墙上的暴露。这项服务被称为 Enterprise Gateway Framework service,它提供以下特性:

  • 为 DataPower 内运行的所有服务提供单一入口点。
  • 通过 HTTP、HTTPs、MQ 和 FTP 协议处理请求。
  • 使用标准的 HTTP (80) 或 HTTPS (443) 端口。这样,就只能针对这些标准端口对防火墙进行配置。
  • 根据其安全要求(如相互身份验证或单向 SSL)对所有传入的请求进行身份验证。
  • 从传入的请求识别客户端。
  • 识别运行服务的环境。
  • 将请求路由到相应的服务或后端目的地。
  • 在任何 WebSphere DataPower 环境中部署一次,在纳入新服务时就无需更改任何代码。

下载文件

使用下列 zip 文件,可以将本文中描述的 DataPower 服务(包括样例防火墙服务)导入 DataPower 设备:EnterpriseFrameworkMPGW.zip


Enterprise Gateway Framework 服务场景概述

本文介绍在 DataPower 中创建 Enterprise Gateway Framework 服务的步骤。对于本文及其演示,您将无法 实现任何安全性选项或 MQ 前端处理程序。然而,由于框架设计的方式,您可以在以后添加这些选项。

我们的 Enterprise Gateway Framework 服务版本包含以下特性:

  • 为 DataPower 内运行的所有服务提供单一入口点。
  • 通过 HTTP 在端口 81 上处理请求。
  • 从传入的请求识别客户端。
  • 识别运行服务的环境。
  • 将请求路由到相应的后端目的地。
  • 在任何 DataPower 环境中部署一次,在纳入新服务时就无需更改任何代码。

在此演示中,请求的 URI 的内容决定传入的请求消息的路由。使用此 URI,会将请求定向或路由到相应的后端服务。假设所有传入的请求都定向到 DataPower 设备的端口 81。


创建 Enterprise Gateway Framework 服务

执行以下步骤,在 DataPower 中创建名为 “EnterpriseFrameworkServiceMPGW” 的 Enterprise Gateway Framework 服务。

  1. 使用 XML 防火墙创建两个回路服务,如图 1 所示:
    1. serviceA
    2. serviceB
    图 1. 两个 XML 防火墙服务
    两个 XML 防火墙服务
  2. 创建下面的三个文件:
    1. 创建 EnvironmentConfig.xml(见清单 1)。此文件包含环境值,所以传入的请求会分配到正确的后端。
      清单 1. EnvironmentConfig.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <config>
        <environment>DEV</environment> 
      </config>
    2. 创建 EnvironmentConfig.xslt(见清单 2)。此 XSLT 文件从 EnvironmentConfig.xml 读取值,并设置环境变量。
      清单 2. EnvironmentConfig.xslt
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          version="1.0"
          xmlns:dp="http://www.datapower.com/extensions"
          extension-element-prefixes="dp"
          exclude-result-prefixes="xalan dp"
          xmlns:xalan="http://xml.apache.org/xslt">
         
          <xsl:template match="/">
            <xsl:variable name="masterConfig" select="document
             ('local:///EnvironmentConfig.xml')"/>
            <dp:set-variable name="'var://context/wp/environment'"
             value="normalize-space($masterConfig/config/environment/text())"/>
          </xsl:template>
      </xsl:stylesheet>
    3. 创建 EnterpriseFrameworkRouter.xslt(见清单 3)。此 XSLT 文件使用传入消息的 URI 获取传入请求消息的后端 URL。假设服务名称被用作传入请求的 URI。这个样式表在 local:///xml 下面查找一个名称与在 URI 中传递的字符串一样的子目录。然后,该样式表从预计将在该子目录中出现的一个名为 config.xml 的文件中检索目标主机信息。
      清单 3. EnterpriseFrameworkRouter.xslt
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:dp="http://www.datapower.com/extensions"
      extension-element-prefixes="dp" exclude-result-prefixes="dp">
      
           
      	<xsl:template match="/">
      		<xsl:copy-of select="."/>
      		<xsl:variable name="incomingURI">
      			<xsl:value-of select="dp:variable('var://service/URI')"/>
      		</xsl:variable>
      		<xsl:variable name="tempVar">
      			<xsl:value-of select="substring-after($incomingURI,'/')"/>
      		</xsl:variable>
      		<xsl:variable name="serviceName">
                  <xsl:if test="contains($tempVar,'/')">
                   <xsl:value-of select="substring-before($tempVar,'/')"/>
                  </xsl:if>
                  <xsl:if test="not(contains($tempVar,'/'))">
                    <xsl:value-of select="$tempVar"/>
                  </xsl:if>
      		</xsl:variable>
      		<xsl:param name="hostAddr" select="'local:///'"/>
      		<xsl:variable name="remoteURL" select="concat($hostAddr,'/xml/',
               $serviceName,'/config.xml')"/>
      		<xsl:variable name="environment" select=
               "dp:variable('var://context/wp/environment')"/>
      		<xsl:variable name="config" select="document($remoteURL)" />
      		<xsl:variable name="serviceDestination">
      	     <xsl:copy-of select="$config/EnterpriseFrameworkDestinationList/
                 serviceDestination[@environment=$environment]"/>
      		</xsl:variable>
                <dp:set-variable name="'var://service/routing-url'" 
                 value="concat($serviceDestination,$incomingURI)"/>
      	</xsl:template>
      </xsl:stylesheet>
  3. 将以下文件上传到 DataPower:
    1. 创建一个 xslt 文件夹,并将两个 xslt 文件都上传到该文件夹(见图 2)。
    2. EnvironmentConfig.xml 上传到 local:///
    图 2. 上传 XML 和 XSLT 文件
    上传 XML 和 XSLT 文件
  4. 创建一个 Multi-Protocol Gateway (MPGW),将它命名为 EnterpriseFrameworkMPGW(参见图 3),配置:
    1. 动态后端
    2. Request 和 Response 类型为 Non-xml
    图 3. EnterpriseFrameworkMPGW
    EnterpriseFrameworkMPGW
  5. 创建前端处理程序,将它命名为 EnterpriseFrameworkFSH,分配端口号为 “81”,如图 4 所示。
    图 4. EnterpriseFrameworkFSH
    EnterpriseFrameworkFSH
  6. 创建一条新策略 EnterpriseFrameworkPolicy,并添加以下规则:
    1. 为 “Client to Server” 创建一条新规则,并包含两个转换操作:
      1. EnvironmentConfig.xslt 分配给给第一个转换操作,并确保输出设置为 “NULL”,如图 5 所示。
        图 5. EnterpriseFrameworkPolicy 客户端到服务器规则
        EnterpriseFrameworkPolicy 客户端到服务器规则
      2. EnterpriseFrameworkRouter.xslt 分配给第二个转换操作,并确保输出设置为 “NULL”,如图 6 所示。
      图 6. EnterpriseFrameworkPolicy 客户端到服务器规则
      EnterpriseFrameworkPolicy 客户端到服务器规则
  7. 为 “Server to Client” 创建一条新规则,其中不包含任何操作。EnterpriseFrameworkPolicy 看起来与图 7 类似。
    图 7. 完整的 EnterpriseFrameworkPolicy
    完整的 EnterpriseFrameworkPolicy
  8. 应用该策略并关闭窗口。
  9. EnterpriseFrameworkMPGW 看起来与图 8 类似。保存配置。
    图 8. 完整的 EnterpriseFrameworkMPGW
    完整的 EnterpriseFrameworkMPGW

将现有的或新的服务集成到 Enterprise Gateway Framework 服务

在 Enterprise Gateway Framework 服务中纳入现有的或新的服务:

  1. local:///xml/ 下创建一个文件夹,以服务的名称作为文件夹名称,如图 9 所示。
    图 9. 创建服务文件夹
    创建服务文件夹
  2. 为 “serviceA” 创建以下 config.xml 文件,其中包含每个环境的 IP 地址或主机名,以及 serviceA 运行的端口(清单 4)。
    清单 4. serviceA 的端点
    <?xml version="1.0" encoding="UTF-8"?>
    <EnterpriseFrameworkDestinationList>
      <serviceDestination environment="DEV">http://192.168.136.145:2048</
       serviceDestination>
      <serviceDestination environment="QA">http://192.168.136.146:2048</
       serviceDestination>
      <serviceDestination environment="PROD">http://192.168.136.147:2048</
       serviceDestination> 
    </EnterpriseFrameworkDestinationList>
  3. 上传位于 local:///xml/serviceA 文件夹中的 config.xml 文件,如图 10 所示。
    图 10. 为 serviceA 上传的 config.xml 文件
    为 serviceA 上传的 config.xml 文件
  4. 为 “serviceB” 创建类似的 config.xml 文件,包含每个环境的 serviceB 主机和所分配的端口(参见清单 5)。
    清单 5. serviceB 的端点
    <?xml version="1.0" encoding="UTF-8"?>
    <EnterpriseFrameworkDestinationList>
      <serviceDestination environment="DEV">http://192.168.136.145:2049</
       serviceDestination>
      <serviceDestination environment="QA">http://192.168.136.146:2049</
       serviceDestination>
      <serviceDestination environment="PROD">http://192.168.136.147:2049</
       serviceDestination> 
    </EnterpriseFrameworkDestinationList>
  5. 上传位于 local:///xml/service 文件夹中的 config.xml 文件,如图 11 所示。
    图 11. 为 serviceB 上传的 config.xml 文件
    为 serviceB 上传的 config.xml 文件
  6. 每当一个新服务需要被集成到 Enterprise Gateway Framework 服务时,就需要为该服务创建一个配置文件,其中包含主机名/IP 地址的值和安装服务的端口号。不需要对 EnterpriseFrameworkMPGW 进行任何更改。
  7. 对于每一个传入的请求,EnterpriseFrameworkRouter.xslt(安装在 EnterpriseFrameworkMPGW 中)会解析 URI,并查找该服务的​​ config.xml 文件。如果该服务没有安装,那么就不会有该服务的 XML 文件。

测试和验证服务

执行以下步骤,测试 Enterprise Framework Gateway 服务的功能:

  1. 在 “serviceAFW” 和 “serviceBFW” 上启用探测。
  2. 从 SOAP UI 发出以下针对 serviceA 的测试消息,如图 12 所示:http://<hostname>:81/serviceA
    图 12. serviceA 的样例请求
    serviceA 的样例请求
    您看到的响应如图 13 所示。
    图 13. serviceA 的响应
    serviceA 的响应
    在 serviceA 探测中,注意 “inbound-url” 和 “outbound-url” 的值,如图 14 所示。
    图 14. serviceA 探测
    serviceA 探测
  3. 现在,发送 serviceB 的请求,如图 15 所示:http://<hostname>:81/serviceB
    图 15. serviceB 的样例请求
    serviceB 的样例请求
    在 serviceB 探测中,注意 “inbound-url” 和 “outbound-url” 的值,如图 16 所示。
    图 16. serviceB 探测
    serviceB 探测
    在 EnterpriseFrameworkMPGW 探测中,您可以看到请求被定向到它们各自的服务。注意 “inbound-url” 和 “outbound-url” 的值,如图 17 所示。
    图 17. EnterpriseFrameworkMPGW 探测
    EnterpriseFrameworkMPGW 探测

结束语

本文演示了如何在 WebSphere DataPower 中实现 Enterprise Gateway Framework 服务。通过将框架服务实施到任何 DataPower 环境,可以简化 DataPower 内的新服务开发。当在 DataPower 设备上实现新服务时,管理员不需要处理任何防火墙和网络配置请求。框架设计也没有向网络暴露端口 81 (在本场景中)以外的任何其他端口。

致谢

作者衷心感谢 Pradeep Thomas 在审阅本文时提供的宝贵意见和帮助。


下载

描述名字大小
代码样例EnterpriseFrameworkMPGW.zip487KB

参考资料

学习

讨论

条评论

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
ArticleID=854211
ArticleTitle=为 WebSphere DataPower 实现 Enterprise Gateway Framework 服务
publish-date=01082013