您是否希望了解如何使用 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 包一起使用。