|
開發(fā)webservice應(yīng)用程序中離不開框架的支持,當(dāng)open-open網(wǎng)站列舉的就有很多種,這對(duì)于開發(fā)者如何選擇帶來一定的疑惑。性能Webservice的關(guān)鍵要素,不同的框架性能上存在較大差異,而當(dāng)前在官方網(wǎng)站、網(wǎng)絡(luò)資料中可以方便的找到各自框架的介紹,但是很少有針對(duì)不同框架性能測(cè)試數(shù)據(jù)。本文選擇了比較流行幾個(gè)框架: Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最簡(jiǎn)單、方便)、阿里巴巴 Dubbo(除外)等,采用Java作為測(cè)試用例,通過本機(jī)和遠(yuǎn)程兩種進(jìn)行測(cè)試方式,對(duì)這幾種框架進(jìn)行了性能測(cè)試,并對(duì)測(cè)試結(jié)果分析和性能比較,最后并對(duì)性能優(yōu)異的框架進(jìn)行了推薦。 目前三種主流的web服務(wù)實(shí)現(xiàn)方法: REST(新型):表象化狀態(tài)轉(zhuǎn)變 (軟件架構(gòu)風(fēng)格)RESTEasy、Wink、CXF、Axis2……. SOAP(比較成熟):簡(jiǎn)單對(duì)象訪問協(xié)議 Xfire、Axis2、CXF、Axis1 XML-RPC(淘汰):遠(yuǎn)程過程調(diào)用協(xié)議(慢慢被soap 所取代) REST 簡(jiǎn)單易用,效率高,貌似未來有很大的發(fā)展空間,也有宣稱rest性能個(gè)方便比soap強(qiáng)大的,已經(jīng)有很多框架宣稱對(duì)rest進(jìn)行支持比如spring 3.0、struts…….. (百度觀點(diǎn)) SOAP 成熟度較高,安全性較好 關(guān)鍵詞:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL 2 框架介紹2.1 Apache Axis1Axis本質(zhì)上就是一個(gè)SOAP引擎(Apache Axis is an implementation of the SOAP),提供創(chuàng)建服務(wù)器端、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。但Axis并不完全是一個(gè)SOAP引擎,它還包括: l 是一個(gè)獨(dú)立的SOAP服務(wù)器。 l 是一個(gè)嵌入Servlet引擎(例如Tomcat)的服務(wù)器。 l 支持WSDL。 l 提供轉(zhuǎn)化WSDL為Java類的工具。 l 提供例子程序。 l 提供TCP/IP數(shù)據(jù)包監(jiān)視工具。 2.2 Apache Axis2Apache Axis2相比Apache Axis1更加有效、更加模塊化、更加面向xml,支持容易插件模塊擴(kuò)展新功能和特性,例如安全和可靠。Apache Axis2是基于Apache AXIOM,它是一個(gè)高性能、pull-based XML對(duì)象模型。Apache Axis2的關(guān)鍵特性: l 解析xml更快。采用自己的對(duì)象模型和StAX (Streaming API for XML)。 l 更低的內(nèi)存占用。 l 支持熱部署。新服務(wù)加入到系統(tǒng),無需重啟服務(wù)。 l 支持異步webservice、 l MEP支持,靈活支持在WSDL 2.0定義的Message Exchange Patterns (MEPs) l 更加靈活。引擎給開發(fā)人員提供了充足的自由度可擴(kuò)展客戶頭信息處理、系統(tǒng)管理、 l 更加穩(wěn)定性。 l 傳輸框架不依賴于具體協(xié)議。為集成和傳輸協(xié)議(SMTP, FTP, message-oriented middleware, etc)有一個(gè)簡(jiǎn)單和抽象,引擎核心是完全獨(dú)立于具體的傳輸協(xié)議。 l 支持WSDL。支持WSDL1.1、WSDL2.0。 l 方便集成其他組件(Add-ons)。幾個(gè)web services已經(jīng)被集成,包括:WSS4J for security (Apache Rampart), Sandesha for reliable messaging, Kandula which is an encapsulation of WS-Coordination, WS-AtomicTransaction and WS-BusinessActivity. l 良好的擴(kuò)展性。 2.3 Codehaus XFireXFire核心是一個(gè)輕量的基于STAX消息處理模型,用來與SOAP消息交互,它支持不同類型的綁定機(jī)制、容器和傳輸協(xié)議。 支持webservice標(biāo)準(zhǔn)- 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配置服務(wù) l 支持多中傳輸協(xié)議- HTTP, JMS, XMPP, In-JVM, etc. l 可嵌入的和直觀的API l 支持Spring, Pico, Plexus, and Loom l 支持JBI l 客戶端和服務(wù)端stub代碼生成 l 支持JAX-WS early access 2.4 Apache CXFApache CXF是一個(gè)開源服務(wù)框架。Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,現(xiàn)在已經(jīng)正式更名為 Apache CXF 了,以下簡(jiǎn)稱為 CXF。CXF 繼承了Celtix和XFire兩大開源項(xiàng)目的精華,比如:JAX-WS and JAX-RS,主要特性包括: l 支持Web services標(biāo)準(zhǔn)。包括:SOAP、the WSI Basic Profile、WSDL、WS-Addressing、WS-Policy、WS-ReliableMessaging、WS-Security、WS-SecureConversation和WS-SecurityPolicy. l 支持不同類型前端開發(fā)模型。CXF實(shí)現(xiàn)了JAX-WS APIs,支持JAX-RS開發(fā)。 l 容易使用。CXF設(shè)計(jì)的簡(jiǎn)潔和直觀,具有簡(jiǎn)潔APIs迅速的構(gòu)建基于代碼的服務(wù),Maven插件使得工具集成更加容易、JAX-WS API支持、Spring 2.x XML使得配置更加容易。 l 支持二進(jìn)制和遺留協(xié)議。CXF被設(shè)計(jì)為可插拔的架構(gòu),在不同的傳輸協(xié)議結(jié)合下,不僅支持XML,也支持非XML類型綁定,例如:JSON和CORBA。 2.5 RESTEasy(百度觀點(diǎn)較好)
RESTEasy是JBoss的一個(gè)開源項(xiàng)目,提供各種框架幫助你構(gòu)建RESTful Web Services和RESTful Java應(yīng)用程序。它是JAX-RS規(guī)范的一個(gè)完整實(shí)現(xiàn)并通過JCP認(rèn)證。作為一個(gè)JBOSS的項(xiàng)目,它當(dāng)然能和JBOSS應(yīng)用服務(wù)器很好地集成在一起。但是,它也能在任何運(yùn)行JDK5或以上版本的Servlet容器中運(yùn)行。RESTEasy還提供一個(gè)RESTEasy JAX-RS客戶端調(diào)用框架。能夠很方便與EJB、Seam、Guice、Spring和Spring MVC集成使用。支持在客戶端與服務(wù)器端自動(dòng)實(shí)現(xiàn)GZIP解壓縮。 (資料少無法比較)
有較專業(yè)的人士對(duì)CXF、Restlet、RESTEasy、Jersey框架測(cè)試【數(shù)據(jù)】,他說從性能上看RESTEasy是最好的,Jersey其次(但Jersey連可查閱的英文文檔都比較少故個(gè)人不推薦使用),cxf和Restlet最差,
2.6 Dubbo (個(gè)人觀點(diǎn)----無理由)Dubbo是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring框架無縫集成。(資料少無法比較) 2.7 java6JAX-WSJAX-WS2.0 (JSR 224)是Sun新的web services協(xié)議棧JAVA中有三種WebService規(guī)范,分別是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ。JAX-WS(Java API For XML-WebService),JDK1.6 自帶的版本為JAX-WS2.1,其底層支持為JAXB。早期的JAVA Web服務(wù)規(guī)范JAX-RPC(Java API ForXML-Remote Procedure Call)目前已經(jīng)被JAX-WS 規(guī)范取代,JAX-WS 是JAX-RPC 的演進(jìn)版本,但JAX-WS 并不完全向后兼容JAX-RPC。()
2.8 Apache Wink
REST(Representational State Transfer) based Web Service【http://baike.soso.com/v812054.htm】是相對(duì)于傳統(tǒng)的Web Service(SOAP+WSDL+UDDI)而提出的。傳統(tǒng)的Web Service可以很好的解決異構(gòu)系統(tǒng)之間的通信問題,但是需要首先定義好XML格式的合同(WSDL),client和server都必須嚴(yán)格遵守協(xié)議,不容易升級(jí)以及集群伸縮。REST Web Service不需要事先定義格式,傳輸?shù)膬?nèi)容也可以依據(jù)不同的client變化(json,xml,html等),最重要的是使用源URL來唯一定位資源,對(duì)資源的增刪改查映射為HTTP的四個(gè)方法,無狀態(tài)傳輸,具有非常好的伸縮性。
Apache Wink就是一個(gè)純Java的REST框架。它完整的實(shí)現(xiàn)了JSR 311并擴(kuò)展了部分功能,此外還提供了良好的擴(kuò)展性,難能可貴的是還可以與流行的Java框架Spring無縫集成。目前該項(xiàng)目還在開發(fā)中。所謂框架無非就是定義好格式,提供一些工具和鉤子,讓開發(fā)人員可以專注于業(yè)務(wù)邏輯的開發(fā)。
3 測(cè)試準(zhǔn)備表格1測(cè)試基本元素
表格2在端對(duì)端性能上,一個(gè)客戶端驅(qū)動(dòng)程序使用了一個(gè)胖客戶端Web服務(wù)堆棧來發(fā)送和接受SOAP請(qǐng)求
4 性能測(cè)試4.1 測(cè)試方法本次假定在相同網(wǎng)絡(luò)、主機(jī)環(huán)境條件下進(jìn)行測(cè)試,因此性能的差別主要是由不同框架實(shí)現(xiàn)機(jī)制的所決定。 l 采用兩種方式測(cè)試:本機(jī)測(cè)試、遠(yuǎn)程測(cè)試。 l 服務(wù)器端分別采用:axis1、axis2、xfire、CXF,對(duì)于選定的服務(wù)器端,用不同框架對(duì)應(yīng)的工具包wsdl生成客戶端stub代碼進(jìn)行測(cè)試。 l 服務(wù)端接口內(nèi)部沒有復(fù)雜業(yè)務(wù)邏輯,客戶端調(diào)用時(shí),僅僅返回一個(gè)字符串。 l 每次運(yùn)行,采用java循環(huán)方式調(diào)用10次服務(wù)端接口,并記錄下從發(fā)起到返回結(jié)果的時(shí)間。 4.2 測(cè)試結(jié)果限于篇幅,本文僅提供了:以CXF框架為服務(wù)端的詳細(xì)測(cè)試結(jié)果,及其各個(gè)框架的綜合后測(cè)試結(jié)果。
表格3以CXF作為服務(wù)端測(cè)試詳細(xì)結(jié)果
表格4不同框架本機(jī)和遠(yuǎn)程測(cè)試結(jié)果
4.3 結(jié)果分析從數(shù)據(jù)可以看出,有下面幾個(gè)特點(diǎn): l 客戶端初次調(diào)用,初始化客戶端stub對(duì)象時(shí),大約在:600ms~2500ms。由于需要建立網(wǎng)絡(luò)連接,初始化java相關(guān)對(duì)象,因此耗時(shí)較長(zhǎng)。 l 客戶端初始化stub后,接口初次調(diào)用,大約在:400ms~1000ms。相比后續(xù)的接口調(diào)用時(shí)間最長(zhǎng)。 l 在第一次調(diào)用完畢后,隨后的調(diào)用中,性能都明顯提升。大約在:7ms~30ms。 l 本機(jī)測(cè)試與遠(yuǎn)程測(cè)試,性能上差距很微小,在高速的局域網(wǎng)內(nèi),性能差別幾乎可以忽略。 l 在相同的服務(wù)端下,采用不同框架生成的stub代碼調(diào)用時(shí),時(shí)間上也存在一定的差異。
實(shí)際應(yīng)用中,接口的調(diào)用都是在網(wǎng)絡(luò)的不同的機(jī)器之間進(jìn)行,本文也重點(diǎn)關(guān)注遠(yuǎn)程調(diào)用測(cè)試結(jié)果,在測(cè)試結(jié)果比較上,可以看出: l 最優(yōu)組合是最差組合性能的5倍多。 n 最優(yōu)的組合為:cxf客戶端+ cxf服務(wù)端,6ms左右。 n 最差的組合為:axis1客戶端+ axis1服務(wù)端,32ms左右。 l CXF作為服務(wù)端,對(duì)于不同的客戶端調(diào)用時(shí),性能最佳。 從以上的結(jié)果進(jìn)行分析得出用Axis2與CXF作為服務(wù)器端效率是比兩外兩者(Axis1與xfire)要高,所以下面就對(duì)CXF與Axis2進(jìn)行對(duì)比 5 選擇框架的方法1. 選擇能夠?qū)ξ覀兊拈_發(fā)過程提供更多、更好幫助的Web開發(fā)框架 (CXF與Axis2都是apache的開源框架,也是目前比較流行的webservice框架,)(百度加個(gè)人觀點(diǎn)) 2. 開發(fā)框架的學(xué)習(xí)一定要簡(jiǎn)單,上手一定要快,沒有什么比使用能得到更深的體會(huì)。那些動(dòng)不動(dòng)就需要半個(gè)月或者一個(gè)月學(xué)習(xí)周期的框架,實(shí)在是有些恐怖。(cxf學(xué)習(xí)成本比axis2低)【Axis2允許自己作為獨(dú)立的應(yīng)用來發(fā)布Web Service,并提供了大量的功能和一個(gè)很好的模型,這個(gè)模型可以通過它本身的架構(gòu)(modular architecture)不斷添加新的功能。有些開發(fā)人員認(rèn)為這種方式對(duì)于他們的需求太過于繁瑣。這些開發(fā)人員會(huì)更喜歡CXF。 】【CXF更注重開發(fā)人員的工效(ergonomics)和嵌入能力(embeddability)。大多數(shù)配置都可以API來完成,替代了比較繁瑣的XML配置文件, Spring的集成性經(jīng)常的被提及,CXF支持Spring2.0和CXF's API和Spring的配置文件可以非常好的對(duì)應(yīng)。CXF強(qiáng)調(diào)代碼優(yōu)先的設(shè)計(jì)方式(code-first design),使用了簡(jiǎn)單的API使得從現(xiàn)有的應(yīng)用開發(fā)服務(wù)變得方便。】{百度觀點(diǎn)}
3. 一定要能得到很好的技術(shù)支持,在應(yīng)用的過程中,或多或少都會(huì)出現(xiàn)這樣或者那樣的問題,如果不能很快很好的解決,會(huì)對(duì)整個(gè)項(xiàng)目開發(fā)帶來影響。一定要考慮綜合成本,其實(shí)這是目前應(yīng)用開源軟件最大的問題,碰到問題除了死肯文檔就是查閱源代碼,或者是網(wǎng)上搜尋解決的辦法,通常一個(gè)問題就會(huì)導(dǎo)致1-2天的開發(fā)停頓,嚴(yán)重的甚至需要一個(gè)星期或者更長(zhǎng),一個(gè)項(xiàng)目有上這么幾次,項(xiàng)目整體的開發(fā)成本嗖嗖的就上去了。(所以個(gè)人感覺應(yīng)該選擇比較流行的框架,起碼碰到問題還能上網(wǎng)搜索) 4. 開發(fā)框架結(jié)合其他技術(shù)的能力一定要強(qiáng)(個(gè)人感覺和下同) 5. 開發(fā)框架的擴(kuò)展能力一定要強(qiáng)。在好的框架都有力所不及的地方,這就要求能很容易的擴(kuò)展開發(fā)框架的功能,以滿足新的業(yè)務(wù)需要。同時(shí)要注意擴(kuò)展的簡(jiǎn)單性,如果擴(kuò)展框架的功能代價(jià)非常大,還不如不用呢。(axis2與cxf 都支持很多優(yōu)秀的框架(上已提到),但axis2擴(kuò)展性比cxf要好,axis2不僅支持java對(duì)c/C++提供支持)(個(gè)人觀點(diǎn))【RESTEasy也能支持許多比較優(yōu)秀的框架】(百度加個(gè)人觀點(diǎn)) 6. 開發(fā)框架最好能提供可視化的開發(fā)和配置,可視化開發(fā)對(duì)開發(fā)效率的提高,已經(jīng)得到業(yè)界公認(rèn)。(暫時(shí)無法提供觀點(diǎn)) 7. 開發(fā)框架的設(shè)計(jì)結(jié)構(gòu)一定要合理,應(yīng)用程序會(huì)基于這個(gè)框架,框架設(shè)計(jì)的不合理會(huì)大大影響到整個(gè)應(yīng)用的可擴(kuò)展性。(暫時(shí)無法提供觀點(diǎn)) 8. 開發(fā)框架一定要是運(yùn)行穩(wěn)定的,運(yùn)行效率高的??蚣艿姆€(wěn)定性和運(yùn)行效率直接影響到整個(gè)系統(tǒng)的穩(wěn)定性和效率。(從上面的測(cè)試來看,cxf的效率要高于axis2,不知道在大并發(fā)量的時(shí)候系統(tǒng)的穩(wěn)定性和安全性) 9. 開發(fā)框架一定要能很好的結(jié)合目前公司的積累。在多年的開發(fā)中已有了很多積累,不能因?yàn)槭褂瞄_發(fā)框架就不能再使用了,那未免有些得不償失。(暫時(shí)無法提供觀點(diǎn)) 10. 選擇開發(fā)框架另外要注意的一點(diǎn)就是:任何開發(fā)框架都不可能是十全十美的,也不可能是適應(yīng)所有的應(yīng)用場(chǎng)景的,也就是說任何開發(fā)框架都有它適用的范圍。所以選擇的時(shí)候要注意判斷應(yīng)用的場(chǎng)景和開發(fā)框架的適用性。(暫時(shí)無法提供觀點(diǎn))
6 結(jié)束語Apache CXF是CodehausXFire的第二代產(chǎn)品,目前在不同框架中性能最佳,應(yīng)該是開發(fā)者不錯(cuò)的選擇,這與它本身的架構(gòu)設(shè)計(jì)不無關(guān)系。相比其他框架,CXF具有幾個(gè)突出的特性:支持JAX-WS、Spring集成、Aegi數(shù)據(jù)綁定、支持RESTful services、支持WS-*、Apache協(xié)議、代碼實(shí)現(xiàn)簡(jiǎn)潔。 Apache Axis2是Apache Axis1的第二代產(chǎn)品,架構(gòu)上也非常不錯(cuò),關(guān)鍵特性:支持多語言(C/C++)、支持各種規(guī)范、可插拔模塊化設(shè)計(jì)、支持熱部署等。與CXF相比性能也非常優(yōu)異。 RESTEasy也許也是個(gè)不錯(cuò)的框架?。▊€(gè)人觀點(diǎn)) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|