spring赌上未来的一击:WebFlux性能实测

2023-10-30

最近花了一点时间系统的测试验证了在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,从而查看不同用户数请求下的响应结果。

第一组

 
 

压测结果:

添加图片注释,不超过 140 字(可选)

10w请求数 200用户

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

第二组

 
 

ab -n100000 -c500 http://127.0.0.1:8080/hello1?id=1 ab -n100000 -c500 http://127.0.0.1:8080/hello2?id=1 ab -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=1 ab -n100000 -c1000 http://127.0.0.1:8080/hello2?id=1 ab -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=1 ab -n100000 -c1000 http://127.0.0.1:8080/hello2?id=1 ab -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还一知半解,那么从今天起开始学习起来吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 国内就能用的Chat-GPT分享

    人工智能在语音理解与交互的新里程碑 AI聊天平台 在人工智能 AI 领域 语言模型的发展日新月异 这其中 OpenAI所推出的GPT系列语言模型尤为显眼 尤其是其中的一员 ChatGPT 已经在人工智能的语言理解与交互方面设定了一个新的里程
  • PB安装步骤

    安装PowerBuilder 9 0具体步骤 1 解压压缩包 双击 SETUP 2 点击 Next 3 点击 Yes 4 点击 Next 5 选择好安装到的文件夹 点击 Next 6 选择组件 我只选择PowerBuilder 点击 Nex
  • 如何加载HTML页面页面到另一个界面中

    1 第一种 iframe 但是 对于个人经验来说 iframe最好不要用 不仅自适应不太好 而且对于seo优化特别不好 2 第二种 通过jQuery load 事件加载页面 比较简单 但是会刷新界面 不过个人感觉影响不大 可以return
  • 3、初识程序

    数据结构静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 高效的程序 恰当的数据结构 合适的算法 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想 特性 输
  • 如何开始学习大数据

    最近很多人都想学习大数据开发 但是却不知道如何开始学习 传统的web应用 LAMP JavaEE NODE系等 与大数据什么关系 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专注大数据分析方法
  • 荣耀社招笔试

    荣耀社招笔试题纪录篇 原文链接荣耀社招笔试题 十一放假回家参加了荣耀社招笔试 两道算法题 解析仅供参考 第一题 旋转矩阵 题目描述 给你一幅由 N N 矩阵表示的图像 其中每个像素的大小为 4 字节 请 你设计一种算法 将图像旋转 90 度
  • Linux查看已安装软件版本

    在Linux中 可以使用以下命令来查看软件版本 1 使用命令 软件名 version 来查看软件版本 例如 gcc version 2 使用命令 软件名 v 来查看软件版本 例如 python v 3 使用命令 rpm q 软件名 来查看已
  • idea windows找不到文件chrome

    一 原因分析 浏览器安装的地址有变动 二 解决 1 打开IDEA的设置页面 2 选中setting 找到tools目录下的Web Browsers 3 在电脑桌面上找到谷歌的图标 显示位置不一样 所以根据自身电脑找到谷歌图标 右键单击 gt
  • Generative Modeling by Estimating Gradients of the Data Distribution阅读笔记

    目录 概述 传统score based generative modeling介绍 score matching Langevin dynamics 传统score based generative modeling存在的问题 流形假设上的
  • Python的re.rearch()和group()详解, 及它们的综合使用

    re search 字符串1 字符串2 flags 0 以列表形式 返回在字符串2中所有匹配到的第一个字符串1 如果无 则返回空列表 其中flag参数一般很少使用 补充 re seaech re findall re match 等方法都有
  • 发送arp数据包

    代码来自busybox 函数询问TEST IP的mac地址 read interface函数通过ioctl来获取接口interface相关信息 arpping用于发送arp数据包 也可以使用s socket PF PACKET SOCK R
  • Java中\t的作用

    t是补全当前字符串长度到8的整数倍 最少1个最多8个空格 补多少要看你 t前字符串长度 比如当前字符串长度10 那么 t后长度是16 也就是补6个空格 如果当前字符串长度12 此时 t后长度是16 补4个空格
  • 19 个 K8S 日常故障处理集锦

    问题1 K8S集群服务访问失败 原因分析 证书不能被识别 其原因为 自定义证书 过期等 解决方法 更新证书即可 问题2 K8S集群服务访问失败 curl 7 Failed connect to 10 103 22 158 3000 Conn
  • 【Metashape精品教程15】点云分类 分类地面点 创建DEM

    Metashape精品教程15 点云分类 分类地面点 创建DEM 文章目录 Metashape精品教程15 点云分类 分类地面点 创建DEM 前言 一 点云分类 Classify Points 二 分类地面点 三 手动分类 四 创建DEM
  • 2023网络安全面试题汇总(附答题解析+配套资料)

    随着国家政策的扶持 网络安全行业也越来越为大众所熟知 相应的想要进入到网络安全行业的人也越来越多 为了更好地进行工作 除了学好网络安全知识外 还要应对企业的面试 所以在这里我归总了一些网络安全方面的常见面试题 希望对大家有所帮助 内容来自于
  • 标定协议之CCP协议基础知识介绍

    上一篇 标定协议基础知识介绍 中对标定协议进行了初步的介绍 从这一篇文章开始对CCP标定协议进行相关介绍 本篇将对CCP标定协议相关指令进行介绍 CCP通讯报文定义 CCP标定协议标准中定义了两条CAN通讯报文 CRO Command Re
  • Python 更新pip报错

    解决办法 更新指令中加上 user python m pip install user upgrade pip
  • Tomcat线程模型及调优

    一 Tomcat线程模型 1 BIO 同步阻塞式I O操作 表示Tomcat使用的是传统Java I O操作 即Java io包及其子包 Tomcat7以下版本默认情况下是以bio模式运行的 由于每个请求都要创建一个线程来处理 线程开销较大
  • case when where 显示没有该列 mysql,mysql - MySQL CASE WHEN麻木IS NULL忽略记录WHERE麻木IS NOT NULL - SO中文参考 - www.s...

    计算numb m value NULL 1 7 64 NULL 1 7 65 8070 2 7 935 8070 2 7 941 NULL 3 7 62 8070 4 7 92 8070 4 7 935的每个值的最小值和最大值 取决于COA
  • spring赌上未来的一击:WebFlux性能实测

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