在微服务盛行的本日,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单位实现为微服务,可以将它们发布到一些分布式盘算单位大概Docker中,并在性能必要的时间及时地创建更多的服务单位。
微服务是一个概念,并没有规定服务的格式,但是很多厂商和框架都不谋而合的采取RESTful的架构,只管也有一些别的的性能很好的RPC框架。
如安在Java生态圈选择一个轻量级的RESTful框架?可以参考一些其他人的履历,比如我翻译的:最好的8个JavaRESTful框架。
就我个人而言,我选择框架的来由很简单:
简单,轻量级
性能好
稳固,可靠
易于开辟和维护
我会首选依照Java规范(JSR339)的框架,轻量级,便于发布到Docker容器中。以是我不会选择Springboot,SpringMVC,CXF等比力重的框架,也不会选择纯netty如许的太过底层,还得实现路由等根本功能框架。
由于寻求轻量级,便于发布到docker容器中,我也不会观察JBOSS,Tomcat如许的JEE容器,而是选用jetty,undertow如许的嵌入式容器。
以是,这里我挑选了几个候选者:
Jersey+Grizzly
Jersey+Jetty
Dropwizard
RESTEasy+Netty
RESTEasy+Undertow
[Updatedon2015/11/18]
我增长了更多的RESTful框架,有些不是Jax-RS的实现,但是也有很活泼的社区。
Jersey+Jetty4
SpringBoot
纯Netty
Vert.x
你会发现一些风趣的测试结果。
Jersey是Jax-RS的官方参考实现,可以很好的和别的JEE容器集成。RESTEasy是JBoss出品的框架,也很轻易的和别的容器集成。Dropwizard实际上集成了Jersey,Jetty以及别的的第三方库比如它的Metrics,提供了一站式的开辟,略微有些厚重。
测试相干的代码已经放在了GITHUB上(https://github.com/smallnest/Jax-RS-Performance-Comparison)。
编译代码
测试代码是一个多模块的Maven项目,你直接运行mavencleanpackage就可以天生各个jar,而且这些jar包罗了所依靠的类,实行起来相称简单。
你也可以在每个模块下运行mvnexec:java启动服务,然后在欣赏器中访问https://localhost:8080/rest/hello(对于Jersey+Jetty,地点是https://localhost:8080/hello)
测试环境
AWSC3.2xlarge
8cores(E5-2666v3@2.90GHz)
memory:16G(服务只分配了4G内存)
Java
1.8.0_51
测试工具
wrk
测试下令如:wrk-t16-c1000-d30shttps://127.0.0.1:8080/rest/hello.
针对每个case,我利用16个线程,以及100/200/500/1000并发举行测试。
服务启动下令
java-Xmx4g-Xms4g-jarjersey-grizzly2-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarjersey-jetty-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jardropwizard-1.0-SNAPSHOT.jarhello.yml
java-Xmx4g-Xms4g-jarresteasy-netty-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarresteasy-undertow-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarspringboot-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarresteasy-netty4-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarnativenetty-1.0-SNAPSHOT.jar
java-Xmx4g-Xms4g-jarvertx-verticles-1.0-SNAPSHOT.jar-instances20
测试结果
测试结果数据可以查察这里:测试数据(https://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的性能远远高于别的框架,一方面是由于没有httprouter的逻辑,另一方面也表现了Netty框架的良好。假如不是实现很复杂的路由和很多的Service,不妨利用纯Netty实现高性能。
SpringBoot太厚重了,利用SpringMVC的语法,性能只有Jersey的一半。
Vert.x底层利用Netty,可以利用Java8Lambda语法,也提供了别的语言的支持,但是性能看起来不是太好,而且随着并发量增大吞吐率也随之降落。先前的vert.x测试有题目,只用到了单核,谢谢@Stream网友的提示,我在代码中增长了vertx-verticles模块,支持多核(java-jarvertx-verticles-1.0-SNAPSHOT.jar-instances20)。Vert.x性能也不错。@heng
固然测试也有一点遗憾,就是没有记录测试时的CPU占用率和Memory占用率,以我个人的履历,这方面Netty会占一些上风。
关注蕊蕊领取一整套底子视频学习资料转发文章让更多想要学习java的人一起来学习喔点击原文毗连加蕊蕊的群
点击辨认下方二维码跟蕊蕊一起来学习java
我要评论