UML软件工程组织

 

 

在企业级 SOA 中使用 Web 服务,第 7 部分: 使用 XML 二进制优化打包规范加速 Web 服务应用程序
 
Judith Myerson (jmyerson at bellatlantic.net), 系统工程师兼架构师
 

本文内容包括:

您是否希望了解如何使用 XML 二进制优化打包 (XOP) 规范来优化 Web 服务应用程序?Judith M. Myerson 将向您展示在处理 Web 服务时,XOP 包比 XML 解析器更有效的原因。她将讨论在多 SOA 中 Web 服务变得过于庞大的两个场景。为了解决此问题,她讨论了 XOP 包可以如何比 XML 解析器更为有效地处理二进制(而非文本)格式的大型文件。她给出了 XOP 处理前后的代码示例,以帮助开发人员了解需要更改哪些元素。

 引言

在本系列的第 2 部分中,我讨论了可以如何实现原始应用程序 Web 服务的业务流程并确定系统可以承载的可互操作 SOA 的最大个数,以避免 SOA 过载。在本系列的第 5 部分中,我强调了将业务流程规则作为优化 Web 服务的首要事项的重要性,并给出了一些示例,以说明可以如何减少 Web 请求的数量和执行时间。

在这一部分中,我将讨论基于 XML 的 Web 服务应用程序是如何变得过于庞大的。当大量使用 Web 服务时,这些 Web 服务将阻塞网络通信,从而导致系统过载。为了解决此问题,我将讨论可以如何应用 XML 二进制优化打包 (XOP) 规范(请参阅参考资料)来加速 Web 服务。

此标准草案旨在比当前 XML 解析器更有效地处理 Web 服务。解析器的行为更像解释器,而不是编译器。当解析器读写大型文件(特别是文本格式的大型文件)时,并不能达到其读取较小的文件或计算简单函数时的性能。甚至加密也可能使 Web 服务陷于停顿,因为必须执行复杂的计算才能获得希望的结果。

两个场景

我在第 2 部分中提到,从企业应用程序提取组件,然后将其重新构造为外部 Web 服务,这种做法更为恰当。如果这样,您就可以更改 Web 服务中的代码,而不用重新设计并编译长时间运行的大型复杂应用程序。

第一个 SOA 中经过重新设计而显得更加紧凑的应用程序(请参见图 1)可以通过发送 Web 请求来与第二个 SOA 中的外部企业 MRP(托管资源原型)Web 服务进行动态链接。而 MRP Web 服务又指向第三个 SOA 中的外部企业 CRM Web 服务。客户关系管理 (CRM) Web 服务随后将请求和信息发送到该应用程序以进行进一步处理。

图 1. 动态链接到 Web 服务
 
 让我们假定在任何给定时间都可能出现对多个基于 XML 的 Web 服务的多个 Web 请求。链接到其他遗留系统或大型企业系统的企业应用程序未在上图中显示,而这些系统又与接收多个 Web 请求的多个 Web 服务链接。当大量使用时,Web 服务会变得过于庞大,从而阻塞网络通信。

一个解决方案就是向基于 XML 的 MRP 和 CRM Web 服务应用 XOP 包(请参见图 2),从而以二进制格式进行处理。

图 2. 将 XOP 包应用于 Web 服务
 
 在第二个场景中,可以首先开发业务流程规则,然后开发根据现有 Web 服务构建新的 Web 服务所需的基于 XML 的 Web 请求。如果新的 Web 服务(业务逻辑 Web 服务或以数据为中心的 Web 服务)可以提供更好的或额外的服务和功能,则必须减少或完全消除冗余的 Web 请求、执行时间、访问时间和带宽。

问题在于,当创建新的 Web 服务并大量使用时,它们将会变得过于庞大。与第一个场景类似,您需要将 XOP 包应用于 Web 服务。对于这两个场景,您都需要与系统管理员协作,以确定在不引起系统过载的情况下可以使用 XOP 包的 Web 服务的最大数目。

XOP 处理前的 Infoset

为了理解 XOP 的工作方式,我将首先讨论一个与 SOAP 消息相似的 XML Infoset,其中描述了包含一张图片和一个签名的 XML 文档。在清单 1 中,我使用粗体来突出显示原始 XML Infoset,以说明哪些原始元素在 XOP 处理之前。

清单 1. XOP 处理前的 XML Infoset

<soap:Envelope
xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
xmlns:xop='http://www.w3.org/2003/12/xop/include'
xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'>
<soap:Body>
<m:data xmlns:m='http://example.org/stuff'>

<m:photo xmlmime:content-type='image/png'>
/aWKKapGGyQ=
</m:photo>
<m:sig xmlmime:content-type='application/pkcs7-signature'>
Faa7vROi2VQ=
</m:sig>`

</m:data>
</soap:Body>
</soap:Envelope>

正如您所看到的,其中有两个元素:m:photo 和 m:sig。m:photo 元素采用 base64 编码的内容为 /aWKKapGGyQ=,而 m:sig 元素采用 base64 编码的内容为 Faa7vROi2VQ=。这些元素也称为元素信息项。内容是元素的子项。请将该元素当作此子项的父项。子项是字符信息项,即包含字母数字字符的项。例如,m: photo 是子项 /aWKKapGGyQ= 的父项。该子项的名称不便阅读且难于发音,很容易出现键入错误。

当通过 XOP 处理放置 XML Infoset 时,可以解决此问题。XOP 的工作方式是:从原始 Infoset 提取优化内容,然后创建 XOP Infoset。优化内容是我刚刚谈到的经过缩减的内容。在清单 2 中,我突出显示了要删除的内容。

清单 2. 要删除的内容

<m:photo xmlmime:content-type='image/png'>
/aWKKapGGyQ=
</m:photo>
<m:sig xmlmime:content-type='application/pkcs7-signature'>`
Faa7vROi2VQ=
</m:sig>

XOP 处理后的 Infoset

XOP 处理涉及到三个步骤。第一步,使用 Infoset 中的二进制元素替换文本元素。第二步,在包含已替换元素的 Infoset 前添加 MIME 包。第三步,在该 Infoset 后添加另一个包。

第 1 步:替换元素

XOP 包使用名为 xop:Include 的新元素信息项来替换删除的内容。xop: Include 元素包含一个属性信息项,带有指向 XOP 包部分的链接,XOP 包承载从原始元素中删除的数据的二进制表示。在清单 3 中,我突出显示了替换原始 Infoset 中的图片和签名元素的内容的 xop: Include。

清单 3. 替换后的元素

<m:photo xmlmime:content-type='image/png'>
<xop:Include href='cid:http://example.org/me.png'/>
</m:photo>
<m:sig xmlmime:content-type='application/pkcs7-signature'>
<xop:Include href='cid:http://example.org/my.hsh'/>
</m:sig>

正如您所看到的, href='cid:http://example.org/me.png'/ 是图片元素的属性信息项,而 href='cid:http://example.org/my.hsh' 是签名元素的属性信息项。

更新 Infoset 部分(请参见清单 4)。而行数保持不变。

清单 4. 更新后的 XML Infoset 部分

<soap:Envelope
xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
xmlns:xop='http://www.w3.org/2003/12/xop/include'
xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'>
<soap:Body>
<m:data xmlns:m='http://example.org/stuff'>
<m:photo xmlmime:content-type='image/png'>
<xop:Include href='cid:http://example.org/me.png'/>
</m:photo>
<m:sig xmlmime:content-type='application/pkcs7-signature'>
<xop:Include href='cid:http://example.org/my.hsh'/>
</m:sig>
</m:data>
</soap:Body>
</soap:Envelope>

第 2 步:在 Infoset 前添加 MIME 包

为了完成更新,需要使用 MIME Multipart/Related 包中的 XOP 对原始 Infoset 进行序列化。XOP 是一种更有效的方法,用于序列化包含特定类型的 Xquery 和 Xpath 2.0 元素内容的 XML Infoset。

在更新后的 Infoset 前后各添加一个 MIME 包,以分别描述包含文本格式和二进制格式的图片和签名的 XML 文档。在清单 5 中,我突出显示了 XOP 包识别 8 位文本格式的 XML Infoset 的代码。

清单 5. Infoset 前的 XOP 包部分

MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
type=text/xml;start="<mymessage.xml@example.org>"
Content-Description: An XML document with my picture and signature in it
--MIME_boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: mymessage.xml@example.org

第 3 步:在 Infoset 后添加 MIME 包。

清单 6 显示了 XOP 包如何识别已被删除的数据的二进制表示。

清单 6. Infoset 后的 XOP 包部分

--MIME_boundary
Content-Type: image/png
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/me.png>
// binary octets for png
--MIME_boundary
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/my.hsh>
// binary octets for signature
--MIME_boundary--

正如您所看到的,Infoset 后的 Content-ID 的二进制内容,xop: Include element 中提到的链接代替了 Infoset 前的消息的文本内容。

最终结果

在清单 7 给出了序列化为 XOP 包的整个 XML Infoset。尽管其中还有其他行,但是此包比原始 Infoset 的 XML 解析器的效率高得多。

清单 7. 序列化为 XOP 包的 XML Infoset


MIME-Version: 1.0
Content-Type: Multipart/Related;boundary=MIME_boundary;
type=text/xml;start="<mymessage.xml@example.org>"
Content-Description: An XML document with my picture and signature in it
--MIME_boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: <mymessage.xml@example.org>
<soap:Envelope
xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
xmlns:xop='http://www.w3.org/2003/12/xop/include'
xmlns:xmlmime='http://www.w3.org/2004/06/xmlmime'>
<soap:Body>
<m:data xmlns:m='http://example.org/stuff'>
<m:photo xmlmime:content-type='image/png'>
<xop:Include href='cid:http://example.org/me.png'/>
</m:photo>
<m:sig xmlmime:content-type='application/pkcs7-signature'>
<xop:Include href='cid:http://example.org/my.hsh'/>
</m:sig>
</m:data>
</soap:Body>
</soap:Envelope>
--MIME_boundary
Content-Type: image/png
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/me.png>
// binary octets for png
--MIME_boundary
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: binary
Content-ID: <http://example.org/my.hsh>
// binary octets for signature
--MIME_boundary--

结束语

为了运行具有 XOP 包的 Web 服务,需要事先进行计划,以确定应该如何设计应用程序,从而避免高峰时过载。应该就优化 Web 服务时应采用何种编码技术与系统管理员团队进行沟通。

您会发现解决这些问题后,您的 Web 服务应用程序优化工作变得容易得多。您可以使用 IBM Relational Web Developer for WebSphere® Software 来开发基于业务流程的 Web 服务,然后在 SOA 内部及各个 SOA 之间将其与 XOP 包一起使用。管理员会发现,解决了这些问题也使得他们的网络管理工作变得更加轻松。他们能确定在不引起系统过载的前提下,可以将多少应用程序与 XOP 包一起使用。

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号