SkillAgentSearch skills...

GoodsKill

🐎基于SpringCloud 2023.x + Dubbo 3.x + AI构建的模拟秒杀微服务项目,集成了Elasticsearch🔍、Gateway、Mybatis-Plus、Sharding-JDBC等常用开源组件

Install / Use

/learn @techa03/GoodsKill
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

前言

License Java CI with Maven codecov CodeQL

English

项目命名为 goodsKill 一方面有商品秒杀的意思(好像有点chinglish的味道),另外也可理解为 good skill,本项目就是希望搭建一套完整的项目框架,把一些好的技术和开发技巧整合进来(偏向于后端技术),方便学习和查阅。另外需要注意的是,实际项目中并不是使用越多技术栈越好,过多的技术栈引入会带来额外的维护成本以及使用成本。

本项目为模拟秒杀项目,提供统一秒杀模拟请求接口,技术上整体采用SpringMVC + Mybatis持久层框架,采用Dubbo3.x[^1]+Feign完成服务间接口调用,服务注册发现以及配置中心使用Nacos,支持数据库分库分表、分布式事务,使用状态机完成数据状态间的转换(基于Spring Statemachine实现)。

集成了Spring AI服务,可以通过AI机器人完成模拟秒杀动作。

[^1]: 由于SpringCloudAlibaba官方暂未支持Dubbo 3.x,本项目采用dubbo-spring-boot-starter集成

💎 分支介绍

main分支基于最新Spring Cloud 2023.x + Spring Boot 3.x + JDK21体系构建,目前仅保留核心的模拟秒杀API接口,如需使用Spring Boot 2.7.x + JDK11版本可以切换到tag v2.7.4(支持登录注册以及简单的后台管理功能)。

本项目功能目前比较简陋且有很多不完善的地方,真实的秒杀场景远比本项目中的实现方式复杂,本项目省略了真实场景中的部分技术实现细节,目前仅作学习参考之用,如果觉得本项目对你有帮助的请多多star支持一下👍~~~~。

附:码云项目链接 https://gitee.com/techa/goodsKill,clone速度慢的用码云仓库拉吧,不定期同步到码云~

✨ 技术选型

| 使用的工具或框架 | 名称 | 官网 | |---|---|---| | Spring Boot | Spring Boot框架 | https://spring.io/projects/spring-boot | | MyBatis-Plus | MyBatis增强工具 | https://mp.baomidou.com/ | | ZooKeeper | 分布式协调服务 | http://zookeeper.apache.org/ | | Redis | 分布式缓存数据库 | https://redis.io/ | | Kafka | 消息队列 | http://kafka.apache.org/ | | RabbitMQ | 消息队列 | https://www.rabbitmq.com/ | | MongoDB | Mongo数据库 | https://www.mongodb.com/ | | MySQL | MySQL数据库 | https://www.mysql.com/ | | PostgreSQL | PostgreSQL数据库 | https://www.postgresql.org/ | | Elasticsearch | 全文搜索引擎 | https://www.elastic.co | | Sharding-JDBC | 分库分表组件 | https://shardingsphere.apache.org | | Spring Cloud Alibaba | Cloud Alibaba组件 | https://github.com/alibaba/spring-cloud-alibaba | | Apache Dubbo | RPC服务远程调用框架 | https://github.com/apache/dubbo | | Spring Cloud Gateway | 网关组件 | https://spring.io/projects/spring-cloud-gateway | | Seata | 分布式事务解决方案 | http://seata.io/zh-cn/index.html | | Spring Security OAuth2.0 | OAuth2.0授权组件 | https://spring.io/projects/spring-security-oauth | | GraphQL | 一种用于 API 的查询语言 | https://docs.spring.io/spring-graphql/docs/current/reference/html | | Spring Statemachine | Spring 状态机 | https://spring.io/projects/spring-statemachine | | Sa-Token | 轻量级权限认证框架 | https://sa-token.cc/ | | Flyway | 数据库版本控制工具 | https://flywaydb.org/ | | MinIO | 对象存储服务 | https://min.io/ | | Spring AI | AI组件 | https://spring.io/projects/spring-ai |

📝 项目模块介绍

goodsKill
|--goodskill-admin                          ||SpringBoot Admin监控服务端,支持Spring Cloud微服务发现
|--goodskill-ai                             ||AI机器人聊天服务
|--goodskill-gateway                        ||微服务API网关,统一服务鉴权,支持动态路由加载
|--goodskill-order-provider                 ||订单服务提供者
|--goodskill-seckill-provider               ||秒杀服务提供者
|--goodskill-spring-boot-starter            ||项目配置自动装配
|--goodskill-common                         ||公共服务(目前包含minio上传下载功能)
|--goodskill-web                            ||提供秒杀模拟接口访问
|--goodskill-job                            ||elastic-job定时任务
|--goodskill-seata                          ||集成nacos+dubbo+shardingjdbc+seata的分布式事务解决方案示例
|--goodskill-auth                           ||auth登录以及授权模块
|   |--auth-service                         ||基于Sa-Token框架的用户登录授权服务
    |--oauth2-auth-server                   ||oauth2.0登录授权服务端,自定义的登录授权服务
    |--oauth2-resource-server               ||oauth2.0资源服务端,自定义的登录授权服务
|--goodskill-ui                             ||前端项目,基于Vue 3 + Vite构建的管理系统

🔥🔥 秒杀方案

目前实现了几种秒杀方案,通过SeckillMockController提供测试接口

聚合网关Openapi文档地址: http://localhost/doc.html#/home(需要开启网关服务)

Spring Boot Admin应用监控地址: http://www.goodskill.com:19031, 登录用户名密码:user/123456

  • 场景一:Sychronized同步锁实现
  • 场景二:Redisson分布式锁实现
  • 场景三:ActiveMQ实现(已废弃)
  • 场景四:Kafka消息队列实现
  • 场景五:数据库原子性更新
  • 场景六:实时等待秒杀处理结果(已废弃)
  • 场景七:ZooKeeper分布式锁
  • 场景八:使用Redis进行秒杀商品减库存操作,秒杀结束后异步发送MQ,使用MongoDB完成数据落地
  • 场景九:Spring Cloud Stream实现
  • 场景十:Sentinel限流+数据库原子性更新(需搭配sentinel控制台配置资源名limit的流控规则)
<details> <summary>可在web控台查看秒杀结果,打印信息类似:</summary>
2021-04-14 21:58:59.857  INFO [goodskill-web,df43cc8f59291c48,df43cc8f59291c48] 15808 --- [           main] o.s.w.controller.SeckillMockController   : 秒杀场景二(redis分布式锁实现)开始时间:Wed Apr 14 21:58:59 CST 2021,秒杀id:1000
2021-04-14 21:59:00.094  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 秒杀活动结束,秒杀场景二(redis分布式锁实现)时间:Wed Apr 14 21:59:00 CST 2021,秒杀id:1000
2021-04-14 21:59:00.101  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数统计中。。。
2021-04-14 21:59:01.616  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数统计中。。。
2021-04-14 21:59:03.129  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数:10
2021-04-14 21:59:03.130  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 历史任务耗时统计:StopWatch '': running time = 36159894800 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
4492195700  012%  秒杀场景四(kafka消息队列实现)
3164155900  009%  秒杀场景八(秒杀商品存放redis减库存,异步发送秒杀成功MQ,mongoDb数据落地)
6219218300  017%  秒杀场景十(Sentinel限流+数据库原子性更新)
9189080600  025%  秒杀场景七(zookeeper分布式锁)
3135926500  009%  秒杀场景五(数据库原子性更新update set num = num -1)
3342791800  009%  秒杀场景九(基于springcloud stream rabbitmq)
3343433700  009%  秒杀场景一(sychronized同步锁实现)
3273092300  009%  秒杀场景二(redis分布式锁实现)
</details>

🧰 开发环境版本说明

  • JDK: OpenJDK21
  • Sharding-JDBC: 5.5.0
  • SpringCloud: 2023.x.x
  • SpringBoot: 3.3.x
  • SpringCloudAlibaba: 2023.x.x
  • Apache Dubbo: 3.3.x
  • 使用的Docker镜像

| 镜像 | 版本 | 端口 | 用户名密码 | |---|---|---|---| | Nacos | 2.3.2-slim | 8848 | nacos:nacos(控制台) | | Redis | latest | 6379 | 密码:123456 | | Kafka | 3.1.1 | 9092 | 无 | | KafkaManager | latest | 9001:9000 | 无 | | Mongo | 6.0.7 | 27017 | 无 | | MySQL | 8.0.29 | 3306 | root:Password123 | | Zookeeper | 3.6.2 | 2181 | 无 | | Elasticsearch | 8.14.3 | 9200 9300 | 无 | | Kibana | 8.14.3 | 5601 | 无 | | RabbitMQ | latest | 5672 15672 | 无 | | PostgreSQL | pgvector/pgvector:pg15 | 5432 | goodskill:Password123 | | MinIO | latest | 9000 | root:password | | Seata | 2.0.0 | 7091 8091 | seata:seata(控制台) |

🎯 快速开始

  • 项目根目录goodsKill中执行
  mvn clean install
  或
  #跳过单元测试
  mvn clean install -DskipTests
  • 默认端口启动nacos、redis、mysql、rabbitmq、kafka、zookeeper、elasticsearch、seataServer,或者使用docker-compose[^2]命令:
  docker-compose -f goodskill-simple.yml up -d

[^2]: 需要安装docker-desktop https://www.docker.com/products/docker-desktop/

  • 进入goodskill-web/src/main/sql目录,找到seckill.sql文件,在本地mysql数据库中建立seckill仓库并执行完成数据初始化操作

⚠️ docker-compose启动MySQL镜像时会自动执行初始化脚本,如已执行过上一步本步骤可跳过

  • 配置host
 127.0.0.1       kafka
 127.0.0.1       nacos
 127.0.0.1       redis
 127.0.0.1       mysql
 127.0.0.1       zookeeper
 127.0.0.1       mongo
 127.0.0.1       elasticsearch
 127.0.0.1       rabbitmq
 127.0.0.1       logstash
 127.0.0.1       postgres
 ##如果网关服务部署在远程机器,此处改为相应的远程机器ip
 127.0.0.1       www.goodskill.com
  • 在Nacos配置中心中添加DataId为goodskill-common-connection.yml(中间件公共配置)、goodskill-common.yml(服务公共配置)的公共配置,Group为DEFAULT_GROUP,具体内容可参考项目根目录中的goodskill-common-connection.ymlgoodskill-common.yml文件

  • main方法运行OrderApplication类(订单服务)

  • main方法运行SeckillApplication类(秒杀管理服务提供者)

  • main方法运行SampleWebApplication类(模拟秒杀web服务)

  • 发送一个秒杀模拟请求: 秒杀活动id 1000,商品数量10,执行20次购买操作,使用sychronized同步锁执行,例如:

可直接使用以下命令发送模拟秒杀请求,每个秒杀活动seckillId对应唯一的一个商品id,每次执行接口时会有一个库存初始化动作,接口执行完成后可重复调用

使用sychronized同步锁执行

curl -X POST "http://www.goodskill.com:8080/sychronized" \
-H "accept: */*" -H "Content-Type: application/json" -d \
"{ \"requestCount\": 20, \"seckillCount\": 10, \"seckillId\": 1000}"

使用Redisson分布式锁执行

curl -X POST "http://www.goodskill.com:8080/redisson" \
-H "accept: */*" -H "Content-Type: application/json" -d \
"{ \"requestCount\": 20, \"seckillCount\": 10, \"seckillId\": 1000}"

使用Redisson分布式锁执行,支持动态配置后台线程池核心线程数以及最大线程数

curl --location --request POST 'http://www.goodskill.com:8080/limit' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--data-raw '{
    "maxPoolSize": 10,
    "seckillId": 1000,
    "corePoolSize": 2,
    "seckillCount": 100,
    "requestCount": 120
}'

请求默认异步执行,可在控制台查看执行日志,如果最终成功交易笔数等于商品数量10则表示没有出现超卖或者少卖问题

🤖️ 使用AI机器人聊天服务

基于 Spring AI Alibaba 构建的简易秒杀机器人服务,可以通过机器人服务完成服务调用,目前支持开启秒杀活动、输出活动耗时情况,以及知识库问答功能。

详细的环境配置和 API 介绍请参考 goodskill-ai/README.md

🕹️️ 启动其他可选项目步骤

在快速开始部分基础上增加以下步骤即可启动一个完整项目

  • 进入goodskill-gateway模块,通过GatewayBootApplication类main方法启动服务网关,统一通过网关访问各个服务

| 访问路径 | 对应服务 | |---|---| | http://www.goodskill.com/api/order/** | goodskill-order 服务 | | http://www.goodskill.com/api/seata/** | goodskill-seata 服务 | | http://www.goodskill.com/api/seckill/** | goodskill-seckill 服务 | | http://www.goodskill.com/api/auth/** | goodskill-auth 服务 | | http://www.goodskill.com/api/web/** | goodskill-web 服务 | | http://www.goodskill.com/api/common/** | goodskill-common 服务 | | http://www.goodskill.com/api/ai/** | goodskill-ai 服务 |

  • 已集成Sentinel限流组件,支持nacos配置中心方式推送限流规则,使用时需启动Sentinel控制台,并以18088端口启动,docker环境暂不支持。

  • Seata分布式事务测试方法见 [Seata分布式事务测试示例运行说明](https://github.com/techa03/goodsKill/tree/main/goodskill-s

Related Skills

View on GitHub
GitHub Stars2.4k
CategoryDevelopment
Updated10h ago
Forks509

Languages

Java

Security Score

100/100

Audited on Mar 28, 2026

No findings