{"id":13607824,"url":"https://github.com/techa03/goodsKill","last_synced_at":"2025-04-12T14:31:23.996Z","repository":{"id":38375872,"uuid":"76093141","full_name":"techa03/goodsKill","owner":"techa03","description":"🐍基于SpringCloud 2023.x + Dubbo 3.x + AI构建的模拟秒杀微服务项目，集成了Elasticsearch🔍、Gateway、Mybatis-Plus、Sharding-JDBC等常用开源组件","archived":false,"fork":false,"pushed_at":"2025-02-24T14:06:45.000Z","size":10901,"stargazers_count":2127,"open_issues_count":0,"forks_count":487,"subscribers_count":43,"default_branch":"main","last_synced_at":"2025-04-11T01:41:46.528Z","etag":null,"topics":["ai","java","oauth2","sharding-jdbc","spring-boot","springcloud","springcloudalibaba"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/techa03.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-12-10T05:40:34.000Z","updated_at":"2025-04-10T13:54:15.000Z","dependencies_parsed_at":"2023-02-09T15:16:44.159Z","dependency_job_id":"186771a3-d40e-40ca-9284-dcfa04e0a82c","html_url":"https://github.com/techa03/goodsKill","commit_stats":{"total_commits":820,"total_committers":6,"mean_commits":"136.66666666666666","dds":0.06463414634146336,"last_synced_commit":"df39c97cfadadd0f0678d597d2254baba038b5bc"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techa03%2FgoodsKill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techa03%2FgoodsKill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techa03%2FgoodsKill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/techa03%2FgoodsKill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/techa03","download_url":"https://codeload.github.com/techa03/goodsKill/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248581139,"owners_count":21128107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","java","oauth2","sharding-jdbc","spring-boot","springcloud","springcloudalibaba"],"created_at":"2024-08-01T19:01:21.913Z","updated_at":"2025-04-12T14:31:23.987Z","avatar_url":"https://github.com/techa03.png","language":"Java","readme":"= 前言\n\nimage:https://img.shields.io/badge/license-MIT-blue.svg[License,link=LICENSE]\nimage:https://github.com/techa03/goodsKill/actions/workflows/maven.yml/badge.svg?branch=master[Java CI with Maven,link=https://github.com/techa03/goodsKill/actions/workflows/maven.yml]\nimage:https://codecov.io/gh/techa03/goodsKill/branch/master/graph/badge.svg[codecov,link=https://codecov.io/gh/techa03/goodsKill]\nimage:https://github.com/techa03/goodsKill/actions/workflows/codeql.yml/badge.svg?branch=main[CodeQL,link=https://github.com/techa03/goodsKill/actions/workflows/codeql.yml]\n\n项目命名为 *goodsKill* 一方面有商品秒杀的意思(好像有点chinglish的味道)，另外也可理解为 *good skill*，本项目就是希望搭建一套完整的项目框架，把一些好的技术和开发技巧整合进来（偏向于后端技术），方便学习和查阅。\n\n\n本项目为模拟秒杀项目，提供统一秒杀模拟请求接口，技术上整体采用SpringMVC + Mybatis持久层框架，采用Dubbo3.x{empty}footnote:[由于SpringCloudAlibaba官方暂未支持Dubbo 3.x，本项目采用dubbo-spring-boot-starter集成]+Feign完成服务间接口调用，服务注册发现以及配置中心使用Nacos，支持数据库分库分表、分布式事务，使用状态机完成数据状态间的转换（基于Spring Statemachine实现）。\n\n集成了Spring AI服务，可以通过AI机器人完成模拟秒杀动作。\n\n== 💎 分支介绍\n\n``main``分支基于最新Spring Cloud 2023.x + Spring Boot 3.x + JDK21体系构建，目前仅保留核心的模拟秒杀API接口，如需使用Spring Boot 2.7.x + JDK11版本可以切换到tag https://github.com/techa03/goodsKill/tree/v2.7.4[v2.7.4]（支持登录注册以及简单的后台管理功能）。\n\n本项目功能目前比较简陋且有很多不完善的地方，真实的秒杀场景远比本项目中的实现方式复杂，本项目省略了真实场景中的部分技术实现细节，目前仅作学习参考之用，如果觉得本项目对你有帮助的请多多star支持一下👍~~~~。\n____\n\n附：码云项目链接 `https://gitee.com/techa/goodsKill`,clone速度慢的用码云仓库拉吧，不定期同步到码云~\n\n____\n\n== ✨ 技术选型\n\n|===\n|使用的工具或框架 |名称 |官网\n\n|Spring Boot |Spring Boot框架 |https://spring.io/projects/spring-boot\n|MyBatis-Plus |MyBatis增强工具 |https://mp.baomidou.com/\n|ZooKeeper |分布式协调服务 |http://zookeeper.apache.org/\n|Redis |分布式缓存数据库 |https://redis.io/\n|Kafka |消息队列 |http://kafka.apache.org/\n|RabbitMQ |消息队列 |https://www.rabbitmq.com/\n|MongoDB |Mongo数据库 |https://www.mongodb.com/\n|MySQL |MySQL数据库 |https://www.mysql.com/\n|Elasticsearch |全文搜索引擎 |https://www.elastic.co\n|Sharding-JDBC |分库分表组件 |https://shardingsphere.apache.org\n|Spring Cloud Alibaba |Cloud Alibaba组件 |https://github.com/alibaba/spring-cloud-alibaba\n|Apache Dubbo | RPC服务远程调用框架 |https://github.com/apache/dubbo\n|Spring Cloud Gateway |网关组件 |https://spring.io/projects/spring-cloud-gateway\n|Seata |分布式事务解决方案 |http://seata.io/zh-cn/index.html\n|Spring Security OAuth2.0 |OAuth2.0授权组件 |https://spring.io/projects/spring-security-oauth\n|GraphQL |一种用于 API 的查询语言 |https://docs.spring.io/spring-graphql/docs/current/reference/html\n|Spring Statemachine |Spring 状态机 |https://spring.io/projects/spring-statemachine\n|Sa-Token |轻量级权限认证框架 |https://sa-token.cc/\n|Flyway |数据库版本控制工具 |https://flywaydb.org/\n|MinIO |对象存储服务 |https://min.io/\n|Spring AI |AI组件 |https://spring.io/projects/spring-ai\n|===\n\n== 📝 项目模块介绍\n\n----\ngoodsKill\n|--goodskill-admin                          ||SpringBoot Admin监控服务端，支持Spring Cloud微服务发现\n|--goodskill-ai                             ||AI机器人聊天服务\n|--goodskill-gateway                        ||微服务API网关，统一服务鉴权，支持动态路由加载\n|--goodskill-order-provider                 ||订单服务提供者\n|--goodskill-seckill-provider               ||秒杀服务提供者\n|--goodskill-spring-boot-starter            ||项目配置自动装配\n|--goodskill-common                         ||公共服务(目前包含minio上传下载功能)\n|--goodskill-web                            ||提供秒杀模拟接口访问\n|--goodskill-job                            ||elastic-job定时任务\n|--goodskill-seata                          ||集成nacos+dubbo+shardingjdbc+seata的分布式事务解决方案示例\n|--goodskill-auth                           ||auth登录以及授权模块\n|   |--auth-service                         ||基于Sa-Token框架的用户登录授权服务\n    |--oauth2-auth-server                   ||oauth2.0登录授权服务端，自定义的登录授权服务\n    |--oauth2-resource-server               ||oauth2.0资源服务端，自定义的登录授权服务\n----\n\n== 🔥🔥 秒杀方案\n\n目前实现了几种秒杀方案，通过``SeckillMockController``提供测试接口\n\n聚合网关Openapi文档地址: `http://localhost/doc.html#/home`（需要开启网关服务）\n\nSpring Boot Admin应用监控地址: `http://www.goodskill.com:19031`, 登录用户名密码：user/123456\n\n* 场景一：Sychronized同步锁实现\n* 场景二：Redisson分布式锁实现\n* 场景三：ActiveMQ实现(已废弃)\n* 场景四：Kafka消息队列实现\n* 场景五：数据库原子性更新\n* 场景六：实时等待秒杀处理结果(已废弃)\n* 场景七：ZooKeeper分布式锁\n* 场景八：使用Redis进行秒杀商品减库存操作，秒杀结束后异步发送MQ，使用MongoDB完成数据落地\n* 场景九：Spring Cloud Stream实现\n* 场景十：Sentinel限流+数据库原子性更新（需搭配sentinel控制台配置资源名``limit``的流控规则）\n\n\n.可在web控台查看秒杀结果，打印信息类似：\n[%collapsible]\n====\n[source,text]\n----\n2021-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\n2021-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\n2021-04-14 21:59:00.101  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数统计中。。。\n2021-04-14 21:59:01.616  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数统计中。。。\n2021-04-14 21:59:03.129  INFO [goodskill-web,144aa7910cca9520,2821cb8d62c5a908] 15808 --- [AClOSzbugzYng-1] o.s.w.s.c.SeckillMockResponseListener    : 最终成功交易笔数：10\n2021-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\n---------------------------------------------\nns         %     Task name\n---------------------------------------------\n4492195700  012%  秒杀场景四(kafka消息队列实现)\n3164155900  009%  秒杀场景八(秒杀商品存放redis减库存，异步发送秒杀成功MQ，mongoDb数据落地)\n6219218300  017%  秒杀场景十(Sentinel限流+数据库原子性更新)\n9189080600  025%  秒杀场景七(zookeeper分布式锁)\n3135926500  009%  秒杀场景五(数据库原子性更新update set num = num -1)\n3342791800  009%  秒杀场景九(基于springcloud stream rabbitmq)\n3343433700  009%  秒杀场景一(sychronized同步锁实现)\n3273092300  009%  秒杀场景二(redis分布式锁实现)\n----\n====\n\n== 🧰 开发环境版本说明\n\n* JDK: OpenJDK21\n* Sharding-JDBC: 5.5.0\n* SpringCloud: 2023.x.x\n* SpringBoot: 3.3.x\n* SpringCloudAlibaba: 2023.x.x\n* Apache Dubbo: 3.3.x\n* 使用的Docker镜像\n+\n|===\n|镜像 |版本 |端口 |用户名密码\n\n|Nacos |2.3.2-slim |8848 |nacos:nacos（控制台）\n|Redis |latest |6379 |密码:123456\n|Kafka |3.1.1 |9092 |无\n|KafkaManager |latest |9001:9000 |无\n|Mongo |6.0.7 |27017 |无\n|MySQL |8.0.29 |3306 |root:Password123\n|Zookeeper |3.6.2 |2181 |无\n|Elasticsearch |7.17.3 |9200 9300 |无\n|Kibana |7.17.3 |5601 |无\n|RabbitMQ |latest |5672 15672 |无\n|MinIO |latest |9000 |root:password\n|Seata |2.0.0 |7091 8091|seata:seata（控制台）\n|===\n\n== 🎯 快速开始\n* 项目根目录``goodsKill``中执行\n+\n----\n  mvn clean install\n  或\n  #跳过单元测试\n  mvn clean install -DskipTests\n----\n\n* 默认端口启动nacos、redis、mysql、rabbitmq、kafka、zookeeper、elasticsearch、seataServer，或者使用docker-compose{empty}footnote:[需要安装docker-desktop https://www.docker.com/products/docker-desktop/]命令：\n+\n[source,bash]\n----\n  docker-compose -f goodskill-simple.yml up -d\n----\n\n* 进入``goodskill-web/src/main/sql``目录，找到``seckill.sql``文件，在本地mysql数据库中建立``seckill``仓库并执行完成数据初始化操作\n+\n\n:warning-caption: ⚠️️\n\n[WARNING]\ndocker-compose启动MySQL镜像时会自动执行初始化脚本，如已执行过上一步本步骤可跳过\n\n* 配置host\n[source,text]\n+\n----\n 127.0.0.1       kafka\n 127.0.0.1       nacos\n 127.0.0.1       redis\n 127.0.0.1       mysql\n 127.0.0.1       zookeeper\n 127.0.0.1       mongo\n 127.0.0.1       elasticsearch\n 127.0.0.1       rabbitmq\n 127.0.0.1       logstash\n ##如果网关服务部署在远程机器，此处改为相应的远程机器ip\n 127.0.0.1       www.goodskill.com\n----\n\n* 在Nacos配置中心中添加DataId为``goodskill-common-connection.yml``（中间件公共配置）、``goodskill-common.yml``（服务公共配置）的公共配置，Group为``DEFAULT_GROUP``，具体内容可参考项目根目录中的``goodskill-common-connection.yml``、``goodskill-common.yml``文件\n\n* main方法运行``OrderApplication``类(订单服务)\n\n* main方法运行``SeckillApplication``类(秒杀管理服务提供者)\n\n* main方法运行``SampleWebApplication``类(模拟秒杀web服务)\n\n* 发送一个秒杀模拟请求：\n秒杀活动id 1000，商品数量10，执行20次购买操作，使用sychronized同步锁执行，例如：\n+\n可直接使用以下命令发送模拟秒杀请求，每个秒杀活动seckillId对应唯一的一个商品id，每次执行接口时会有一个库存初始化动作，接口执行完成后可重复调用\n\n+\n.使用sychronized同步锁执行\n====\n[source,bash]\ncurl -X POST \"http://www.goodskill.com:8080/sychronized\" \\\n-H \"accept: */*\" -H \"Content-Type: application/json\" -d \\\n\"{ \\\"requestCount\\\": 20, \\\"seckillCount\\\": 10, \\\"seckillId\\\": 1000}\"\n====\n+\n.使用Redisson分布式锁执行\n====\n[source,bash]\ncurl -X POST \"http://www.goodskill.com:8080/redisson\" \\\n-H \"accept: */*\" -H \"Content-Type: application/json\" -d \\\n\"{ \\\"requestCount\\\": 20, \\\"seckillCount\\\": 10, \\\"seckillId\\\": 1000}\"\n====\n+\n.使用Redisson分布式锁执行，支持动态配置后台线程池核心线程数以及最大线程数\n====\n[source,bash]\ncurl --location --request POST 'http://www.goodskill.com:8080/limit' \\\n--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    \"maxPoolSize\": 10,\n    \"seckillId\": 1000,\n    \"corePoolSize\": 2,\n    \"seckillCount\": 100,\n    \"requestCount\": 120\n}'\n====\n+\n请求默认异步执行，可在控制台查看执行日志，如果最终成功交易笔数等于商品数量10则表示没有出现超卖或者少卖问题\n\n== 🤖️ 使用AI机器人聊天服务\n基于Spring AI Alibaba构建的简易秒杀机器人服务，可以通过机器人服务完成服务调用，目前仅支持开启秒杀活动，以及输出活动耗时情况\n\n* 进入``goodskill-ai``模块，替换配置``spring.ai.dashscope.api-key``，可通过阿里云百炼平台获取\n\n* main方法运行``AiBotApplication``类，访问聊天页面 `http://127.0.0.1:18077`\n\n* 以下是一个对话示例\n[source,text]\n+\n----\n我: 帮我执行秒杀\n\nAI: 当然可以帮助您执行秒杀活动啦！为了顺利进行，请告诉我以下几个信息：1.秒杀活动的ID是多少？2. 这次秒杀的商品数量是多少？3.您打算这次请求的次数是多少？有了这些信息，我就能帮您开始了！😊\n\n我: 秒杀活动id 1001，请求次数20，商品数量10个\n\nAI: 秒杀活动已成功开启！我们现在等待10秒钟，然后我会为您获取任务的耗时统计信息。秒杀活动已成功启动，并在10秒后获得了任务耗时统计信息：总耗时：6.673773375秒具体耗时分布如下：- 秒杀活动id:1001，秒杀场景五(数据库原子性更新update setnum = num -1)耗时 3.528280125 秒，占比 53%-秒杀活动id:1001，秒杀场景五(数据库原子性更新updateset num = num-1)耗时3.14549325 秒，占比 47%希望这些信息对您有帮助！如果还有其他问题或需要进一步的帮助，请随时告诉我哦！😊\n----\n\n== 🕹️️ 启动其他可选项目步骤\n在快速开始部分基础上增加以下步骤即可启动一个完整项目\n\n* 进入``goodskill-gateway``模块，通过``GatewayBootApplication``类main方法启动服务网关，统一通过网关访问各个服务\n\n+\n- `http://www.goodskill.com/api/order/**` 对应访问``goodskill-order``服务\n- `http://www.goodskill.com/api/seata/**` 对应访问``goodskill-seata``服务\n- `http://www.goodskill.com/api/seckill/**` 对应访问``goodskill-seckill``服务\n- `http://www.goodskill.com/api/auth/**` 对应访问``goodskill-auth``服务\n- `http://www.goodskill.com/api/web/**` 对应访问``goodskill-web``服务\n\n\n* 已集成``Sentinel``限流组件，支持``nacos``配置中心方式推送限流规则，使用时需启动``Sentinel``控制台，并以``18088``端口启动，docker环境暂不支持。\n\n* Seata分布式事务测试方法见 https://github.com/techa03/goodsKill/tree/master/goodskill-seata/README.md[Seata分布式事务测试示例运行说明]\n\n* main方法运行``GoodskillAdminApplication``类(微服务健康状态指标监控)\n\n== ❓常见问题\n[qanda]\ndocker es镜像启动失败::\n\n出现此问题一般为linux环境，运行以下命令即可 `sysctl -w vm.max_map_count=262144`\n，或者修改/etc/sysctl.conf文件，追加以下配置：\n+\n[source,text]\n----\ngrep vm.max_map_count /etc/sysctl.conf\nvm.max_map_count=262144\n----\n\n如何使用本项目自定义的OAuth2.0授权服务器进行登录授权？::\n\n待完善。。\n\n项目集成的各个框架之间目前的兼容性如何？::\n\n本项目目前依赖的各个主流框架的版本比较新，尚未经过完整测试{empty}footnote:[附 https://start.aliyun.com/bootstrap.html[SpringCloudAlibaba]兼容版本说明]。\n\n服务启动控制台报ERROR日志 ``no available service found in cluster 'default', please make sure registry config correct and keep your seata server running`` 如何解决？::\n\n启动``seata-server``服务即可（docker-compose.yml文件中已提供），可参照Seata官网添加nacos相关配置。如未使用分布式事务，可忽略该错误，不影响服务正常运行\n\ndocker-compose无法拉取镜像::\n\nhub.docker被墙，国内可使用阿里云镜像加速器，具体操作见 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors[阿里云镜像加速器]\n\n使用JDK17以上启动项目失败::\n\n启动时添加以下jvm参数，例如：\n+\n[source,text]\n----\n--add-opens java.base/java.lang=ALL-UNNAMED\n--add-opens java.base/java.util=ALL-UNNAMED\n--add-opens java.base/java.util.concurrent=ALL-UNNAMED\n--add-opens java.base/java.math=ALL-UNNAMED\n--add-opens java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED\n----\n\n== 🖲️ 状态机说明\n目前秒杀活动状态的控制基于Spring Statemachine状态机实现，使用状态机的优点：\n\n* 统一控制活动状态，便于状态的集中维护；\n* 防止业务状态被随意更改，保证状态的可控更新；\n\n=== 状态机流程图\nimage:docs/shortcut/状态机.png[image]\n\n\n== 📚分库分表情况说明\n\n|===\n|表 |数据库 |是否分库 |分库字段 |是否分表 |分表字段\n\n|success_killed |MySQL |是（同一服务器中，分为seckill和seckill_01两个库） |seckill_id |是（分为success_killed_0,success_kill_1两张表） |user_phone\n|===\n\n:note-caption: 📢\n[NOTE]\n其他表均未分库分表，默认使用seckill作为主库\n\n=== API接口说明\n\nimage:docs/shortcut/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20180819224521.png[image]\n\n== 💻相关页面展示\n\n=== 模拟秒杀接口测试\n\nimage:docs/shortcut/模拟秒杀接口测试.gif[image]\n\n== 📑数据库表结构\n\nimage:docs/shortcut/model_table.png[image]\n\n== 📖参考文档\n\n* 解决Docker容器连接 Kafka 连接失败问题：`https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html`\n","funding_links":[],"categories":["Java","Projects Using MyBatis-Plus"],"sub_categories":["Tutorials"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftecha03%2FgoodsKill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftecha03%2FgoodsKill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftecha03%2FgoodsKill/lists"}