最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口,对比了响应时间以及压测吞吐量的区别。

WebFlux&SpringMVC

如果对WebFlux还不了解的同学,那么你需要学习了解一下。官网地址:https://spring.io/

实践证明,使用WebFlux开发接口能够大幅提升接口的吞吐量。

相关参数:

  • 测试机器:Linux CentOS6.5 4核16G
  • SpringBoot版本:2.2.2.RELEASE
  • JDK版本:jdk1.8.0_151

本文主要内容如下:

  1. 使用tomcat容器的代码演示
  2. 使用netty容器的代码演示
  3. apachebench(ab)压测接口,对比性能数据

文中代码较多,建议大家收藏后,有时间自己亲自动手开发并压测来验证结果。

tomcat容器下的代码演示

我们先基于tomcat容器来验证传统的SpringMVC以及基于Project Reactor两种方式开发接口的区别。

先来迅速搭建一个基于SpringBoot-2.2.2.RELEASE版本的demo项目,pom.xml核心依赖如下:

SpringBoot父级依赖

web依赖&project reactor依赖

项目启动类:

再定义一个传统的service,为模拟真实环境请求,service下的方法请求耗时100ms:

模拟耗时100ms

最后我们写三个接口,每个接口采用不同的方式:

  1. 使用自定义调度器的方式
  2. 使用缓存的弹性调度器
  3. 传统的SpringMVC方式

代码如下图所示:

三种接口开发方式

ab压测

我们先对上面说的三个接口进行压测,为避免网络环境影响,我们直接在服务器上使用ab进行压力测试。

压测分三组,每组压测这三个接口,每个接口发起10w请求,每组用户数分别为200、500、1000,从而查看不同用户数请求下的响应结果。

第一组

压测结果:

10w请求数 200用户

可以看见传统的SpringMVC方式已经有阻塞了,最长的一次请求1107ms,但是整体性能基本一致,因为200个线程刚好是tomcat的线程池最大默认数。

第二组

ab -n100000 -c500 http://127.0.0.1:8080/hello1?id=1ab -n100000 -c500 http://127.0.0.1:8080/hello2?id=1ab -n100000 -c500 http://127.0.0.1:8080/hello3?id=1

压测结果:

10w请求 500用户

500用户请求时候可以看到hello3接口的响应时间已经是hello1和hello2两个接口响应时间的2倍以上了,但是基于project reactor响应编程开发方式的响应时间依旧和200用户一致。

我们继续将用户数加到1000。

第三组

ab -n100000 -c1000 http://127.0.0.1:8080/hello1?id=1ab -n100000 -c1000 http://127.0.0.1:8080/hello2?id=1ab -n100000 -c1000 http://127.0.0.1:8080/hello3?id=1

压测结果:

10w请求 1000用户

我们发现基于project reactor开发的接口响应时间依旧坚挺,传统SpringMVC方式开发的接口90%响应时间已经高达500ms了。

大家可以发现hello1和hello2两个接口的实现方式其实是一致的,无非是自己定义一个Scheduler还是用reactor默认的Scheduler,如果大家点进去看源码其实是一个意思,所以在性能上一致保持一致也是合理的,本质上都是无所不在的线程池:

至此我们就完成了在tomcat容器下的两种不同方式的接口开发以及得到相应的性能压测数据。

netty容器下代码演示

将pom.xml中的spring-boot-starter-web依赖换为webflux依赖即可:

webflux依赖

还是刚刚那三个接口,启动项目可以看到控制台有如下日志输出:

代表我们这是一个基于Netty的web服务。

这里我们直接压10w请求,1000用户:

ab -n100000 -c1000 http://127.0.0.1:8080/hello1?id=1ab -n100000 -c1000 http://127.0.0.1:8080/hello2?id=1ab -n100000 -c1000 http://127.0.0.1:8080/hello3?id=1

压测结果:

netty下压测10w请求1000用户

再和tomcat下同一压测参数进行对比:

tomcat下压测10w请求1000用户

是不是发现netty的性能比tomcat更加优越?99%的请求在149ms即可完成。如果大家自己实操的话也会发现吞吐量也会较tomcat有大幅度的提升。

总结

我们始终都在不遗余力的追求如何开发一个高并发、低延迟的接口。

通过本文实操以及linux服务器下长时间的压测,可以验证的是我们可以使用WebFlux来替代SpringMVC,从而获取更好的性能,更高的并发。如果你还和我一样,对WebFlux还一知半解,那么从今天起开始学习起来吧。

spring赌上未来的一击:WebFlux性能实测的更多相关文章

  1. Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

    之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Spring Framework 5.2.0 成功发布之后,Spring ...

  2. Spring MVC上传文件

    Spring MVC上传文件 1.Web.xml中加入 <servlet> <servlet-name>springmvc</servlet-name> <s ...

  3. Spring MVC 上传文件

    Spring MVC上传文件需要如下步骤: 1.前台页面,form属性 method设置为post,enctype="multipart/form-data"  input的typ ...

  4. Spring文件上传出错:java.lang.ClassCastException: org.apache.catalina.connector.Request

    java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.spri ...

  5. spring文件上传

    Spring文件上传 1,导包: <dependency> <groupId>javax.servlet</groupId> <artifactId>s ...

  6. springboot(十七):使用Spring Boot上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9. ...

  7. Spring 文件上传MultipartFile 执行流程分析

    在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...

  8. (转)Spring Boot(十七):使用 Spring Boot 上传文件

    http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html 上传文件是互联网中常常应用的场景之一,最典型的情 ...

  9. Spring Boot(十七):使用Spring Boot上传文件

    Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...

随机推荐

  1. java中的NAN和INFINITY

    java浮点数运算中有两个特殊的情况:NAN.INFINITY. 1.INFINITY: 在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢? 我们知道,在整型运算中,除数是不能为 ...

  2. Log4j讲解

    讲解 通常,我们写代码的过程中,免不了要输出各种调试信息.在没有使用任何日志工具之前,都会使用 System.out.println 来做到. 这么做直观有效,但是有一系列的缺点:1. 不知道这句话是 ...

  3. css 实现三角形

    #demo1 { width: 0; height: 0; border-top: 100px solid rgba(255, 0, 0, 1); border-bottom: 50px solid ...

  4. C#常见的文件路径Api

    我们经常有遇到要处理文件路径的需求,那么一般我们常见的有几种: 程序下面的文件 临时目录下的文件 获取程序下面的文件 首先我们创建了实例解决方案: 其中调用链是:Main.Shell->FooA ...

  5. nginx日志文件按天记录定时清理循环记录

    问题 nginx日志默认记录在一个文件access.log中,时间长了会导致日志文件特别大,甚至磁盘占满. 解决方案 使用以下方法,将access.log文件每天一个,然后清过15天以前的文件. 方法 ...

  6. Kubernetes服务pod的健康检测liveness和readiness详解

    Kubernetes服务pod的健康检测liveness和readiness详解 接下来给大家讲解下在K8S上,我们如果对我们的业务服务进行健康检测. Health Check.restartPoli ...

  7. sed 's/AA/BB/' file # 将文件中的AA替换成BB,只替换一行中第一次出现的AA,替换后的结果输出到屏幕 sed 's/AA/BB/g' file # 将文件中的所有AA都替换成BB,替换后的结果输出到屏幕

    生信人的自我修养:Linux命令速查手册 简佐义 ​ 四川大学 生物信息学硕士 科学求真 赢 10 万奖金 · 院士面对面 209 人赞同了该文章 许多人做生物信息学,要么不重视Linux,要么不知道 ...

  8. 源码安装Python3

    源码安装Python3 一.安装Python3需要的依赖包 [root@localhost ~]# yum install -y gcc make wget openssl openssl-devel ...

  9. IntelliJ IDEA配置tomcat 教程

    1.点击Run-Edit Configurations... 2.点击左侧"+",选择Tomcat Server--Local 3.在Tomcat Server -> Unn ...

  10. Redis(3)- 数据结构

    一.Redis数据结构 Redis数据结构:Redis在数据类型上常用的有5种数据类型,而底层实现拥有种.可以使用命令OBJECT ENCODING K1查询底层数据结构. # 查询key的底层数据类 ...