開發webservice應用程序中離不開框架的支持,當open-open網站列舉的就有30多種,這對於開發者如何選擇帶來必定的疑惑。性能Webservice的關鍵要素,不一樣的框架性能上存在較大差別,而當前在官方網站、網絡資料中能夠方便的找到各自框架的介紹,可是不多有針對不一樣框架性能測試數據。本文選擇了比較流行幾個框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF等,採用java做爲測試用例,經過本機和遠程兩種進行測試方式,對這幾種框架進行了性能測試,並對測試結果分析和性能比較,最後並對性能優異的框架進行了推薦。前端
關鍵詞:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDLjava
Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供建立服務器端、客戶端和網關SOAP操做的基本框架。但Axis並不徹底是一個SOAP引擎,它還包括:web
l 是一個獨立的SOAP服務器。spring
l 是一個嵌入Servlet引擎(例如Tomcat)的服務器。apache
l 支持WSDL。編程
l 提供轉化WSDL爲Java類的工具。安全
l 提供例子程序。服務器
l 提供TCP/IP數據包監視工具。網絡
Apache Axis2相比Apache Axis1更加有效、更加模塊化、更加面向xml,支持容易插件模塊擴展新功能和特性,例如安全和可靠。Apache Axis2是基於Apache AXIOM,它是一個高性能、pull-based XML對象模型。Apache Axis2的關鍵特性:架構
l 解析xml更快。採用本身的對象模型和StAX (Streaming API for XML)。
l 更低的內存佔用。
l 支持熱部署。新服務加入到系統,無需重啓服務。
l 支持異步 webservice、
l MEP支持,靈活支持在WSDL 2.0定義的Message Exchange Patterns (MEPs)
l 更加靈活。引擎給開發人員提供了充足的自由度可擴展客戶頭信息處理、系統管理、
l 更加穩定性。
l 傳輸框架不依賴於具體協議。爲集成和傳輸協議(SMTP, FTP, message-oriented middleware, etc)有一個簡單和抽象,引擎核心是徹底獨立於具體的傳輸協議。
l 支持WSDL。支持WSDL1.1、WSDL2.0。
l 方便集成其餘組件(Add-ons)。幾個web services已經被集成,包括:WSS4J for security (Apache Rampart), Sandesha for reliable messaging, Kandula which is an encapsulation of WS-Coordination, WS-AtomicTransaction and WS-BusinessActivity.
l 良好的擴展性。
XFire核心是一個輕量的基於STAX消息處理模型,用來與SOAP消息交互,它支持不一樣類型的綁定機制、容器和傳輸協議。
支持webservice標準- SOAP, WSDL, WS-I Basic Profile, WS-Addressing, WS-Security, etc.
l 高性能SOAP STACK
l 可插拔綁定POJOs, XMLBeans, JAXB 1.1, JAXB 2.0, and Castor support
l 經過Java1.5 和1.4(Commons attributes JSR 181 syntax)使用JSR 181 API配置服務
l 支持多中傳輸協議- HTTP, JMS, XMPP, In-JVM, etc.
l 可嵌入的和直觀的API
l 支持Spring, Pico, Plexus, and Loom
l 支持JBI
l 客戶端和服務端stub代碼生成
l 支持JAX-WS early access
Apache CXF是一個開源服務框架。CXF可用前端編程APIs開發服務,好比:JAX-WS and JAX-RS,主要特性包括:
l 支持Web services標準。包括:SOAP、the WSI Basic Profile、WSDL、WS-Addressing、WS-Policy、WS-ReliableMessaging、WS-Security、WS-SecureConversation 和WS-SecurityPolicy.
l 支持不一樣類型前端開發模型。CXF實現了JAX-WS APIs,支持JAX-RS開發。
l 容易使用。CXF設計的簡潔和直觀,具備簡潔APIs迅速的構建基於代碼的服務,Maven插件使得工具集成更加容易、JAX-WS API支持、Spring 2.x XML使得配置更加容易。
l 支持二進制和遺留協議。CXF被設計爲可插拔的架構,在不一樣的傳輸協議結合下,不只支持XML,也支持非XML類型綁定,例如:JSON和CORBA。
表格 1測試基本元素
測試條件 |
描述 |
主機環境 |
A測試機:CPU:1.60GHz;內存:1.37G |
B測試機:CPU:1.83GHz;內存:1G |
|
Web服務 |
axis1 1.3 |
axis2 1.2 |
|
xfire 1.2.6 |
|
應用環境 |
jdk 1.4、spring 2.x |
客戶端代碼 |
public void testgetVersion() throws java.lang.Exception { |
服務端代碼 |
public String getVersion() |
測試方法 |
本機接口測試,客戶端和服務端都在A測試機上進行; |
遠程接口測試,A測試機做爲客戶端,B測試機做爲服務器。本次測試是在局域網內完成。 |
|
結果精度 |
數字精確到小數點後兩位 |
名詞解釋 |
服務器端:部署到服務器的程序。 |
客戶端:發起請求調用服務器上webservcie的程序。 |
|
客戶端初時化時間:發起接口調用時,初始化客戶端java對象所需時間。 |
表格 2在端對端性能上,一個客戶端驅動程序使用了一個胖客戶端Web服務堆棧來發送和接受SOAP請求 |
Webservice服務端 |
Webservice客戶端 Webservice stack |
SOAP over HTTP |
本次假定在相同網絡、主機環境條件下進行測試,所以性能的差異主要是由不一樣框架實現機制的所決定。
l 採用兩種方式測試:本機測試、遠程測試。
l 服務器端分別採用:axis1、axis2、xfire、CXF,對於選定的服務器端,用不一樣框架對應的工具包wsdl生成客戶端stub代碼進行測試。
l 服務端接口內部沒有複雜業務邏輯,客戶端調用時,僅僅返回一個字符串。
l 每次運行,採用java循環方式調用10次服務端接口,並記錄下從發起到返回結果的時間。
限於篇幅,本文僅提供了:以CXF框架爲服務端的詳細測試結果,及其各個框架的綜合後測試結果。
表格 3以CXF做爲服務端測試詳細結果
本機測試結果(單位:ms) |
||||||||||||
服務器端 |
cxf |
|||||||||||
客戶端 |
cxf |
axis1 |
||||||||||
客戶端初始化 |
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
|
2547 |
2594 |
2563 |
2578 |
2563 |
2569 |
422 |
422 |
407 |
406 |
421 |
415.6 |
連續10次調用接口測試 |
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
1 |
297 |
281 |
281 |
282 |
266 |
281.4 |
234 |
219 |
219 |
234 |
219 |
225 |
2 |
0 |
0 |
0 |
15 |
15 |
|
0 |
16 |
0 |
0 |
16 |
|
3 |
0 |
16 |
16 |
0 |
0 |
|
16 |
15 |
16 |
16 |
0 |
|
4 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
0 |
0 |
15 |
|
5 |
16 |
0 |
0 |
0 |
0 |
|
15 |
16 |
15 |
0 |
0 |
|
6 |
0 |
15 |
15 |
0 |
16 |
|
0 |
0 |
0 |
16 |
0 |
|
7 |
0 |
0 |
0 |
0 |
0 |
|
16 |
16 |
16 |
0 |
16 |
|
8 |
15 |
0 |
0 |
0 |
0 |
|
0 |
0 |
0 |
15 |
0 |
|
9 |
0 |
0 |
0 |
0 |
15 |
|
16 |
15 |
16 |
0 |
16 |
|
10 |
0 |
16 |
16 |
15 |
0 |
|
0 |
0 |
0 |
16 |
0 |
|
10次平均值 |
32.8 |
32.8 |
32.8 |
31.2 |
31.2 |
32.16 |
29.7 |
29.7 |
28.2 |
29.7 |
28.2 |
29.61 |
後9次平均值 |
3.444 |
5.222 |
5.222 |
3.333 |
5.111 |
4.467 |
7 |
8.667 |
7 |
7 |
7 |
7.333 |
遠程測試結果(單位:ms) |
||||||||||||
服務器端 |
cxf |
|||||||||||
客戶端 |
cxf |
axis1 |
||||||||||
客戶端初始化 |
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
|
2703 |
2547 |
2578 |
2563 |
2531 |
2584 |
406 |
406 |
422 |
407 |
422 |
412.6 |
連續10次調用接口測試 |
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
第1組 |
第2組 |
第3組 |
第4組 |
第5組 |
|
1 |
344 |
281 |
281 |
281 |
297 |
296.8 |
219 |
234 |
235 |
234 |
687 |
321.8 |
2 |
0 |
0 |
16 |
16 |
16 |
|
16 |
0 |
15 |
16 |
16 |
|
3 |
0 |
16 |
0 |
0 |
0 |
|
62 |
16 |
0 |
0 |
0 |
|
4 |
16 |
0 |
16 |
15 |
0 |
|
47 |
16 |
16 |
15 |
16 |
|
5 |
0 |
15 |
0 |
0 |
15 |
|
16 |
15 |
15 |
16 |
0 |
|
6 |
0 |
0 |
15 |
16 |
0 |
|
31 |
0 |
0 |
0 |
15 |
|
7 |
0 |
16 |
0 |
0 |
16 |
|
16 |
16 |
16 |
15 |
0 |
|
8 |
15 |
0 |
0 |
0 |
0 |
|
31 |
0 |
16 |
16 |
16 |
|
9 |
0 |
16 |
16 |
15 |
0 |
|
31 |
15 |
0 |
0 |
0 |
|
10 |
0 |
0 |
0 |
0 |
15 |
|
31 |
16 |
15 |
16 |
15 |
|
10次平均值 |
37.5 |
34.4 |
34.4 |
34.3 |
35.9 |
35.3 |
50 |
32.8 |
32.8 |
32.8 |
76.5 |
43.37 |
後9次平均值 |
3.444 |
7 |
7 |
6.889 |
6.889 |
6.244 |
31.22 |
10.44 |
10.33 |
10.44 |
8.667 |
14.22 |
表格 4不一樣框架本機和遠程測試結果
本機測試結果(單位:ms) |
||||||||
服務器端 |
axis2 |
axis1 |
xfire |
cxf |
||||
客戶端 |
axis2 |
axis1 |
axis1 |
axis2 |
xfire+spring |
axis1 |
cxf |
axis1 |
客戶端初始化 |
656.4 |
1138 |
1325 |
762.2 |
0 |
1340.6 |
2569 |
451.6 |
10次中的初次調用值 |
546.4 |
568.8 |
484.2 |
434.8 |
1022 |
987.4 |
281.4 |
225 |
10次平均值 |
62.48 |
66.7 |
73.44 |
57.22 |
119.2 |
120.9 |
32.16 |
29.61 |
後9次平均值 |
8.71 |
11.84 |
27.8 |
15.27 |
18.84 |
25 |
4.467 |
7.333 |
遠程測試結果(單位:ms) |
||||||||
客戶端初始化 |
672.8 |
1040 |
axis1 |
772 |
0 |
2994 |
2584 |
421.6 |
10次中的初次調用值 |
645.8 |
606 |
684.4 |
427.8 |
1010 |
1190 |
296.8 |
321.8 |
10次平均值 |
71.58 |
70.36 |
97.82 |
60.28 |
117.2 |
139.1 |
35.3 |
43.37 |
後9次平均值 |
7.78 |
10.58 |
32.64 |
19.44 |
18.04 |
27.13 |
6.244 |
14.22 |
從數據能夠看出,有下面幾個特色:
l 客戶端初次調用,初始化客戶端stub對象時,大約在:600ms~2500ms。因爲須要創建網絡鏈接,初始化java相關對象,所以耗時較長。
l 客戶端初始化stub後,接口初次調用,大約在:400ms~1000ms。相比後續的接口調用時間最長。
l 在第一次調用完畢後,隨後的調用中,性能都明顯提高。大約在:7ms~30ms。
l 本機測試與遠程測試,性能上差距很微小,在高速的局域網內,性能差異幾乎能夠忽略。
l 在相同的服務端下,採用不一樣框架生成的stub代碼調用時,時間上也存在必定的差別。
實際應用中,接口的調用都是在網絡的不一樣的機器之間進行,本文也重點關注遠程調用測試結果,在測試結果比較上,能夠看出:
l 最優組合是最差組合性能的5倍多。
n 最優的組合爲:cxf客戶端+ cxf服務端,6ms左右。
n 最差的組合爲:axis1客戶端+ axis1服務端,32ms左右。
l CXF做爲服務端,對於不一樣的客戶端調用時,性能最佳。
本文對幾種流行webservice框架的性能的實際測試,對開發者選擇框架時提供了一個關於性能方面參考。Apache CXF是Codehaus XFire 的第二代產品,目前在不一樣框架中性能最佳,應該是開發者不錯的選擇,這與它自己的架構設計不無關係。相比其餘框架,CXF具備幾個突出的特性:支持JAX-WS、Spring集成、Aegi數據綁定、支持RESTful services、支持WS-*、Apache協議、代碼實現簡潔。Apache Axis2是Apache Axis1的第二代產品,架構上也很是不錯,關鍵特性:支持各類規範、可插拔模塊化設計、支持熱部署等。與CXF相比性能也很是優異。
在服務端框架肯定的場景下,最好是採用該框架生成客戶端代碼,這樣配合性能可達到更佳。在實際的項目中,開發者在選擇具體那個框架時,仍還需綜合評估框架的開發組織、產品路線圖、文檔化程度、應用普遍度、與優異框架的集成度、靈活和擴展性等因素。