• Spring Boot : Webflux 和 MVC 性能对比


     前言
    最近在网上看到,很多人都讲 Spring Boot Webflux 要超过 SpringMVC ,感觉在高并发的场景下, Spring Boot Webflux 简直就是银弹。
    本文将通过最简单的方式,来简单测试对比一下 Spring Boot Webflux 和 SpringMVC 在高并发场景下的性能。

    准备
    首先介绍一下本人的硬件情况:
    CPU:因特尔的 i7-8700
    内存:16G DDR4 2666
    系统:win10

    压测工具选择 Apache 的 jmeter ,版本为 5.1.1 (版本稍老,笔者未下载最新版本)

    接下来就是两个工程了。

    SpringMVC 测试代码如下:

    代码清单:spring-boot-analysis/spring-boot-mvc-latency/src/main/java/com/springboot/springbootmvclatency/controller/HelloController.java

    1. @RestController
    2. public class HelloController {
    3. @GetMapping("/hello/{latency}")
    4. public String hello(@PathVariable Long latency) {
    5. try {
    6. TimeUnit.MILLISECONDS.sleep(latency);
    7. } catch (InterruptedException e) {
    8. return "Error during thread sleep!";
    9. }
    10. return "Hello World!";
    11. }
    12. }

    Spring Boot Webflux 测试代码如下:

    代码清单:spring-boot-analysis/spring-boot-webflux-latency/src/main/java/com/springboot/springbootwebfluxlatency/controller/HelloController.java

    1. @RestController
    2. public class HelloController {
    3. @GetMapping("/hello/{latency}")
    4. public Mono<String> hello(@PathVariable int latency) {
    5. return Mono.just("Welcome to reactive ~")
    6. .delayElement(Duration.ofMillis(latency)); // 1
    7. }
    8. }

    这两个服务分别配置不同的端口启动。

    压测
    我计划以分别以 50 、100 、200 并发压测 1 分钟,查看两个服务的结果,因为 SpringBoot 中 tomcat 如果不做配置,最大线程数是 200 ,笔者这里偷个懒。
    注意: 本次压测结果仅供参考。

    3.1 50并发
    SpringMVC 聚合数据:

    SpringMVC JVM :

     Spring Boot Webflux 聚合数据:

    Spring Boot Webflux JVM :
     SpringMVC 响应时间:

    Spring Boot Webflux 聚合数据: 

    Spring Boot Webflux JVM :

    Spring Boot Webflux 响应时间:

    在这组对照中,可以看出 Spring Boot Webflux 吞吐量超过 SpringMVC 将近三分之一,从时间响应图上也可以看到 Spring Boot Webflux 上涨的幅度是要小于 SpringMVC 的。

    小结
    首先, Spring Boot Webflux 的 CPU 使用率小于 SpringMVC 这点是我在测试前就已经预料到的,毕竟 Spring Boot Webflux 是非阻塞式的 I/O ,而 SpringMVC 则是阻塞式的, Spring Boot Webflux 的活动线程数是固定的,这就大大的减少了 CPU 在线程中切换的消耗。但是在并发未到 200 之前, Spring Boot Webflux 相比较 SpringMVC 并没有明显的优势,相反还有点不如,这是我没想到的(有哪位朋友知道原因的可以一起交流下),当然,我的实验仅能做一个参考作用,毕竟只进行了一次测试,并未多次测试取平均,偶然性还是相当大的。
     

  • 相关阅读:
    重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行
    机器学习案例之客户的信用风险与预测
    Vue2+SpringBoot实现数据导出到csv文件并下载
    火狐为 Firefox所有用户推出了GPC
    EM聚类(上):数据分析 | 数据挖掘 | 十大算法之一
    【力扣每日一题】2023.9.24 LRU缓存
    Python list列表修改元素
    SpringBoot 集成 RabbitMq 实现五种常用消息模型
    java毕业设计客观题考试mybatis+源码+调试部署+系统+数据库+lw
    【实用】Java对象与JSON字符串的互转,实用操作!
  • 原文地址:https://blog.csdn.net/m0_68459853/article/details/125481385