转自【】,写的非常好,以收藏。
开发webservice应用程序中离不开框架的支持,当open-open站点列举的就有30多种,这对于开发人员怎样选择带来一定的疑惑。性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方站点、网络资料中能够方便的找到各自框架的介绍,可是非常少有针对不同框架性能測试数据。本文选择了比較流行几个框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF等,採用java作为測试用例,通过本机和远程两种进行測试方式,对这几种框架进行了性能測试,并对測试结果分析和性能比較,最后并对性能优异的框架进行了推荐。
关键词:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL
Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建server端、client和网关SOAP操作的基本框架。但Axis并不全然是一个SOAP引擎,它还包含:
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.1、WSDL2.0。
l 方便集成其它组件(Add-ons)。几个web services已经被集成,包含: for security (Apache Rampart), for reliable messaging, 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
2.4 Apache CXF
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.4、spring 2.x |
client代码 | public void testgetVersion() throws java.lang.Exception { String url = "http://localhost:8081/boss/services/Calculate"; // client初时化时间 long startTime = System.currentTimeMillis(); // clientstub代码各自是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"; |
測试方法 | 本机接口測试,client和服务端都在A測试机上进行; |
远程接口測试,A測试机作为client,B測试机作为server。本次測试是在局域网内完毕。 | |
结果精度 | 数字精确到小数点后两位 |
名词解释 | server端:部署到server的程序。 |
client:发起请求调用server上webservcie的程序。 | |
client初时化时间:发起接口调用时,初始化clientjava对象所需时间。 比如:CalculateCalculateHttpportStub stub = new CalculateCalculateHttpportStub(url); // 由框架 wsdl2java生成clientstub |
表格 2在端对端性能上,一个client驱动程序使用了一个胖clientWeb服务堆栈来发送和接受SOAP请求 |
Webservice服务端 |
Webserviceclient Webservice stack |
SOAP over HTTP |
4 性能測试
4.1 測试方法
本次假定在同样网络、主机环境条件下进行測试,因此性能的区别主要是由不同框架实现机制的所决定。
l 採用两种方式測试:本机測试、远程測试。
l server端分别採用:axis1、axis2、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 |
4.3 结果分析
从数据能够看出,有以下几个特点:
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调用时,性能最佳。
5 结束语
本文对几种流行webservice框架的性能的实际測试,对开发人员选择框架时提供了一个关于性能方面參考。Apache CXF是Codehaus XFire 的第二代产品,眼下在不同框架中性能最佳,应该是开发人员不错的选择,这与它本身的架构设计不无关系。相比其它框架,CXF具有几个突出的特性:支持JAX-WS、Spring集成、Aegi数据绑定、支持RESTful services、支持WS-*、Apache协议、代码实现简洁。Apache Axis2是Apache Axis1的第二代产品,架构上也很不错,关键特性:支持各种规范、可插拔模块化设计、支持热部署等。与CXF相比性能也很优异。
在服务端框架确定的场景下,最好是採用该框架生成client代码,这样配合性能可达到更佳。在实际的项目中,开发人员在选择详细那个框架时,仍还需综合评估框架的开发组织、产品路线图、文档化程度、应用广泛度、与优异框架的集成度、灵活和扩展性等因素。