几种流行Webservice框架性能对比
1 摘要
开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑。性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方网站、网络资料中可以方便的找到各自框架的介绍,但是很少有针对不同框架性能测试数据。本文选择了比较流行几个框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF等,采用java作为测试用例,通过本机和远程两种进行测试方式,对这几种框架进行了性能测试,并对测试结果分析和性能比较,最后并对性能优异的框架进行了推荐。
关键词:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL
2 框架介绍
2.1 Apache Axis1
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数据包监视工具。
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.1、WSDL2.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标准。包括: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。
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 { System.out.println("[" + i + "] elapsed time is: " + (endTime1 - startTime1) + " ms"); |
服务端代码 |
public String getVersion() |
测试方法 |
本机接口测试,客户端和服务端都在A测试机上进行; |
远程接口测试,A测试机作为客户端,B测试机作为服务器。本次测试是在局域网内完成。 |
|
结果精度 |
数字精确到小数点后两位 |
名词解释 |
服务器端:部署到服务器的程序。 |
客户端:发起请求调用服务器上webservcie的程序。 |
|
客户端初时化时间:发起接口调用时,初始化客户端java对象所需时间。 |
表格 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 |
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对象时,大约在:600ms~2500ms。由于需要建立网络连接,初始化java相关对象,因此耗时较长。
l 客户端初始化stub后,接口初次调用,大约在:400ms~1000ms。相比后续的接口调用时间最长。
l 在第一次调用完毕后,随后的调用中,性能都明显提升。大约在:7ms~30ms。
l 本机测试与远程测试,性能上差距很微小,在高速的局域网内,性能差别几乎可以忽略。
l 在相同的服务端下,采用不同框架生成的stub代码调用时,时间上也存在一定的差异。
实际应用中,接口的调用都是在网络的不同的机器之间进行,本文也重点关注远程调用测试结果,在测试结果比较上,可以看出:
l 最优组合是最差组合性能的5倍多。
n 最优的组合为:cxf客户端+ cxf服务端,6ms左右。
n 最差的组合为:axis1客户端+ axis1服务端,32ms左右。
l CXF作为服务端,对于不同的客户端调用时,性能最佳。
5 结束语
本文对几种流行webservice框架的性能的实际测试,对开发者选择框架时提供了一个关于性能方面参考。Apache CXF是Codehaus XFire 的第二代产品,目前在不同框架中性能最佳,应该是开发者不错的选择,这与它本身的架构设计不无关系。相比其他框架,CXF具有几个突出的特性:支持JAX-WS、Spring集成、Aegi数据绑定、支持RESTful services、支持WS-*、Apache协议、代码实现简洁。Apache Axis2是Apache Axis1的第二代产品,架构上也非常不错,关键特性:支持各种规范、可插拔模块化设计、支持热部署等。与CXF相比性能也非常优异。
在服务端框架确定的场景下,最好是采用该框架生成客户端代码,这样配合性能可达到更佳。在实际的项目中,开发者在选择具体那个框架时,仍还需综合评估框架的开发组织、产品路线图、文档化程度、应用广泛度、与优异框架的集成度、灵活和扩展性等因素。
几种流行Webservice框架性能对比的更多相关文章
- 几种流行Webservice框架性能对比(转载)
1摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性能上存在较大差 ...
- 几种流行Webservice框架性能对照
转自[http://blog.csdn.net/thunder4393/article/details/5787121],写的非常好,以收藏. 1 摘要 开发webservice应用程序中 ...
- 几种流行Webservice框架
一. 几个比较流行的Webservice框架: Apache Axis1.Apache Axis2.Codehaus XFire.Apache CXF.Apache Wink.Jboss RESTE ...
- 几种流行Webservice控制框架
转会[http://blog.csdn.net/thunder4393/article/details/5787121],写的非常好,以收藏. 1 摘要 开发webservice应用程序中 ...
- [java]序列化框架性能对比(kryo、hessian、java、protostuff)
序列化框架性能对比(kryo.hessian.java.protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...
- Java的几种创建实例方法的性能对比
近来打算自己封装一个比较方便读写的Office Excel 工具类,前面已经写了一些,比较粗糙本就计划重构一下,刚好公司的电商APP后台原有的导出Excel实现出现了可怕的性能问题,600行的数据生成 ...
- Mego(1) - NET中主流ORM框架性能对比
从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...
- 求斐波那契数列第n位的几种实现方式及性能对比(c#语言)
在每一种编程语言里,斐波那契数列的计算方式都是一个经典的话题.它可能有很多种计算方式,例如:递归.迭代.数学公式.哪种算法最容易理解,哪种算法是性能最好的呢? 这里给大家分享一下我对它的研究和总结:下 ...
- Go_18: Golang 中三种读取文件发放性能对比
Golang 中读取文件大概有三种方法,分别为: 1. 通过原生态 io 包中的 read 方法进行读取 2. 通过 io/ioutil 包提供的 read 方法进行读取 3. 通过 bufio 包提 ...
随机推荐
- iOS 多态的简单思想
/** * 多态:多种形态,是对于对象而言的,如果没有继承就没有多态 * * 在代码中体现:就是通过定义父类指针指向子类的对象 * * 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候 ...
- centos7下编译qt的mysql驱动
在编译mysql驱动之前,首先要安装mysql,可以使用yum安装,这里将不再介绍. 在将qt和mysql都安装好之后,首先找到mysql的头文件以及他的共享库,我的mysql是使用yum安装的,头文 ...
- 动态链接库找不到 : error while loading shared libraries: libgsl.so.0: cannot open shared object file: No such file or directory
问题: 运行gsl(GNU scientific Library)的函数库,用 gcc erf.c -I/usr/local/include -L/usr/local/lib64 -L/usr/loc ...
- memcached全面剖析--2
理解memcached的内存存储 下面是<memcached全面剖析>的第二部分. 发表日:2008/7/9 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo. ...
- CentOS 6.5升级Python后yum不可用的解决方案
因开发需要,今天把CentOS 6.5自带的Python2.6.6升级到了Python2.7.3.按照如下步骤进行升级 1.查看当前系统python的版本 python -V 2.下载2.7.3版本的 ...
- 【4】创建一个自己的Bootstrap模板
什么也不说了,直接贴上代码吧,哈哈 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta ch ...
- informix 查看数据库空间名
查看bhrs库的空间名 onstat -d 导出一个表 的结构 dbschema -d bhrs -t infotrans > xxx.sql 微网点 报表已经上线 cbs.sql 提交,生产 ...
- vm安装ubuntu桥接模式无法联网
桥接模式,就是和主机不同的ip,其他都是一样的. 编辑网络连接 查看自己机子的ip ipconfig 一般情况下是 ip 192.168.1.XXX 子网掩码 255.255.255.0 网关 192 ...
- U当家U盘启动盘制作教程
U当家U盘启动盘制作工具制作u盘系统安装盘支持老机器.新机器启动以及制作,U当家内置强大的U盘一键重装系统工具支持传统和GPT安装,支持原版操作系统和GHOST操作系统安装(ISO/GHO/WIM), ...
- 1880-A. 偷吃可耻
描述 EATER买来一堆好吃的,总共N+1份,共(N+1)/2种,每种准备了两份,同种都标上了相同的编号.本来准备与他家吃货一同分享,结果却发现被人偷吃了..EATER发现总数少了一个,所以你的任务就 ...