Clicking是一个基于SpringBoot实现的秒杀系统,通过一些优化,提升其应对高并发的处理能力。
该项目主要能体现了应对高并发,大流量场景的秒杀系统的解决方案。(初学者入门)
展开查看
.
├─main
│ ├─java
│ │ └─com
│ │ └─github
│ │ └─soyanga
│ │ └─secondskillsystem
│ │ ├─access -- 防刷限流组件
│ │ ├─config -- 方法参数解析组件
│ │ ├─controller -- MVC的web层
│ │ ├─dao -- 数据库操作
│ │ ├─domain -- 实体类
│ │ ├─exception -- 全局异常处理
│ │ ├─rabbitmq -- RabbitMq组件
│ │ ├─redis -- Redis,Jedis 相关缓存配置
│ │ ├─result -- 请求结果封装
│ │ ├─service -- 服务层实现
│ │ ├─util -- 工具组件
│ │ ├─Validator -- 登陆号码校验组件
│ │ └─vo -- 返回视图整合处理
│ └─resources
│ ├─static
│ │ ├─bootstrap
│ │ │ ├─css
│ │ │ ├─fonts
│ │ │ └─js
│ │ ├─img --图片资源
│ │ ├─jquery-validation
│ │ │ └─localization
│ │ ├─js
│ │ └─layer
│ │ ├─mobile
│ │ │ └─need
│ │ └─skin
│ │ └─default
│ └─templates -- 存放Thymeleaf模板引擎所需的HTML
└─test
└─java -- 测试文件
-
前端:JQuery+Bootstrap+Thymeleaf
-
后端:SpringBoot-2.1.4+JSR303服务端验证框架+MyBatis
-
中间件:RabbitMQ+Redis+Druid
- IDEA+Maven+Tomcat+JDK8+Windows10
- 直接将last version文件导入IDEA即可,Maven提示选择自动导入依赖。
- 启动前请根据本地环境配置好application.properties中的数据库,Redis,Rabbit相关配置 (eg:地址,端口号)。
- 启动前请先创建seckill数据库,数据库建表语句放在:/mysql/seckill_sql.sql文件内。运行前务必先在插入秒杀用户信息、商品信息、秒杀商品信息、秒杀开始结束时间(…因为目前还没有做注册功能)。:busts_in_silhouette:
- 以上3步做好后,运行
src/main/java/com/github/soyanga/secondskillsystem
下的/MainApplication.java
中的main方法访问http://localhost:8080/login/to_login即可进入登陆页面。 - 本项目运行环境默认是在windows下的,如需部署到服务器上则根据实际情况自行配置相关参数。:yum:
秒杀功能基本实现后使用JMeter对项目进行了压测,发现qps并不是很理想,且出现了超买。
根据项目分析发现性能瓶颈主要是在数据库上,所有秒杀请都会访问数据库,数据库并不能承受这么高的并发量,我适当调节了数据库连接池Druid的参数,并没有对性能上有太多的提升。所以如下分别从页面,秒杀接口上入手,减少对数据库的访问。并且对系统安全上进行了优化
- 页面缓存+URL缓存+对象缓存
- 页面静态化,前后端分离
- 静态资源的优化(图片 CSS,JS)
- JS/CSS压缩,减少流量(项目中并未具体实现,只是利用了SpringBoot.resources)
- 多个JS/CSS组合一个请求,减少连接数(并未具体实现)
- CDN优化
- CDN服务器就近访问,服务器轮询(可以进一步优化的点)
- Redis预减库存减少数据库访问
- 内存标记减少Redis访问
- RabbitMQ队列缓冲,异步下单,增强用户体验
- Nginx水平扩展(没有实施环境,只是概念层假设)
- LVS
- 秒杀接口地址隐藏
- 数学公式的验证码 (削峰)
- 接口防刷 类似限流
- 数据库加唯一索引:防止用户重复购买(添加事务,数据库添加失败就回滚并不会创建订单)
- SQL加库存数量判断:防止库存变成负数