说明

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

项目地址

使用的技术

单体架构

技术 说明
Spring Boot 后端项目框架
Mybatis-Plus 持久层框架
MySQL5.6 数据库
Redis 缓存中间件
RabbitMQ 消息队列(需要安装延迟队列的插件:RabbitMQ 实现延时队列
Vue.js 前端JavaScript框架
Element 基于 Vue 2.0 的桌面端组件库

微服务架构

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

技术 说明
Spring Cloud 微服务框架
Spring Cloud Alibaba 阿里微服务框架
Nacos 微服务注册中心
OpenFeign Web服务客户端
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)

我的JMeter配置文件的阿里云链接:https://www.aliyundrive.com/s/pmWpyo6L63J,直接在JMeter导入(File>>Open

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

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

image-20220409232540517

配置Gateway的IP限流

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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}"

PS.

数据库文件在单体架构版本的GitHub仓库中,链接为:https://github.com/a6678696/MiaoSha