simlock
A control plane so parallel coding agents stop fighting over the same simulator.
🐎基于SpringCloud 2025.x + Dubbo 3.x + AI构建的模拟秒杀微服务项目,集成了Elasticsearch🔍、Gateway、Mybatis-Plus、Sharding-JDBC等常用开源组件
Translation pending
Developer toolsJava · VueGitHub @techa03Self-installOwner unconfirmed
Paste into Claude or ChatGPT for installation instructions suited to your environment.
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Installable projects can be verified without a deployment domain. Use GitHub sign-in for a personal repository, or the repository verification file above for an organization repository.
Ask about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗项目命名为 goodsKill 一方面有商品秒杀的意思(好像有点chinglish的味道),另外也可理解为 good skill,本项目就是希望搭建一套完整的项目框架,把一些好的技术和开发技巧整合进来(偏向于后端技术),方便学习和查阅。另外需要注意的是,实际项目中并不是使用越多技术栈越好,过多的技术栈引入会带来额外的维护成本以及使用成本。
本项目为模拟秒杀项目,提供统一秒杀模拟请求接口,技术上整体采用SpringMVC + Mybatis持久层框架,采用Dubbo3.x+原生RestClient完成服务间接口调用,服务注册发现以及配置中心使用Nacos,支持数据库分库分表、分布式事务,使用状态机完成数据状态间的转换(基于Spring Statemachine实现)。
集成了Spring AI服务,可以通过AI机器人完成模拟秒杀动作。
已集成基于 OpenTelemetry 的全链路可观测性能力,通过 Grafana OTel LGTM(内置 OpenTelemetry Collector / Grafana / Loki / Mimir / Tempo)一站式实现指标、日志、分布式追踪的统一观测。
本项目基于最新Spring Cloud 2025.x + Spring Boot 4.x + JDK21体系构建,目前比较简陋且有很多不完善的地方,真实的秒杀场景远比本项目中的实现方式复杂,本项目省略了真实场景中的部分技术实现细节,目前仅作学习参考之用,如果觉得本项目对你有帮助的请多多star支持一下👍~~~~。
附:码云项目链接
https://gitee.com/techa/goodsKill,clone速度慢的用码云仓库拉吧,不定期同步到码云~
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框架的用户登录授权服务
|--goodskill-ui ||前端项目,基于Vue 3 + Vite构建的管理系统
|--goodskill-customer-ui ||C端用户前端项目,基于Vue 3 + Vite构建的秒杀商城
目前实现了几种秒杀方案,通过SeckillMockController提供测试接口
聚合网关Openapi文档地址: http://localhost/doc.html#/home(需要开启网关服务)
Spring Boot Admin应用监控地址: http://www.goodskill.com:19031, 登录用户名密码:user/123456
limit的流控规则)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分布式锁实现)
| 镜像 | 版本 | 端口 | 用户名密码 |
|---|---|---|---|
| Nacos | 3.2.1 | 18080 | nacos:nacos(控制台) |
| Redis | latest | 6379 | 密码:123456 |
| Kafka | 3.9.1 | 9092 | 无 |
| Kafbat UI | latest | 38080:8080 | 无 |
| Mongo | 6.0.7 | 27017 | 无 |
| MySQL | 8.0.29 | 3306 | root:Password123 |
| Zookeeper | 3.6.2 | 2181 | 无 |
| Elasticsearch | 9.2.2 | 9200 9300 | 无 |
| Kibana | 9.2.2 | 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(控制台) |
| Grafana OTel LGTM | latest | 3000 (Grafana UI) / 4317 (OTLP gRPC) / 4318 (OTLP HTTP) | admin:admin(Grafana 控制台) |
goodsKill中执行 mvn clean install
或
#跳过单元测试
mvn clean install -DskipTests
docker-compose up -d
goodskill-web/src/main/sql目录,找到seckill.sql文件,在本地mysql数据库中建立seckill仓库并执行完成数据初始化操作⚠️ docker-compose启动MySQL镜像时会自动执行初始化脚本,如已执行过上一步本步骤可跳过
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
127.0.0.1 minio
##如果网关服务部署在远程机器,此处改为相应的远程机器ip
127.0.0.1 www.goodskill.com
在Nacos配置中心中添加DataId为goodskill-common-connection.yml(中间件公共配置)、goodskill-common.yml(服务公共配置)的公共配置,Group为DEFAULT_GROUP,具体内容可参考项目根目录中的goodskill-common-connection.yml、goodskill-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则表示没有出现超卖或者少卖问题
基于 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分布式事务测试示例运行说明
main方法运行GoodskillAdminApplication类(微服务健康状态指标监控)
管理端前端项目位于 goodskill-ui 目录下,基于Vue 3 + Vite构建。
cd goodskill-ui
npm install
npm run dev
开发服务器启动后,可通过以下地址访问前端项目:http://localhost:5173
管理端前端项目提供以下功能:
C端用户前端项目位于 goodskill-customer-ui 目录下,是一个面向消费者的秒杀商城前端应用。
cd goodskill-customer-ui
npm install
npm run dev
开发服务器启动后,可通过以下地址访问前端项目:http://localhost:5174
C端用户前端项目提供以下功能:
出现此问题一般为linux环境,运行以下命令即可 sysctl -w vm.max_map_count=262144,或者修改/etc/sysctl.conf文件,追加以下配置:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
本项目目前依赖的各个主流框架的版本比较新,尚未经过完整测试2。
no available service found in cluster 'default', please make sure registry config correct and keep your seata server running 如何解决?启动seata-server服务即可(docker-compose.yml文件中已提供),可参照Seata官网添加nacos相关配置。如未使用分布式事务,可忽略该错误,不影响服务正常运行
hub.docker被墙,国内可使用阿里云镜像加速器,具体操作见 阿里云镜像加速器
启动时添加以下jvm参数,例如:
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.util.concurrent=ALL-UNNAMED
--add-opens java.base/java.math=ALL-UNNAMED
--add-opens java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED
目前秒杀活动状态的控制基于Spring Statemachine状态机实现,使用状态机的优点:
| 表 | 数据库 | 是否分库 | 分库字段 | 是否分表 | 分表字段 |
|---|---|---|---|---|---|
| success_killed | MySQL | 是(同一服务器中,分为seckill和seckill_01两个库) | seckill_id | 是(分为success_killed_0,success_kill_1两张表) | user_phone |
📢 其他表均未分库分表,默认使用seckill作为主库
| 登录页面 | 工作台首页 |
|---|---|
| 用户管理 | 商品管理 | 秒杀模拟 |
|---|---|---|
| 商城首页 | 商品详情页 | 订单详情页 |
|---|---|---|
https://spring.io/blog/2025/11/18/opentelemetry-with-spring-boot需要安装docker-desktop https://www.docker.com/products/docker-desktop/ ↩
附 SpringCloudAlibaba 兼容版本说明 ↩