幾種流行Webservice框架性能對比

1      摘要

開發webservice應用程序中離不開框架的支持,當open-open網站列舉的就有30多種,這對於開發者如何選擇帶來必定的疑惑。性能Webservice的關鍵要素,不一樣的框架性能上存在較大差別,而當前在官方網站、網絡資料中能夠方便的找到各自框架的介紹,可是不多有針對不一樣框架性能測試數據。本文選擇了比較流行幾個框架:Apache Axis1Apache Axis2Codehaus XFireApache CXF等,採用java做爲測試用例,經過本機和遠程兩種進行測試方式,對這幾種框架進行了性能測試,並對測試結果分析和性能比較,最後並對性能優異的框架進行了推薦。前端

關鍵詞:Axis1Axis2XFireCXFSpringSOAPStAXWSDLjava

2      框架介紹

2.1      Apache Axis1

Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供建立服務器端、客戶端和網關SOAP操做的基本框架。但Axis並不徹底是一個SOAP引擎,它還包括:web

l  是一個獨立的SOAP服務器。spring

l  是一個嵌入Servlet引擎(例如Tomcat)的服務器。apache

l  支持WSDL編程

l  提供轉化WSDLJava類的工具。安全

l  提供例子程序。服務器

l  提供TCP/IP數據包監視工具。網絡

2.2      Apache Axis2

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.1WSDL2.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  良好的擴展性。

2.3      Codehaus XFire

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

2.4      Apache CXF

Apache CXF是一個開源服務框架。CXF可用前端編程APIs開發服務,好比:JAX-WS and JAX-RS,主要特性包括:

l  支持Web services標準。包括:SOAPthe WSI Basic ProfileWSDLWS-AddressingWS-PolicyWS-ReliableMessagingWS-SecurityWS-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類型綁定,例如:JSONCORBA

3      測試準備

表格 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.4spring 2.x

客戶端代碼

public void testgetVersion() throws java.lang.Exception {
  String url = "http://localhost:8081/boss/services/Calculate";
  //
客戶端初時化時間
  long startTime = System.currentTimeMillis();
  //
客戶端stub代碼分別是axis1/axis2/xfire/cxf框架 wsdl2java生成
  CalculateCalculateHttpportStub stub = new CalculateCalculateHttpportStub(url);
  long endTime = System.currentTimeMillis();
  System.out.println("client init time is: " + (endTime - startTime));
 
  //
連續調用10
  for (int i = 0; i < 10; i++) {
   long startTime1 = System.currentTimeMillis();
   String ret = stub.getVersion().get_return();
   long endTime1 = System.currentTimeMillis();

   System.out.println("[" + i + "] elapsed time is: " + (endTime1 - startTime1) + " ms");
   System.out.println("stub.getVersion() is: " + ret);
  }
 }

服務端代碼

public String getVersion()
注:接口無任何業務邏輯,只返回一個字符串:"Hello";

測試方法

本機接口測試,客戶端和服務端都在A測試機上進行;

遠程接口測試,A測試機做爲客戶端,B測試機做爲服務器。本次測試是在局域網內完成。

結果精度

數字精確到小數點後兩位

名詞解釋

服務器端:部署到服務器的程序。

客戶端:發起請求調用服務器上webservcie的程序。

客戶端初時化時間:發起接口調用時,初始化客戶端java對象所需時間。
例如:CalculateCalculateHttpportStub stub = new CalculateCalculateHttpportStub(url); // 由框架 wsdl2java生成客戶端stub

 

 

表格 2在端對端性能上,一個客戶端驅動程序使用了一個胖客戶端Web服務堆棧來發送和接受SOAP請求

Webservice服務端

Webservice客戶端

Webservice stack

SOAP over HTTP

4      性能測試

4.1      測試方法

本次假定在相同網絡、主機環境條件下進行測試,所以性能的差異主要是由不一樣框架實現機制的所決定。

l  採用兩種方式測試:本機測試、遠程測試。

l  服務器端分別採用:axis1axis2xfireCXF,對於選定的服務器端,用不一樣框架對應的工具包wsdl生成客戶端stub代碼進行測試。

l  服務端接口內部沒有複雜業務邏輯,客戶端調用時,僅僅返回一個字符串。

l  每次運行,採用java循環方式調用10次服務端接口,並記錄下從發起到返回結果的時間。

4.2      測試結果

限於篇幅,本文僅提供了:以CXF框架爲服務端的詳細測試結果,及其各個框架的綜合後測試結果。

 

表格 3CXF做爲服務端測試詳細結果

本機測試結果(單位: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

 

4.3      結果分析

從數據能夠看出,有下面幾個特色:

l  客戶端初次調用,初始化客戶端stub對象時,大約在:600ms2500ms。因爲須要創建網絡鏈接,初始化java相關對象,所以耗時較長。

l  客戶端初始化stub後,接口初次調用,大約在:400ms1000ms。相比後續的接口調用時間最長。

l  在第一次調用完畢後,隨後的調用中,性能都明顯提高。大約在:7ms30ms

l  本機測試與遠程測試,性能上差距很微小,在高速的局域網內,性能差異幾乎能夠忽略。

l  在相同的服務端下,採用不一樣框架生成的stub代碼調用時,時間上也存在必定的差別。

 

實際應用中,接口的調用都是在網絡的不一樣的機器之間進行,本文也重點關注遠程調用測試結果,在測試結果比較上,能夠看出:

l  最優組合是最差組合性能的5倍多。

n  最優的組合爲:cxf客戶端+ cxf服務端,6ms左右。

n  最差的組合爲:axis1客戶端+ axis1服務端,32ms左右。

l  CXF做爲服務端,對於不一樣的客戶端調用時,性能最佳。

5      結束語

本文對幾種流行webservice框架的性能的實際測試,對開發者選擇框架時提供了一個關於性能方面參考。Apache CXFCodehaus XFire 的第二代產品,目前在不一樣框架中性能最佳,應該是開發者不錯的選擇,這與它自己的架構設計不無關係。相比其餘框架,CXF具備幾個突出的特性:支持JAX-WSSpring集成、Aegi數據綁定、支持RESTful services、支持WS-*Apache協議、代碼實現簡潔。Apache Axis2Apache Axis1的第二代產品,架構上也很是不錯,關鍵特性:支持各類規範、可插拔模塊化設計、支持熱部署等。與CXF相比性能也很是優異。

在服務端框架肯定的場景下,最好是採用該框架生成客戶端代碼,這樣配合性能可達到更佳。在實際的項目中,開發者在選擇具體那個框架時,仍還需綜合評估框架的開發組織、產品路線圖、文檔化程度、應用普遍度、與優異框架的集成度、靈活和擴展性等因素。


 

相關文章
相關標籤/搜索