幾種流行Webservice框架效能對比(轉載、拼接)
1摘要
開發webservice應用程式中離不開框架的支援,當open-open網站列舉的就有很多種,這對於開發者如何選擇帶來一定的疑惑。效能Webservice的關鍵要素,不同的框架效能上存在較大差異,而當前在官方網站、網路資料中可以方便的找到各自框架的介紹,但是很少有針對不同框架效能測試資料。本文選擇了比較流行幾個框架:
Apache Axis1、Apache Axis2、CodehausXFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最簡單、方便)、阿里巴巴 Dubbo(除外)等,採用java作為測試用例,通過本機和遠端兩種進行測試方式,對這幾種框架進行了效能測試,並對測試結果分析和效能比較,最後並對效能優異的框架進行了推薦。
REST(新型):表象化狀態轉變 (軟體架構風格)RESTEasy、Wink、CXF、Axis2…….
SOAP(比較成熟):簡單物件訪問協議Xfire、Axis2、CXF、Axis1
XML-RPC(淘汰):遠端過程呼叫協議(慢慢被soap 所取代)
REST 簡單易用,效率高,貌似未來有很大的發展空間,也有宣稱rest效能個方便比soap強大的,已經有很多框架宣稱對rest進行支援比如spring 3.0、struts…….. (百度觀點)
SOAP 成熟度較高,安全性較好
關鍵詞:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL
2 框架介紹
Axis本質上就是一個SOAP引擎(Apache Axis is an implementation of the SOAP),提供建立伺服器端、客戶端和閘道器SOAP操作的基本框架。但Axis並不完全是一個SOAP引擎,它還包括:
l是一個獨立的SOAP伺服器。
l是一個嵌入Servlet引擎(例如Tomcat)的伺服器。
l支援WSDL。
l提供轉化WSDL為Java類的工具。
l提供例子程式。
l提供TCP/IP資料包監視工具。
Apache Axis2相比Apache Axis1更加有效、更加模組化、更加面向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.1、WSDL2.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 + XFire,Apache CXF 的前身叫 Apache CeltiXfire,現在已經正式更名為 Apache CXF 了,以下簡稱為 CXF。CXF 繼承了Celtix和XFire兩大開源專案的精華,比如: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。
2.5 RESTEasy(百度觀點較好)
RESTEasy是JBoss的一個開源專案,提供各種框架幫助你構建RESTful Web Services和RESTful Java應用程式。它是JAX-RS規範的一個完整實現並通過JCP認證。作為一個JBOSS的專案,它當然能和JBOSS應用伺服器很好地整合在一起。但是,它也能在任何執行JDK5或以上版本的Servlet容器中執行。RESTEasy還提供一個RESTEasy JAX-RS客戶端呼叫框架。能夠很方便與EJB、Seam、Guice、Spring和Spring MVC整合使用。支援在客戶端與伺服器端自動實現GZIP解壓縮。(資料少無法比較)
有較專業的人士對CXF、Restlet、RESTEasy、Jersey框架測試【資料】,他說從效能上看RESTEasy是最好的,Jersey其次(但Jersey連可查閱的英文文件都比較少故個人不推薦使用),cxf和Restlet最差,
2.6 Dubbo (個人觀點----無理由)
Dubbo是阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和Spring框架無縫整合。(資料少無法比較)
2.7 java6JAX-WS
JAX-WS2.0 (JSR 224)是Sun新的web services協議棧
JAVA中有三種WebService規範,分別是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ。
JAX-WS(Java API For XML-WebService),JDK1.6 自帶的版本為JAX-WS2.1,其底層支援為JAXB。早期的JAVA Web服務規範JAX-RPC(Java 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 Service【http://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就是一個純Java的REST框架。它完整的實現了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.4、spring 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伺服器端分別採用:axis1、axis2、xfire、CXF,對於選定的伺服器端,用不同框架對應的工具包wsdl生成客戶端stub程式碼進行測試。
l服務端介面內部沒有複雜業務邏輯,客戶端呼叫時,僅僅返回一個字串。
l每次執行,採用java迴圈方式呼叫10次服務端介面,並記錄下從發起到返回結果的時間。
4.2 測試結果
限於篇幅,本文僅提供了:以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 |