Java RESTful 框架的性能比较
来源:鸟窝,
colobu.com/2015/11/17/Jax-RS-Performance-Comparison/
在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元。
微服务是一个概念,并没有规定服务的格式,但是很多厂商和框架都不约而同的采用RESTful的架构,尽管也有一些其它的性能很好的RPC框架。
如何在Java生态圈选择一个轻量级的RESTful框架?可以参考一些其他人的经验, 比如我翻译的: 最好的8个 Java RESTful 框架。
就我个人而言,我选择框架的理由很简单:
简单,轻量级
性能好
稳定,可靠
易于开发和维护
我会首选遵循Java规范(JSR339)的框架,轻量级,便于发布到Docker容器中。 所以我不会选择Spring boot, Spring MVC, CXF等比较重的框架,也不会选择纯netty这样的太过底层,还得实现路由等基本功能框架。
因为追求轻量级,便于发布到docker容器中,我也不会考察JBOSS, Tomcat这样的JEE容器, 而是选用jetty, undertow这样的嵌入式容器。
所以,这里我挑选了几个候选者:
Jersey + Grizzly
Jersey + Jetty
Dropwizard
RESTEasy + Netty
RESTEasy + Undertow
[Updated on 2015/11/18]
我增加了更多的 RESTful 框架,有些不是Jax-RS的实现,但是也有很活跃的社区。
Jersey + Jetty4
Spring Boot
纯Netty
Vert.x
你会发现一些有趣的测试结果。
Jersey 是Jax-RS的官方参考实现,可以很好的和其它JEE容器集成。RESTEasy是JBoss出品的框架,也很容易的和其它容器集成。Dropwizard实际上集成了Jersey, Jetty以及其它的第三方库比如它的Metrics,提供了一站式的开发,略微有些厚重。
测试相关的代码已经放在了GITHUB上(https://github.com/smallnest/Jax-RS-Performance-Comparison)。
编译代码
测试代码是一个多模块的Maven项目, 你直接运行maven clean package就可以生成各个jar,而且这些jar包含了所依赖的类,执行起来相当简单。
你也可以在每个模块下运行mvn exec:java启动服务,然后在浏览器中访问 http://localhost:8080/rest/hello (对于Jersey + Jetty,地址是http://localhost:8080/hello)
测试环境
服务器
AWS C3.2xlarge
8 cores (E5-2666 v3 @ 2.90GHz)
memory: 16G (服务只分配了4G内存)
Java
1.8.0_51
测试工具
wrk
测试命令如: wrk -t16 -c1000 -d30s http://127.0.0.1:8080/rest/hello.
针对每个case, 我使用16个线程,以及100/200/500/1000并发进行测试。
服务启动命令
java -Xmx4g -Xms4g -jar jersey-grizzly2-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar jersey-jetty-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar dropwizard-1.0-SNAPSHOT.jar hello.yml
java -Xmx4g -Xms4g -jar resteasy-netty-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar resteasy-undertow-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar springboot-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar resteasy-netty4-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar nativenetty-1.0-SNAPSHOT.jar
java -Xmx4g -Xms4g -jar vertx-verticles-1.0-SNAPSHOT.jar -instances 20
测试结果
测试结果数据可以查看这里: 测试数据(http://colobu.com/2015/11/17/Jax-RS-Performance-Comparison/Jax-RS-Performance-Comparison),
延迟基本在几毫秒到10几毫秒之间。
图形化测试结果(y轴为Requests/sec, x轴为并发量):

结论
从结果看,
RESTEasy的性能要好于 Jersey,无论哪种嵌入式JEE容器。
Jersey+Grizzly2和Jersey+Jetty, dropwizard性能差别不大
dropwizard底层实际是Jersey+Jetty,性能结果也和Jersey+Jetty一样
RESTEasy+netty (netty3)的结果并没有优于RESTEasy+undertow.这出乎我的意料,可能CPU和Memory占用上会好一些
RESTEasy+netty4的性能远远低于RESTEasy+netty3,这出乎我的意料。或许因为Netty线程池的改变。
纯netty的性能远远高于其它框架,一方面是由于没有http router的逻辑,另一方面也显示了Netty框架的优秀。如果不是实现很复杂的路由和很多的Service,不妨使用纯Netty实现高性能。
Spring Boot太厚重了,使用Spring MVC的语法,性能只有Jersey的一半。
Vert.x底层使用Netty,可以使用Java 8 Lambda语法,也提供了其它语言的支持,但是性能看起来不是太好,而且随着并发量增大吞吐率也随之下降。先前的vert.x测试有问题,只用到了单核,谢谢@Stream网友的提醒,我在代码中增加了vertx-verticles模块,支持多核(java -jar vertx-verticles-1.0-SNAPSHOT.jar -instances 20)。 Vert.x性能也不错。@heng
当然测试也有一点遗憾,就是没有记录测试时的CPU占用率和Memory占用率,以我个人的经验,这方面Netty会占一些优势。
Java RESTful 框架的性能比较的更多相关文章
- Java RESTful框架的性能比较
https://colobu.com/2015/11/17/Jax-RS-Performance-Comparison/
- 最好的8个 Java RESTful 框架
原文出处: colobu 过去的每一年,涌现出越来越多的Java框架.就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的.连我的老祖母现在也使用 一个我从来没有听说过而且可 ...
- Java Restful框架:Jersey入门示例(官方例子)
本文主要介绍了Java Restful框架Jersey入门例子(来源于官方网站https://jersey.java.net/),废话不多说进入正题. 在Jersey官方示例中(https://jer ...
- Java RESTful 框架
[转载] 最好的8个 Java RESTful 框架 - 2015 Top 8 Java RESTful Micro Frameworks – Pros/Cons - 2017 Restlet - f ...
- 如何在Java生态圈选择一个轻量级的RESTful框架?
在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元.微服务 ...
- Java+Netty实现的RESTful框架--netty-rest-server
在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架. ...
- Java MVC框架性能比较
Java MVC框架性能比较 - by zvane 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框 ...
- RESTful框架调研
背景 当前的开放服务平台发展趋势,是服务使用者变得多种多样,其中既有各种前端设备(台式机.手机等),又有各种后端服务器,因此必须有一个统一的机制,方便各种服务使用者和开放服务平台进行通信.为了更好的实 ...
- Java Restful Web Service 学习指南
Restful是一种架构style,目前常说的有restful web service, resultful http.现在热搜榜的微服务,大多数会采用Restful方式. JAX-RS 作为一个Re ...
随机推荐
- java垃圾回收总结(2)
java垃圾回收总结(2) 上一篇文章 介绍了jvm虚拟机运行时内存结构以及如何标识需要回收的对象,这一节主要讲解垃圾回收的基本算法. 基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除 ...
- Ubuntu12.04下Django1.4的删除目录
网上有很多文章说这个问题,大意就是下载压缩包以后用 sudo python setup.py install 上面这条命令安装的Django,然后到相关目录下把那个Django的目录删掉就Ok了,但是 ...
- QQ connect client request's parameters are invalid, invalid openid 问题的解决
很多人的这个问题是POST的时候发生,我的也恰好在POST的时候发生.后来我发现可能是因为QQ的这个后端是采用类PHP的语言开发,在动态语言的获取参数时POST参数和GET参数是可以分开读取的,也就是 ...
- Hbase出现ERROR: Can't get master address from ZooKeeper; znode data == null解决办法
问题描述如下: hbase(main)::> list TABLE ERROR: Can't get master address from ZooKeeper; znode data == n ...
- 一天搞懂深度学习-训练深度神经网络(DNN)的要点
前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...
- Java基础:Java虚拟机(JVM)
当我们第一次学习Java时这些原理上的东西就会被提到,但是很少有真正去学习.今天开始从头过一遍Java,打算从JVM开始. 1. JVM是什么 2. JRE和JDK 3. JVM结构 3.1. 程序计 ...
- 微信小程序的初窥实践
最近,小程序正式上线,各企业都纷纷开发,本博主看下其中奥秘, 首先得去微信公众平台(https://mp.weixin.qq.com/)注册一个小程序账号(以前注册过公众号的账号不可使用) 备注:注册 ...
- 《与C语言相恋》
第一章 <与C语言相恋> 目录: 1.1 C语言的诞生 1.2 相恋C语言的理由 1.3 相恋C语言的7个步骤 1.4 目标代码文件,可执行文件和库 1.5 本章小结 C语言的诞生 197 ...
- popup_layer插件示例
导入popup_layer.js插件 设置好显示的div: <div class="main" id="showImg" style="disp ...
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
分类: 分布式技术(3) 目录(?)[+] 平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成D ...