分布式高并发商品秒杀系统
本项目是在dis-seckill
上改进,项目名含义为分布式秒杀系统。采用微服务**,意在提高秒杀系统的整体性能。
-
优化秒杀流程,提高单机系统性能瓶颈。
dis-seckill-test
- 高性能。秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。对应的方案比如动静分离方案、热点的发现和隔离、请求的削峰与分层过滤、服务端的极致优化。
- 一致性。秒杀中商品减库存的实现方式同样关键。有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分“拍下减库存"”付款减库存“以及预扣几种。系统需要在大并发更新的过程中要保证数据的准确性。
- 高可用。现实中难免出现一些我们考虑不到的情况,所以要保证系统的高可用性和正确性,我们还需要设计一个planB来兜底,以便应对一些意外情况。比如高并发情况下服务的熔断和降级。
-
构建工具
⚔️ apache-maven-3.6.1
-
开发环境
☕ 🌁 🏖 🎯 🦄 Java 1.8
Mysql 8.0.12
Redis 5.0.5
Zookeeper 3.4.10
Rabbitmq 3.7.15
🧐 🥇 🌈 🍻 🚀 📮 🚏 SpringBoot 2.1.5
MyBatis 2.0.1
Dubbo 2.7.1
Nginx 1.20.1
Sentinel 1.8.1
Thymeleaf 3.0.11
jmeter 5.4.1
在运行秒杀系统之前,需要安装表格第一排软件,并开启相应软件。
准备:修改mysql
数据库配置,连接、账户和密码。
spring.datasource.url=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123
(根据自己数据库配置做相应修改)
第一步;执行dis-seckill-common/schema/seckill.sql
文件,初始化数据库。
第二步;如果安装了git,则可以采用下面的方式快速启动;
git clone https://github.com/parkt90/dis-seckill.git
mvn clean package
启动缓存服务:
java -jar dis-seckill-cache/target/dis-seckill-cache-0.0.1-SNAPSHOT.jar
启动用户服务:
java -jar dis-seckill-user/target/dis-seckill-user-0.0.1-SNAPSHOT.jar
启动订单服务:
java -jar dis-seckill-order/target/dis-seckill-order-0.0.1-SNAPSHOT.jar
启动商品服务:
java -jar dis-seckill-goods/target/dis-seckill-goods-0.0.1-SNAPSHOT.jar
启动消息队列服务:
java -jar dis-seckill-mq/target/dis-seckill-mq-0.0.1-SNAPSHOT.jar
启动网关服务:
java -jar dis-seckill-gateway/target/dis-seckill-gateway-0.0.1-SNAPSHOT.jar
注:启动服务时最好按上面的顺序启动。
如果将项目导入IDE
中进行构建,则分别按上面的顺序启动服务模块主程序即可。
第三步;访问项目入口地址
初始用户手机号码:13111897391,密码:000000
-
模块介绍
-
dis-seckill-common
:通用模块 -
dis-seckill-user
:用户模块 -
dis-seckill-goods
:商品模块 -
dis-seckill-order
:订单模块 -
dis-seckill-gateway
:网关模块 -
dis-seckill-cache
:缓存模块 -
dis-seckill-mq
:消息队列模块用户请求全部交由
Gateway
模块处理,Gateway
模块使用RPC
(远程过程调用)的方式调用其他模块提供的服务完成业务处理。
-
-
秒杀流程图
- 秒杀方案介绍:
- 前端文件资源路径:
dis-seckill-gateway\src\main\resources\
Q&A |
---|
前后端交互接口定义 |
前后端交互接口逻辑实现 |
Redis 中存储的数据 |
使用分布式锁解决恶意用户重复注册问题 |
拦截器HandlerInterceptor 的使用 |
Rabbitmq 如何保证消息的可靠投递(推荐文章) |
redis 和mysql 如何实现双删一致性(推荐文章) |
限流的的原理和项目中使用(近期更新) |