轉自【http://blog.csdn.net/thunder4393/article/details/5787121】,寫的很是好,以收藏。前端
1 摘要java
開發webservice應用程序中離不開框架的支持,當open-open站點列舉的就有30多種,這對於開發人員怎樣選擇帶來必定的疑惑。性能Webservice的關鍵要素,不一樣的框架性能上存在較大差別,而當前在官方站點、網絡資料中可以方便的找到各自框架的介紹,但是很是少有針對不一樣框架性能測試數據。本文選擇了比較流行幾個框架:Apache Axis一、Apache Axis二、Codehaus XFire、Apache CXF等,採用java做爲測試用例,經過本機和遠程兩種進行測試方式,對這幾種框架進行了性能測試,並對測試結果分析和性能比較,最後並對性能優異的框架進行了推薦。web
關鍵詞:Axis一、Axis二、XFire、CXF、Spring、SOAP、StAX、WSDLspring
Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供建立server端、client和網關SOAP操做的基本框架。但Axis並不全然是一個SOAP引擎,它還包含:apache
l 是一個獨立的SOAPserver。編程
l 是一個嵌入Servlet引擎(好比Tomcat)的server。安全
l 支持WSDL。網絡
l 提供轉化WSDL爲Java類的工具。架構
l 提供樣例程序。框架
l 提供TCP/IP數據包監視工具。
Apache Axis2相比Apache Axis1更加有效、更加模塊化、更加面向xml,支持easy插件模塊擴展新功能和特性,好比安全和可靠。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.一、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 client和服務端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 easy使用。CXF設計的簡潔和直觀,具備簡潔APIs迅速的構建基於代碼的服務,Maven插件使得工具集成更加easy、JAX-WS API支持、Spring 2.x XML使得配置更加easy。
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.四、spring 2.x |
client代碼 |
public void testgetVersion() throws java.lang.Exception { |
服務端代碼 |
public String getVersion() |
測試方法 |
本機接口測試,client和服務端都在A測試機上進行; |
遠程接口測試,A測試機做爲client,B測試機做爲server。本次測試是在局域網內完畢。 |
|
結果精度 |
數字精確到小數點後兩位 |
名詞解釋 |
server端:部署到server的程序。 |
client:發起請求調用server上webservcie的程序。 |
|
client初時化時間:發起接口調用時,初始化clientjava對象所需時間。 |
表格 2在端對端性能上,一個client驅動程序使用了一個胖clientWeb服務堆棧來發送和接受SOAP請求 |
Webservice服務端 |
Webserviceclient Webservice stack |
SOAP over HTTP |
本次假定在一樣網絡、主機環境條件下進行測試,所以性能的區別主要是由不一樣框架實現機制的所決定。
l 採用兩種方式測試:本機測試、遠程測試。
l server端分別採用:axis一、axis二、xfire、CXF,對於選定的server端,用不一樣框架相應的工具包wsdl生成clientstub代碼進行測試。
l 服務端接口內部沒有複雜業務邏輯,client調用時,只返回一個字符串。
l 每次執行,採用java循環方式調用10次服務端接口,並記錄下從發起到返回結果的時間。
限於篇幅,本文僅提供了:以CXF框架爲服務端的具體測試結果,及其各個框架的綜合後測試結果。
表格 3以CXF做爲服務端測試具體結果
本機測試結果(單位:ms) |
||||||||||||
server端 |
cxf |
|||||||||||
client |
cxf |
axis1 |
||||||||||
client初始化 |
第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) |
||||||||||||
server端 |
cxf |
|||||||||||
client |
cxf |
axis1 |
||||||||||
client初始化 |
第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) |
||||||||
server端 |
axis2 |
axis1 |
xfire |
cxf |
||||
client |
axis2 |
axis1 |
axis1 |
axis2 |
xfire+spring |
axis1 |
cxf |
axis1 |
client初始化 |
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) |
||||||||
client初始化 |
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 client初次調用,初始化clientstub對象時,大約在:600ms~2500ms。由於需要創建網絡鏈接,初始化java相關對象,所以耗時較長。
l client初始化stub後,接口初次調用,大約在:400ms~1000ms。相比興許的接口調用時間最長。
l 在第一次調用完成後,隨後的調用中,性能都明顯提高。大約在:7ms~30ms。
l 本機測試與遠程測試,性能上差距很是微小,在快速的局域網內,性能區別差點兒可以忽略。
l 在一樣的服務端下,採用不一樣框架生成的stub代碼調用時,時間上也存在必定的差別。
實際應用中,接口的調用都是在網絡的不一樣的機器之間進行,本文也重點關注遠程調用測試結果,在測試結果比較上,可以看出:
l 最優組合是最差組合性能的5倍多。
n 最優的組合爲:cxfclient+ cxf服務端,6ms左右。
n 最差的組合爲:axis1client+ axis1服務端,32ms左右。
l CXF做爲服務端,對於不一樣的client調用時,性能最佳。
本文對幾種流行webservice框架的性能的實際測試,對開發人員選擇框架時提供了一個關於性能方面參考。Apache CXF是Codehaus XFire 的第二代產品,眼下在不一樣框架中性能最佳,應該是開發人員不錯的選擇,這與它自己的架構設計不無關係。相比其它框架,CXF具備幾個突出的特性:支持JAX-WS、Spring集成、Aegi數據綁定、支持RESTful services、支持WS-*、Apache協議、代碼實現簡潔。Apache Axis2是Apache Axis1的第二代產品,架構上也很不錯,關鍵特性:支持各類規範、可插拔模塊化設計、支持熱部署等。與CXF相比性能也很優異。
在服務端框架肯定的場景下,最好是採用該框架生成client代碼,這樣配合性能可達到更佳。在實際的項目中,開發人員在選擇詳細那個框架時,仍還需綜合評估框架的開發組織、產品路線圖、文檔化程度、應用普遍度、與優異框架的集成度、靈活和擴展性等因素。