Java RESTful 框架的性能比较

2017-02-03 ImportNew

(点击上方公众号,可快速关注)

来源:鸟窝,

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会占一些优势。

时间: 2024-10-15 00:55:33

Java RESTful 框架的性能比较的相关文章

最好的8个 Java RESTful 框架

过去的每一年,涌现出越来越多的Java框架.就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的.连我的老祖母现在也使用 一个我从来没有听说过而且可能永远不会使用的框架.玩笑归玩笑,可以做几乎任何事的臃肿的框架市场已经饱和,,但是如何评判呢?这篇文章旨在提供目前最好的 Java RESTfulful 框架.我只介绍轻量级的产品, 略过了那些臃肿的过度设计的框架.同时,我只想要他们稳定和成熟,提供简单,轻量级的特点.我只在介绍Play frameworks时打破这条规则,

Java Restful框架:Jersey入门示例(官方例子)

本文主要介绍了Java Restful框架Jersey入门例子(来源于官方网站https://jersey.java.net/),废话不多说进入正题. 在Jersey官方示例中(https://jersey.java.net/documentation/latest/getting-started.html),入门例子主要采用maven构建,在这里使用eclipse来创建我们的项目 1.使用maven 骨架方式创建项目,如下图, 2.,如果在eclipser中没有上面的选项,我们需要手动添加Je

Java MVC框架性能比较

- by zvane 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框架的项目访问速度,明显不如原来采用了struts1框架的项目快,带着这些疑惑,我对各类MVC框架的做了一个简单的性能分析比较,其结果应该说是基本符合预期的,可供大家参考. 测试环境:CPU:酷睿2 T5750,内存:DDR2-667 2G,Web容器:Tomcat6.0,最大线程数设置为1000,操作系统:WinXP-sp3 测

Java实现Restful框架Jersey学习

Java与REST的邂逅(一):浅谈Jersey及JAX-RS Java与REST的邂逅(二):JAX-RS核心Annotation Java与REST的邂逅(三):浅谈Jersey MVC Java实现Restful框架Jersey学习

Java序列化框架性能比较

博客: http://colobu.com jvm-serializers提供了一个很好的比较各种Java序列化的的测试套件. 它罗列了各种序列化框架, 可以自动生成测试报告. 我在AWS c3.xlarge机器上进行了测试,一下是测试报告与解析. 关键的测试数据的统计代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public double runWithTimeMeasurement(

JAVA web 框架集合

“框架”犹如滔滔江水连绵不绝, 知道有它就好,先掌握自己工作和主流的框架: 在研究好用和新框架. 主流框架教程分享在Java帮帮-免费资源网 其他教程需要时间制作,会陆续分享!!! 152款框架,你还知道其他的吗? 留言你用过的web框架 Java开源web框架汇总 1 Struts2 Struts2是一个web应用框架.它不是一个Struts的新的发布版本,而是一个全新的框架.Struts2 是第二代基于Model-View-Controller (MVC)模型的web应用框架. Struts

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

2016.3.9-3.10(java集合框架)

3.9 集合框架有什么作用? 集合框架其主要功能是用来将存储的数据以某种结构组织,并以特定的方式来访问这些数据. Java集合框架中有哪些存储方式? Java集合框架中的对象容器,按照对象在其中的存储方式,分为Set.List.和Map三种类型. Set类型对象没有顺序,且不能重复: List类型对象容器中的对象按照索引顺序排序,而且可以有重复的对象: Map类型对象容器中的元素包含一对“键对象-值对象”映射,其中键对象不能重复,值对象可以重复. 以上三种存储方式对应Java集合框架中Set.L

Java集合框架总结(4)——List接口的使用

Java集合框架总结(4)--List接口的使用 List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素. 1.List接口和ListIterator接口 List作为Collection接口的子接口,可以使用Collection接口里的全部方法.List是有序集合,所以List集合里增加了一些根据索引来操作集合元素的方法: void add(int index, Object element):将元素element插