Metro Web 服務堆棧是基於 JAXB 2.x 數據綁定和 JAX-WS 2.x Web 服務標准的參考實現,但它使用額外的組件來提供由 JAX-WS 定義的基本支持以外的特性。WS-Security 與其他 SOAP 擴展技術由 Web Services Interoperability Technologies (WSIT) 項目實施,實際的 WS-Security 處理由另一個附加組件實現:XML and WebServices Security Project (XWSS)。
關於本系列
Web 服務構成了 Java 技術在企業計算應用中的關鍵部分。在本系列文章中,XML 和 Web 服務顧問 Dennis Sosnoski 介紹了對於使用 Web 服務的 Java 開發人員來說比較重要的主要框架和技術。通過跟隨本系列的學習,您將了解到該領域的最新進展,並且知道如何使用它們來為您的編程項目提供幫助。
Axis2 基於完全不同的技術,包括默認的 Axis2 Data Binding (ADB) 數據綁定實現、Axis2 引擎本身,以及用於 WS-Security 支持、聯合 Web Services Security for Java (WSS4J) 的 Rampart 模塊。本系列較早的一篇文章 “WS-Security 的大開銷” 介紹了 Axis2 Web 服務堆棧中 WS-Security 處理對性能的影響。
“Metro 簡介” 與 “Metro 服務下的 WS-Security” 向您展示了這兩個堆棧在安裝、配置以及實際使用上的區別。本文著眼於兩者性能上的不同,包括使用 WS-Security 時的不同。
檢查性能
和 “WS-Security 的大開銷” 一文類似,本文采用以下方法:當客戶端和服務器在一個單一系統上運行時,測量執行一個特殊請求序列所需的時間。這種方法在比較 Web 服務處理開銷上很有用,因為網絡延遲的影響和開銷可以從時間結果中排除。假設客戶端代碼不會比服務器緩慢很多,這個數據就是服務器在負載情況下的實際性能的最好表示。
本文采用和早前文章相同的測試應用程序:一個地震數據檢索服務。這個服務采用一個實際的數據庫,它包含在一段時間內在全世界發生的 93,000 多次地震的記錄。該服務的請求指定一個時間范圍和一個地理坐標范圍,然後服務返回指定范圍內的所有地震信息。參閱 “WS-Security 的大開銷” 了解更多詳細信息和一個請求-響應消息對示例。
正如之前的文章所述,有兩組請求序列用於性能測試。第一組使用 1,000 條請求,通過調整過的查詢參數來找到整個地震數據庫中匹配的一小部分(對這 1,000 條請求僅返回 816 個匹配的地震)。第二組用 100 條請求進行調整,找到數據庫中匹配的一大部分(對這 100 條請求返回 176,745 個匹配地震)。每個請求序列在不同的安全配置條件下進行多次運行,只有每個配置下最好的一次能夠保存在結果中。
測試在配備 Athlon X2 5400+ 處理器和 4 GB 的 RAM 的 Mandriva 2009.1 64-bit Linux 系統中運行,使用一個 Sun Java 1.6.0_13 32-bit JVM (對於給定的堆大小,它比 64-bit JVM 有更好的性能)。服務器代碼在 Tomcat 6.0.20 上運行,配置使用 1024 MB 的堆,而客戶端代碼使用 512 MB 的堆。Web 服務堆棧的版本是 Metro 1.5 (它包含有 WSIT 和 XWSS),以及有當前版本 Rampart 代碼的 Axis2 1.5.1 (因為還沒有和 Axis2 1.5.x 代碼匹配的 Rampart 發布)。
早前的文章只檢查 Axis2 的性能,包含純文本、SSL 和各種 WS-Security/WS-SecureConversation 配置。本文使用一組更有限的配置,但直接對比各配置下 Axis2 和 Metro 的性能。
未使用 WS-Security 時的性能
圖 1 顯示了沒有任何 WS-Security 使用時 Axis2 和 Metro 兩者測量到的測試時間。該圖表顯示這兩個堆棧之間只有微小差別。在有 1,000 條指令和較少響應的測試中,Metro 比 Axis2 快 0.5 秒。在有 100 條請求和較多響應的測試中,兩個堆棧是一樣快(在 0.1 秒內)。
圖 1. 沒有安全設置時的測試時間
這些時間結果顯示(對測試應用程序所用的數據)Metro 在處理每條請求的時間上,可能比 Axis2 稍快,但是在實際數據會話時它們不相上下(當使用和 Axis2 綁定的默認 ADB 數據時 — 其他數據綁定可能有不同結果,特別是 XMLBeans 綁定,它要慢很多)。
使用 WS-Security 時的性能
隨後的兩組數據顯示了遵循安全配置的相對測試時間:
plain — 無安全性(和 圖 1 中值相同,但針對 Axis2 的時間規范化)
username — 在請求上的 WS-Security 純文本 UsernameToken
sign — 有時間戳的 WS-Security 頭部和主體簽名
signencr — 有時間戳和主體加密的 WS-Security 主體和頭部簽名
圖 2 和 圖 3 以 Axis2 一般時間的倍數顯示測量到的時間,方便比較結果。圖 2 顯示了有較少響應的 1,000 條請求的時間:
圖 2. 較少響應測試
圖 3 顯示了有較多響應的 100 條請求的時間:
圖 3. 較多響應測試
Metro 在 WS-Security 配置下要比 Axis2 快兩倍,在大消息的 username 和 sign 配置下要快三倍以上。這對處於同一成熟度上的兩 Web 服務堆棧是個驚人的結果。
Rampart 有使用 org.apache.rampart.TIME 日志程序的基本內置時間日志。通過在 DEBUG 級別啟用這個日志程序,您會發現 Rampart 處理的各個部分所需的時鐘時間。奇怪的是,當我對簽名例子這麼做時,我發現 Rampart 處理時間只占了測試所需總時間的不到一半。這表示 Axis2/Rampart WS-Security 處理的主要性能問題不在於 Rampart 和底層 WSS4J 安全的實現。
Rampart 肯定還有很多改進的空間。正如 “WS-Security 的大開銷” 中提到的,Rampart 並沒有在 WS-Security 參與進來的任何時候構建一個完整的消息內存模型(in-memory model)。構建內存模型的開銷就是在 UsernameToken 例子中 Axis2/Rampart 表現不佳的明顯原因。Axis2/Rampart 在其它 WS-Security 場景中表現不佳的原因也可能和這種類似的轉換問題相關。
結束語
Metro 的獨立使用配置可能比較古怪,特別是考慮到有限的文檔可用性。 Metro 也只能與 JAXB 2.x 數據綁定和 JAX-WS 2.x Web 服務配置一起使用,和 Axis2 支持的更大范圍數據綁定和替代配置剛好相反。但 Metro 對純文本信息交換提供和 Axis2 一樣的性能,在使用 WS-Security 時還有比 Axis2 更好的性能。如果您正在使用 WS-Security,並且關注性能,您應該考慮在您的應用程序中使用 Metro。
下一篇文章將轉為介紹 CXF Web 服務堆棧 —— 另一個 Apache Foundation 項目。CXF 使用和 Axis2 相同的部分底層組件,但在配置和部署 Web 服務方面卻截然不同。您將了解到 CXF 的基本用途,以及它和 Axis2、Metro 的區別。
來源:
http://www.ibm.com/developerworks/cn/java/j-jws11/