高并发商品秒杀系统

1,107 阅读3分钟

说明

本项目为前后端分离项目,后端代码有两个版本:一个是单体架构,另一个是微服务架构(对单体架构进行了微服务拆分)

项目地址

前端代码

a6678696/miaosha-web: 高并发商品秒杀系统前端代码(前后端分离项目) (github.com)

后端代码

单体架构版本

a6678696/MiaoSha: 高并发商品秒杀系统后端代码(前后端分离项目,单体架构版本) (github.com)

微服务架构版本

a6678696/miaosha-admin: 高并发商品秒杀系统后端代码(前后端分离项目,微服务架构版本) (github.com)

使用的技术

单体架构

技术说明
Spring Boot后端项目框架
Mybatis-Plus持久层框架
MySQL5.6数据库
Redis缓存中间件
RabbitMQ消息队列
Vue.js前端JavaScript框架
Element基于 Vue 2.0 的桌面端组件库

微服务架构

在单体架构的基础上,多使用了以下技术:

技术说明
Spring Cloud微服务框架
Spring Cloud Alibaba阿里微服务框架
Nacos微服务注册中心
OpenFeignWeb服务客户端
Gateway微服务网关

功能介绍

  1. 用户注册与登录
  2. 查看正在秒杀的商品列表
  3. 查看正在秒杀的商品详情
  4. 秒杀商品,成功后下单
  5. 30分钟未支付自动取消订单并释放商品和秒杀商品的库存
  6. 模拟支付

秒杀流程图

图片展示

注册界面

image-20220409230821932

登录界面

image-20220409230831836

查看正在秒杀的商品

image-20220409230857976

秒杀页面

image-20220409230919527

我的订单

image-20220409230953051

模拟支付

image-20220409231011260

注销登录

image-20220409231025055

模拟海量用户秒杀

用户批量注册

下面方法批量注册1000个用户到数据库中,如果是导入我的数据库文件可忽略此步

image-20220409231858593

用户批量登录

执行这步前要先注册用户,如果是微服务架构就请求http://localhost:8080/user/loginAuto 这个接口即可实现批量登录,并把对应的userId和Token保存到TXT文件中

image-20220409231653964

测试

并发测试使用JMeter这个软件,安装与使用教程查看这几篇博客:标签: JMeter | LeDao 的博客 (zoutl.cn)

测试前先删除Redis中对应的秒杀商品的key,确认可秒杀商品的数量不为0

测试的接口为:http://localhost:8080/order/save,参数如下图所示

image-20220409232540517

配置Gateway的IP限流

多种限流方式查看博客:Gateway 的基本使用 | LeDao 的博客 (zoutl.cn)

IP限流只在微服务架构版本有用,配置类ipKeyResolver已经写好了,现在只需要配置miaosha-gateway微服务的spring-cloud.yml配置就行了,完整配置如下:

spring:
  application:
    name: miaosha-gateway
  cloud:
    nacos:
      discovery:
        namespace: 8b2d6583-c0a0-43bd-a2a8-b215eba8c70e
        group: miaosha
        server-addr: 192.168.0.141:8848
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
              allowCredentials: true
              allowedHeaders: "*"
              allowedOrigins: "*"
              allowedMethods: "*"
      routes:
        - id: user_router
          uri: lb://miaosha-user
          predicates:
            - Path=/user/**

        - id: goods_router
          uri: lb://miaosha-goods
          predicates:
            - Path=/miaoShaGoods/**

        - id: order_router
          uri: lb://miaosha-order
          predicates:
            - Path=/order/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充速率
                redis-rate-limiter.burstCapacity: 2 #令牌桶总容量
                redis-rate-limiter.requestedTokens: 1 # 每次请求消耗1个
                key-resolver: "#{@ipKeyResolver}"