1. 程式人生 > >幾種流行Webservice框架效能對比(轉載、拼接)

幾種流行Webservice框架效能對比(轉載、拼接)

1摘要

開發webservice應用程式中離不開框架的支援,當open-open網站列舉的就有很多種,這對於開發者如何選擇帶來一定的疑惑。效能Webservice的關鍵要素,不同的框架效能上存在較大差異,而當前在官方網站、網路資料中可以方便的找到各自框架的介紹,但是很少有針對不同框架效能測試資料。本文選擇了比較流行幾個框架:

Apache Axis1Apache Axis2CodehausXFireApache CXFApache WinkJboss  RESTEasysun JAX-WS最簡單、方便)、阿里巴巴  Dubbo(除外)等,採用java作為測試用例,通過本機和遠端兩種進行測試方式,對這幾種框架進行了效能測試,並對測試結果分析和效能比較,最後並對效能優異的框架進行了推薦。

REST(新型):表象化狀態轉變 (軟體架構風格)RESTEasyWinkCXFAxis2…….

SOAP(比較成熟):簡單物件訪問協議XfireAxis2CXFAxis1

XML-RPC(淘汰):遠端過程呼叫協議慢慢被soap 所取代

REST 簡單易用,效率高,貌似未來有很大的發展空間,也有宣稱rest效能個方便比soap強大的,已經有很多框架宣稱對rest進行支援比如spring 3.0struts…….. 百度觀點

SOAP 成熟度較高,安全性較好

關鍵詞:Axis1Axis2XFireCXFSpringSOAPStAXWSDL

2      框架介紹

Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供建立伺服器端、客戶端和閘道器SOAP操作的基本框架。但Axis並不完全是一個SOAP引擎,它還包括:

l是一個獨立的SOAP伺服器。

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

l支援WSDL

l提供轉化WSDLJava類的工具。

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

lMEP支援,靈活支援在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, Kandulawhich 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

2.4      Apache CXF

Apache CXF是一個開源服務框架。Apache CXF = Celtix + XFireApache CXF 的前身叫 Apache CeltiXfire,現在已經正式更名為 Apache CXF 了,以下簡稱為 CXFCXF 繼承了CeltixXFire兩大開源專案的精華,比如:JAX-WS and JAX-RS,主要特性包括:

l支援Web services標準。包括:SOAPthe WSI Basic ProfileWSDLWS-AddressingWS-PolicyWS-ReliableMessagingWS-SecurityWS-SecureConversationWS-SecurityPolicy.

l支援不同型別前端開發模型。CXF實現了JAX-WS APIs,支援JAX-RS開發。

l容易使用。CXF設計的簡潔和直觀,具有簡潔APIs迅速的構建基於程式碼的服務,Maven外掛使得工具整合更加容易、JAX-WS API支援、Spring 2.x XML使得配置更加容易。

l支援二進位制和遺留協議。CXF被設計為可插拔的架構,在不同的傳輸協議結合下,不僅支援XML,也支援非XML型別繫結,例如:JSONCORBA

2.5 RESTEasy百度觀點較好

RESTEasyJBoss的一個開源專案,提供各種框架幫助你構建RESTful Web ServicesRESTful Java應用程式。它是JAX-RS規範的一個完整實現並通過JCP認證。作為一個JBOSS的專案,它當然能和JBOSS應用伺服器很好地整合在一起。但是,它也能在任何執行JDK5或以上版本的Servlet容器中執行。RESTEasy還提供一個RESTEasy JAX-RS客戶端呼叫框架。能夠很方便與EJBSeamGuiceSpringSpring MVC整合使用。支援在客戶端與伺服器端自動實現GZIP解壓縮。(資料少無法比較)

有較專業的人士對CXFRestletRESTEasyJersey框架測試資料,他說從效能上看RESTEasy是最好的,Jersey其次(但Jersey連可查閱的英文文件都比較少故個人不推薦使用)cxfRestlet最差,

2.6  Dubbo (個人觀點----無理由

Dubbo阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和Spring框架無縫整合。(資料少無法比較)

2.7 java6JAX-WS

JAX-WS2.0 (JSR 224)Sun新的web services協議棧

JAVA中有三種WebService規範,分別是JAX-WSJAX-RPC)、JAX-RSJAXM&SAAJ

JAX-WSJava API For XML-WebService),JDK1.6 自帶的版本為JAX-WS2.1,其底層支援為JAXB。早期的JAVA Web服務規範JAX-RPCJava API ForXML-Remote Procedure Call)目前已經被JAX-WS 規範取代,JAX-WS JAX-RPC 的演進版本,但JAX-WS 並不完全向後相容JAX-RPC()

2.8 Apache Wink

REST(Representational State Transfer)  based Web Servicehttp://baike.soso.com/v812054.htm是相對於傳統的Web Service(SOAP+WSDL+UDDI)而提出的。傳統的Web Service可以很好的解決異構系統之間的通訊問題,但是需要首先定義好XML格式的合同(WSDL),client和server都必須嚴格遵守協議,不容易升級以及叢集伸縮REST Web Service不需要事先定義格式,傳輸的內容也可以依據不同的client變化(json,xml,html等),最重要的是使用源URL來唯一定位資源,對資源的增刪改查對映為HTTP的四個方法,無狀態傳輸,具有非常好的伸縮性

Apache Wink就是一個純JavaREST框架。它完整的實現了JSR 311並擴充套件了部分功能,此外還提供了良好的擴充套件性,難能可貴的是還可以與流行的Java框架Spring無縫整合。目前該專案還在開發中。所謂框架無非就是定義好格式,提供一些工具和鉤子,讓開發人員可以專注於業務邏輯的開發。

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