马 国耀 (maoguoyao@cn.ibm.com), 软件工程师, IBM 吴 宇 (wuyu@cn.ibm.com), 软件工程师, IBM
2008 年 5 月 12 日 DataPower 的两个主要功能是 XML 加速和防 XML 攻击。Web 服务的安全提供了强大支持。此外 , 我们还可以使用 DataPower 构建企业服务总线。这篇文章我们用 DataPower 实现了一个企业服务的门户提供了多种服务使用方式 , 包括 HTML、SOAP、SOAP/SSL, 在服务的使用者 (Consumer)和服务提供者 (Provider) 之间我们实现了服务路由 (Router), 协议转换 (Convert), 数据格式的转化 (Transformation) 等 ESB 的特性。
场景介绍
在本文将要实现的场景中,我们提供了一个机票价格查询的服务。机票查询服务由多家航空公司提供(后面我们把航空公司称为服务提供者)。我们希望通过 DataPower 把所有服务提供者提供的服务统一起来,用户只需要通过一个服务的访问即可以使用多家航空公司提供的机票价格查询的服务。DataPower 与后台的服务提供者之间使用 SOAP 协议通讯。
我们使用 DataPower 的 XMLFirewall 服务来提供机票价格查询服务的路由,数据格式以及协议的转化。DataPower 根据输入的数据动态的决定由哪个航空公司提供该服务,在 Firewall 的 Process Flow 中进行数据格式的转换,并实现协议的转化。
在客户端,服务的使用者可以使用 Web Brower、SOAP、SOAP/SSL 来访问由 DataPower 提供的统一服务。业务场景如图 1 所示:
图 1. 场景介绍
实现分析
对于后台的每一个服务提供者分别建立一个 XMLFirewall。对中国航空和东方航空公司所提供的票价查询服务,分别建立 CAFlightService 和 MUFlightService。
通过一个统一的 XMLFirewall 提供给用户 FlightService,用户不仅可以通过提交一个标准 HTML 表单来访问服务,也可以通过对 Web 服务的 SOAP 请求来访问服务,还可以通过带安全的 SOAP 服务请求来使用服务。这个服务根据用户的请求方式,进入相应的 XML Firewall policy 执行。
对于无安全的 HTML 和 SOAP 访问,用同一个 Firewall (FlightSearchRouter) 来处理请求。在这个 Firewall 的 policy 定义的部分,定义 FlightServie_MatchingRule 和 FlightRouteForm, 分别对应用于处理 SOAP 和 HTML 的请求。如图 2 所示:
图 2. Policy 编辑
对于加 SSL 的 SOAP 访问,用另一个 Firewall (FightServiceSSLFirewall) 来处理。我们使用另一个加 XXL 的 XMLFirewall 来处理,在这个 XML Firewall 的 Front End 服务的配置页面上加入 SSL Server Crypto Profile (FightServerServerCypto,这部分的配置在本文后面详细介绍 ),在 Policy 定义部分,把服务指向 FlightSearchRouter,完成后面的陆游,协议转换,消息转化等其他功能。
图 3. XMLFirewall 配置
在 DataPower XI50 上配置实现场景
下面介绍在 DataPower XI50 上实现该场景的具体步骤。
1) 使用 XMLFirewall 在 DataPower 上注册后台服务这里仅介绍 MUFlightService 的配置过程。CAFlightService 和 MUFlightService 的配置除了端口设置以外,其他过程完全一样,此处不再赘述。
2) 建立一个新的 XMLFirewall(FlightSearchRouter)来实现 ESB。他提供了服务路由,消息转换和协议转化的功能。客户端可以是 WebBrower,也可以是应用服务器,即 Web Service 客户端。
3) SSL 的配置。
使用 XML Firewall 注册后台服务
从 WSDL 创建 XML Firewall
在 Control Panel 上,通过 Wizard,创建一个名为 MUFlightService 的 XML Firewall 服务,如下图:
图 4. Firewall Wizard
点击 Next,进入下一个配置界面
图 5. Firewall Wizard 第二步
上传定义 Web Service 服务的 WSDL 文件并选中,点击 Next
图 6. Firewall Wizard 第三步
上图中,Back Address 代表运行 Web Service 的地址,Front Endpoint Port 表示通过 DataPower 向外部暴露出该服务的端口。创建完成后,我们可以看到 XML Firewall 的主配置界面
图 7. XMLFirewall 配置
该 XML Firewall 类型选中 static-backed,Front End 页面的 Request Type 选中 SOAP,表明将要处理的消息是 SOAP 格式的。DataPower 通过 Policy 来处理进入的消息,在 Firewall Policy 上选中“+”,添加名为 MUFlightService 的处理规则
配置处理输入消息的 Policy
由 WSDL 产生的 XMLFirewall 的规则如下图,其中很多处理节点已经由系统自动生成,对于开发者来说,所做的改动极少。
图 8. XMLFireall Policy 配置
消息处理的顺序是从左向右,左边第一个节点 Match,用它来定义请求 URL 与 Policy 的对应。每一条 Policy 对应唯一的一条 Match 规则。
图 9.Matching Rule 配置
从上图可以看出,MUFlightService_request_Match 所对应的 URL 是:*/FlightSearchMUWeb/sca/ MUFlightSearchExport1,既是 Web Service 绑定的 URL 地址。
第二个节点为 Validate,既验证消息内容。通过在创建 WebService 是给定的 WSDL 文件,系统会帮助创建默认的 XML Schema 文件对消息格式进行验证,当然用户也可以自定义 XSD 文件对消息格式进行验证。只需要在 Schema URL 下拉框中选定 XSD 文件即可。
图 10.Validate 配置
其他节点设置保持默认,保存成功后 MUFlightService 就可以运行了。CAFlightServce 的配置和 MUFlightService 的配置完全一样,只是在设置 Device Port 的时候设置成 2068 即可。
创建 FlightSearchRouter 来实现 ESB
基于消息内容的路由
在此之前,我们已经创建了两个 XML Firewall,分别为 MUFlightService 和 CAFlightService,各自处理各自航空公司的航班查询
表 1. XMLFirewall Services
|
|
Input matching URL
|
Device Port
| |
MUFlightService
|
*/FlightSearchMUWeb/sca/MUFlightSearchExport1
|
2067
| |
CAFlightService
|
*/FlightSearchCAWeb/sca/CAFlightSearchExport1
|
2068
|
在接下来的部分我们创建一个名为 FlightSearchRouter 的 XML Firewall 作为服务请求的统一入口,根据查询航班的消息内容来路由到不同的后台服务。
图 11. FlightSearchRouter 配置
注意 Firewall Type 类型为 dynamic-backend,因为该 XML Firewall 没有提供固定的 Web Service 服务。该 XML Firewall 向外暴露出的服务端口是 2069。
下面定义名为 FlightRouterPolicy 的 Firewall Policy
图 12. FlightSearchRouter Policy 配置
从上图可以看出,Match Rule 统一命名为:*/services/FlightSearch,作为统一入口。Validate 节点依然作验证。Policy 的关键是第三个路由节点。
在 Route 节点中,我们定义了一个名为 FlightRouter 的路由规则表,如下:
图 13. FlightSearchRouter Route 规则表
通过 XPath 工具,我们可以很方便的实现基于内容的路由。在上图中可以看到基于 SOAP 消息中 company 内容的不同,我们路由到不同的服务提供方。对 FlightSearchRouter 的定义就结束了,应用并保存使其可以运行。
在定义 MUFlightService 时 Match Rule 是 : */FlightSearchMUWeb/sca/MUFlightSearchExport1,当采用 FlightSearchService 作为统一入口后,需要分别修改 MUFlightService 和 CAFlightService 的输入匹配规则,并且对各自的 SOAP 加上相应的 namespace
表 2. 服务 Matching URL 表
|
|
Input matching url
|
Namespace
| |
MUFlightService
|
*/FlightSearchMUWeb/sca/
MUFlightSearchExport1
|
http://MUFlightSearch/MUFlightSearch
| |
CAFlightService
|
*/FlightSearchCAWeb/sca/
CAFlightSearchExport1
|
http://CAFlightSearch/CAFlightSearch
| |
FlightSearchService
|
*/services/FlightSearch
|
http://FlightSearch/FlightSearch
|
图 14. MUFlightServices Policy 配置
上图所示,我们修改 MUFlightServices 的输入匹配 URL 为 */services/FlightSearch。在下面的节点中使用自定义的 XSLT 把输入消息的 namspace 转化为 "http://MUFlightSearch/MUFlightSearch",如下图:
图 15. MUFlightServices Transform 配置
由于更改了匹配规则,在进行实际调用 backend 服务前,必须添加 reset variable 节点,把实际调用的 URL 复制到给定的变量中,在 Advanced 中,我们选择 Set Variable Action,对 var://service/URI 进行赋值,如下图:
图 16. MUFlightServices Set Variable Action 配置
保存后,FlightSearchRouter 就可以运行了,该 XML Firewall 作为统一的接入口,根据消息内容提供不同航空公司提供的航班查询服务。
对 HTTP Form 的请求方式接入的配置
在本文示例中,我们除了演示常规的 SOAP 接入方式,下面给出 HTTP Form 提交的方式接入 DataPower。我们直接在 FlightSearchRouter 中添加 Rule Name 为 FlightRouterPolicy_Rule_2 的规则
图 16-1. HTTP Form 提交方式
上图可见,该规则的接入口匹配 URL 为:*/services/Form,即是说,该规则只接受类似 <FORM action="http://9.186.109.239:2069/services/Form" method="post"> 的 form 提交。
在下面的节点中,我们要把输入的 HTTP 消息转化为 XML 格式的消息,我们利用 DataPower 系统给定的 convert –http 节点。Convert 节点没有在规则面板上直接列出,我们选中 Advanced 节点,双击,出现下图,然后选择 convert-http
图 17. convert-http 配置
在该节点下不用任何特殊的设置,采用默认的就可以了。接下来,我们要把产生的 XML 消息转化为 SOAP 格式的消息,在 DataPower 中,对于两种不同消息格式的转换,一般采用 Transform 节点,在该节点上,我们利用自定义的 XSLT 进行消息转化。
图 18. Transform 配置
该例子中我们定义了 convertToSOAP.xsl 来处理从 XML 到 SOAP 的转换,源文件在附件中。
下面要创建的节点和我们在利用 WSDL 产生 XML Firewall 几乎类似了,为了方便起见,我们重用之前定义的 Rule,为了重用 Rule,需要定义 Call Processing Rule。和 Convert-Http 类似,该节点没有在面板中直接列出,我们需要在 Advanced 中选中 Call Processing 来定义
图 19. Call 配置
节点的配置非常方便,我们只要在下拉框中选中我们要重用的 Rule Name 就可以了。整个处理 HTTP 消息的 Policy 如下图 :
图 20. Call Processing Rule Action 配置
需要值得注意的是,在测试 HTTP Form 方式接入 DataPower 时,也许会出现错误信息:“WSWS3147E: 错误:没有 SOAPAction 头”。我们只要在 FlightSearchRouter 的 Headers 里添加 Header Name 和 Header Value 就可以了
图 21. SOAPAction 设置
到此为止,我们可以用 HTTP Brower 和 Web Service 客户端来测试了。
测试
很多文章都提到了 cURL 工具,本文使用了 Apache 提供的 Http Client,其提供的 API 能够更好的被程序员所理解,并集成到现有的系统当中。
首先我们通过 SOAP 的方式调用
调用的 URL 是:http://9.186.109.239:2069/services/FlightSearch,调用结果如下图:
图 22. SOAP 调用结果
Probe 是 DataPower 自带的进行 troubleshooting 的一个功能,通过激活该功能,如下图所示,我们可以观察消息在 DataPower 中的处理过程,首先,点击 Enable Probe 按钮激活 Probe 功能:
图 23. Probe 1
当完成一次客户端对服务端的调用后,点击刷新按钮,可以看到处理消息的一条记录
图 24. Probe 2
点击放大镜按钮,我们可以观察到消息在 Policy 中被处理的每一个步骤。
图 25. Probe 3
下面我们采用 HTTP 的方式调用
HTTP 提交的 Action:http://9.186.109.239:2069/services/Form,调用结果如下:
图 26. HTTP 调用
图 27. HTTP 调用结果
同样的,我们可以通过 Enable DataPower 上的 Probe,观察 HTTP 消息在 DataPower 中的处理过程,当消息刚刚进入 DataPower 时:
图 28. HTTP Probe 1
通过 HTTP Convert 转变成 XML 后
图 29. HTTP Probe 2
Figure xxx. Requires a heading
可以看出,已经变成了 XML 格式,最后通过 Transform 后,转变成 SOAP 消息:
图 30. HTTP Probe 3
Figure xxx. Requires a heading
提示:Enable DataPower 的 Probe 是我们开发调试很好的一个途径。但是只推荐在开发环境下使用,因为激活该功能会影响整体性能。
对 SSL 的配置
SSL(Secure Sockets Layer ) 通过握手协议在信息访问的双方提供了一个安全可靠的传输层。DataPower 能够很好地把 SSL 集成到它的服务种。在本文的例子中,我们就在 XML Firewall 中使用了 SSL。下面介绍配置的详细过程。
下面介绍一下需要配置的 Object(对象),配置 SSL 需要配置一个 SSL Proxy Profile,它的组织结构如下图所示。
图 31. SSL 对象结构图
一个 SSL Proxy Profile 对应了一个 Crypto Profile,它可以包含两个部分:Crypto Identification Credential 和 Crypto Valid Credential。
Crypto Identification Credential 用来表明自己的身份。定义一个 Crypto Identification Credential 需要定义两个部分:私钥 Crytpo key 和公钥 Ctypto Certification. SSL 相关的理论知识可以参考附件。
在配置 SSL 时,会根据需要配置相应的对象。Crypto Profile 有客户端和服务端 Crypto Profile 两种。当 DataPower 作为服务的提供者,即用客户端连接 DataPower 时,我们需要提供 SSL Server Crypto Profile。当 DataPower 访问后台 Web 服务时,要配置 SSL Client Crypto Profile。
在本文的场景中,我们需要建立一个 SSL Server crypto Profile,在这个 Profile 里面,我们建立了一个 Crypto Identification Credential,由于我们不需要确认客户端的身份,所以我们不需要 Crypto Valid Credential.
下面描述建立这些对象并运用到 XML Firewall 的过程。
创建 SSL 需要用到的 Private key 和 Certificate (public key)
Administration -> Miscellaneous -> Crypto Tools
图 32. Crypto Tools 配置
注意,只有 Common Name 是必须的,而 Object Name 我们填写 FlightSearchObj。选择 Export Private key 为 on,生成的密钥和证书将会被存放在 temporary:///。点击 Generate key,就可以完成了。
生产的密钥和证书在 DataPower 中通过 Object 表示,我们可以到 Keys and Certs Management 的 Key 链接下面找到对应的密钥 Object。
图 33. Crypto Key
上图是生成的密钥对象。我们可以到 Keys and Certs Management 的 Certificates 链接下面找到对应的证书 Object。下图是生成的证书对象
图 34. Cypto Certificate
创建 Crypto Objects
为了在 XML Firewall 中使用 SSL,我们必须利用生成的密钥和证书产生三个 Objects。首先是 Identification Credential Object,该对象在 SSL 连接中用于自我身份认证。同样的,在 Keys and Certs Management 下点 SSL,点击 Identification Credentials 并添加。
图 35 Crypto Identification Credentials
我们在名称中输入 FlightSearchIdCred,并在下拉框中选择刚才我们生成的密钥和证书。点击应用就可以了。
接下来,我们要从证书中生成 Validation Credential Object,该对象是用于验证 SSL 中提供的证书和数字签名的真实性,用来证明”who are you”。
在 Keys and Certs Management 的 SSL 链接下,点击 Validation Credentials。点击 pubcert 链接查看证书,从 Certificates 下拉框中选择我们之前生成的 FlightSearchObj,然后把它加入到 pubcert 证书链中
图 36. Crypto Validation Credentials
应用并保存后就生成该对象了。有了上面产生的 Crypto Objects,我们就可以创建 Server Crypto Profile,建立安全的 XML Firewall 中要用到的对象。在 Keys and Certs Management 的 SSL 链接下点击 Crypto Profile 并增加。
图 37. Crypto Profile
名字输入 FlightSearchServerCP,在 Identification Credentials 下拉框中选择刚才产生的对象,由于 DataPower 不需要客户端证书的认证,所以我们不给 Validation Credentiasl 赋值。最后应用并保存就可以了。
创建加 SSL 的 XML Firewall
有了刚才产生的对象,建立一个 SSL 的 XML Firewall 就非常简单了,在 XML Firewall 按钮下,点击 Add Advanced,直接创建一个名为 FightServiceSSLFirewall 的 XML Firewall。Firewall Policy 选择我们之前的 FlightRouterPolicy 就可以了。
图 38. XMLFirewall 中加 SSL
怎么样增加 SSL 特性呢?很简单,在右下角的 SSL Server Crypto Profile 中选择之前创建的 FlightSearchServerCP 就可以了。
测试
可以使用两种方式对 FightServiceSSLFirewall 进行测试,一种是通过 HTTP,另一种是 SOAP。
如果用 IE 进行 HTTP 的测试,更改 form 表单:<FORM action="https://9.186.109.239:2071/services/Form" method="post">。当提交的时候,选择接受证书就可以了。
图 39. SSL 测试
如果我们采用 HttpClient 的方式发送 SOAP 消息测试,我们必须要把该证书导入到运行程序的 JRE 的本地 KeyStore 才行。具体步骤如下:
在证书详细信息一栏,选择“拷贝到文件”,导出证书到文件目录。
图 40. 下载证书 1
点击下一步,输入导出的文件名。
图 41. 下载证书 2
然后在 <JAVA_HOME>\lib\security 目录下,输入 keytool 命令导入证书到 keystore 中:
图 42. 导入证书
这样我们就完成了证书到 keystore 的导入
结束语
在本文中,我们设计并实现了使用 DataPower 实现 ESB 的一个业务场景,该业务场景是真实客户场景的一个修改版。在本文的实现中,我们涉及到了 ESB 的服务注册,消息路由,消息转换,协议转换等特性。
参考资料
作者简介  | |  | 马国耀 2007 年 7 月加入 IBM BPTSE,主要从事 SOA Key Products Enablement 工作。 |
 | |  | 吴宇 是 CDL BPTSE 部门的一名软件开发工程师,他主要致力于采用 IBM 各中间件产品进行企业集成项目的设计和实现。 |
对本文的评价
|