/dis-seckill

⭐⭐⭐⭐SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统

Primary LanguageJavaMIT LicenseMIT

分布式高并发商品秒杀系统

介绍

本项目是在dis-seckill上改进,项目名含义为分布式秒杀系统。采用微服务**,意在提高秒杀系统的整体性能。

改进点:

秒杀系统应具备要求

  1. 高性能。秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。对应的方案比如动静分离方案、热点的发现和隔离、请求的削峰与分层过滤、服务端的极致优化。
  2. 一致性。秒杀中商品减库存的实现方式同样关键。有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分“拍下减库存"”付款减库存“以及预扣几种。系统需要在大并发更新的过程中要保证数据的准确性。
  3. 高可用。现实中难免出现一些我们考虑不到的情况,所以要保证系统的高可用性和正确性,我们还需要设计一个planB来兜底,以便应对一些意外情况。比如高并发情况下服务的熔断和降级。

快速启动

在运行秒杀系统之前,需要安装表格第一排软件,并开启相应软件。

准备:修改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中进行构建,则分别按上面的顺序启动服务模块主程序即可。

第三步;访问项目入口地址

http://localhost:8082

初始用户手机号码: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\

TODO

Q&A

Q&A
前后端交互接口定义
前后端交互接口逻辑实现
Redis中存储的数据
使用分布式锁解决恶意用户重复注册问题
拦截器HandlerInterceptor的使用
Rabbitmq如何保证消息的可靠投递(推荐文章)
redismysql如何实现双删一致性(推荐文章)
限流的的原理和项目中使用(近期更新)

参考资料