【三十】springboot项目上高并发解决示例

这篇具有很好参考价值的文章主要介绍了【三十】springboot项目上高并发解决示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

互相交流入口地址

整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

目录

一、单机模式下高并发问题

二、集群模式下高并发问题


        本章演示在springboot项目中的高并发demo,演示导致的问题,以及单机部署下的解决方案和集群部署下的解决方式以及分布式下的解决方案。

一、单机模式下高并发问题

        前提:先写一个减扣数据库产品数量的一个接口作为测试。

        拿以前springboot整合布隆过滤网篇的一个接口直接做改造:假设编号为2的苹果库存还有一个,现在有个接口去买这个苹果并生成订单号以便于后期支付,得到如下:

1、数据表:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

2、接口

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

通过jmeter模拟一秒钟有100个用户购买这个苹果,结果会是什么?

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

会发现直接卖爆了,一个苹果被卖了几十单。怎么解决这个并发问题呢?

PS:java提供了锁来处理 

1、乐观锁

        CAS先比较再交换,Java中提供了Atomic开头的类,例如AtomicInteger、AtomicLong、AtomicReference等原子类都是此思想来支持CAS操作的。进行如下改造,来实现先比较在修改值的方式解决该问题。其实就是在把cas想做是一个原子操作。改造方式就是例如给商品表增加一个字段用来表示该次原子性操作时,他应该是什么值,若是则修改,不然就不修改。如下:

 springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        增加一个number字段,原理就是每次修改时带上这个number条件,而每次减少count后修改number的值(原子性)第一个请求的用户这样处理,其他同时查到这个订单的其他用户,在减少count时根据number条件却查不到这个订单了从而无法再生成订单。代码如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        继续jmeter测试,再看看结果如何?

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        发现通过这种方式的确实现了防止超卖的现象。 

  • 优点:不用加锁,不会阻塞其他线程,性能相比较好。
  • 缺点:需要增加表字段,并且由于是在数据库层面保持原子性可能导致多事务操作操作同一数据时导致冲突,引起数据一致性问题。

        结论:所以在并发较少的情况下可以使用乐观锁方式。

2、悲观锁

        将通过下面两种锁来进行演示。

2.1、synchronized锁

        改造代码如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        通过测试得出: 

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        发现实现了防止超卖,但是synchronized锁是基于jvm层面的,因此并不适用于集群模式。集群模式会涉及到一个服务的多实例,就会有多个jvm,synchronized只能保证当前实例在当前jvm下的原子性操作。

        我们用idea模拟一个集群来进行测试,如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        执行一下jmeter,看看结果是什么?

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        我们可以看到模拟的每一个机器都抢到了一个,那依旧完犊子了呀。

        结论:集群模式下synchronized不可取。

2.2、Lock锁

        相比synchronized而言,这个锁是方法,而synchronized是关键字。使用lock的实现ReentrantLock

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        改造代码如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        继续在模拟集群下进行测试,结果如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        结果和synchronized效果一样,只有在单机模式下可以保证没问题,而集群模式下依然会出现问题。

        结论:集群模式下Lock锁不可取。

二、集群模式下高并发问题

        上面讲了单机模式下可以采用的方式解决并发问题,但是有些方式在集群模式下就不可用了,下面就试一下在集群模式下依旧可以解决并发问题的方法。

        还是先看看不做任何处理的集群下进行抢商品是什么情况?

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        简直是炸裂,这样上线不被领导怼着鼻子springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        那我们怎么改造呢?我们引入Redisson。

        我们直接使用前面整合布隆过滤网的demo,就不讲整合Redisson了,已经讲过了,直接这里使用。

        改造后的代码如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        jmeter执行后的结果如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        三台机器只有一台抢到了一个苹果,达到了目的。Redisson的这个分布式锁的使用也很简单,如果服务挂掉,无法执行final的代码会如何,如下看看:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        我们打个断点假设服务在获取锁后服务挂了,redis如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        可10秒后,如下:

springboot 高并发,My Springboot Study Note,spring boot,后端,java,spring

        锁已经过期失效不见了。因此并不会导致死锁的发生,这个分布式锁的具体实现大佬们可以评论区交流谈论或者后面再继续说。文章来源地址https://www.toymoban.com/news/detail-845060.html

到了这里,关于【三十】springboot项目上高并发解决示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第二篇-前端模块搭建及单点登录的实现

    本文参考自 Springboot3+微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第(二)章——项目实现 的第二篇,详细讲解使用Vue3 + Vue CLI 实现前端模块搭建的过程,同时其中也会涉及一些前后端交互的实现,因此也会开发一些后端接口;搭建好前端页面后,

    2024年03月26日
    浏览(55)
  • 架构师核心-云计算&云上实战(云计算基础、云服务器ECS、云设施实战、云上高并发Web架构)

    阿里云 云计算岗位一般的要求是: 1、常见操作系统的使用与Linux命令行、Shell脚本 2、云计算基础:包括虚拟化技术、云存储、云安全等。 3、网络: 包括NAT、TCP/IP 4、Docker云原生K8S 5、开发环境搭建与部署 6、微服务、DevOps与云原生监控 7、故障排除、日志分析、变更管理 1.

    2024年04月23日
    浏览(52)
  • SpringBoot项目启动之后自动关闭解决办法

    我们在新建SpringBoot项目的时候,在运行的时候,一会就自动关闭了,这个主要是我们在新建的时候没有选择好依赖包,相当于没有内置的Tomcat,我们运行的Main函数其实就是一个普通的Main函数,所以运行完毕了之后就关闭了,遇到这个问题我们应该如何解决? 首先,检查我们

    2024年02月04日
    浏览(55)
  • SpringBoot项目配置多个RabbitMQ解决方案

    目前有一个Spring Boot项目,已经接入一个RabbitMQ Broker,由于业务扩展,需要新增一个RabbitMQ Broker进行消费,由于单个Broker时通过Spring默认配置进行使用,因此需要做出修改 pom 增加properties配置 增加配置类 增加properties配置 修改配置类

    2024年02月11日
    浏览(37)
  • 解决SpringBoot项目中@RestControllerAdvice全局异常失效问题

    使用@RestControllerAdvice添加了全局异常,但没有生效 方式1:@ExceptionHandler 所在类没有被Spring管理 因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描 方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面

    2024年02月09日
    浏览(37)
  • 生产项目中基于springboot项目解决循环依赖的三种方式

    在生产项目中,可以使用Spring Boot框架来快速开发Spring应用程序。Spring Boot提供了一种方便的方式来创建独立的,基于Spring的应用程序,并且有着高度的自动化配置和开箱即用的特性。 可以使用@Lazy注解来控制Bean的延迟初始化,同时可以使用AOP切面编程来解决循环依赖问题。

    2024年02月11日
    浏览(51)
  • 【快速解决】使用IDEA快速搭建SpringBoot项目(超详细)

    前言         Spring Boot是Spring Framework的一款脚手架式框架,可以帮助开发者快速构建基于Spring的企业级应用程序。本篇博客将介绍如何使用IntelliJ IDEA(以下简称IDEA)来快速搭建一个Spring Boot项目。 目录 ​编辑 前言 使用IDEA快速搭建SpringBoot项目 建立步骤 第一步新建一个

    2024年04月09日
    浏览(42)
  • springboot项目编译提示无效的源发行版17解决

    说明:本地机版本jdk为1.8,编码项目的时候提示无效的源发行版17。 1.修改项目设置:jdk版本为8     2.修改系统设置 3.pom检查是否jdk版本为1.8 如上修改完成后应该会解决问题,但是我本地还是报如此错误。然后检查一圈下来,我默认创建的spring版本为3.0,而3.0的默认依赖jd

    2024年02月11日
    浏览(45)
  • Springboot项目的run debug都是灰色解决方法

    IDEA下新建SpringBoot项目后,问题显示如下: 解决方法如下: 这个问题是由于缺少Configuration构建器的原因,因此:         1.点击Add Configuration 添加Spring Boot构建器,启动类选择好,点击确认即可(记得跳出来load maven项目,点击确认):

    2024年02月21日
    浏览(34)
  • 【Java】关于Springboot项目打包后运行提示“没有项目主清单”的解决问题

    1.问题复现 若使用maven打包后,使用 java -jar packge-name-pro-0.0.1.jar 运行jar包出现如下提示: packge-name-pro-0.0.1.jar 中没有主清单属性 说明在项目 pom.xml 文件中配置有问题 2.解决方法 打开你的 pom.xml 文件,在 project 标签内,添加如下代码: 关键代码是:

    2024年02月03日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包