在线点单平台

项目背景
该项目是一个面向“本地生活/餐饮外卖”场景的后端系统,目标是支撑商家端运营与用户端下单的完整闭环。随着业务从课程级 Demo 向真实高并发场景演进,系统需要同时解决三类问题:一是交易链路稳定性(高峰期下单、支付回调、订单状态流转);二是性能与扩展性(热点查询、订单数据持续增长);三是工程可维护性(分层清晰、通用能力复用、异常与鉴权统一治理)。因此项目在保留核心业务功能的基础上,重点围绕“高并发可用、数据可扩展、架构可治理”进行了系统化改造。
STAR 过程
情境(Situation):项目是一个基于 Spring Boot 的外卖后端系统,覆盖管理端与用户端核心流程(登录鉴权、菜品/套餐、购物车、下单、支付回调、订单流转、报表)。随着并发与数据量上升,系统逐步暴露出典型瓶颈:高峰期下单 RT 偏高、库存并发超卖风险、重复提交导致重复下单、订单表持续膨胀带来的查询退化,以及高频查询场景下数据库压力过大。
任务(Task):将系统从“可用”升级为“高并发下稳定可用”,目标是: 重构清晰可维护的分层架构,统一治理接口层通用能力。 优化下单主链路,降低峰值时延并保障交易正确性。 提升订单数据规模增长下的可扩展性。 建立缓存治理体系,兼顾性能与一致性。 提升实时交互与开发效率,减少重复模板代码。
行动(Action):架构治理:搭建 Spring Boot 分层架构(Controller/Service/Mapper),统一接入参数校验、JWT 鉴权拦截、全局异常处理、对象转换与 Knife4j 接口文档。 下单链路优化:引入 RabbitMQ,将“下单受理”与“订单落库”异步解耦;使用 Redis + Lua 实现库存原子扣减,避免并发超卖;基于 Idempotency-Key + Redis SETNX 实现提交幂等和结果重放,降低网络抖动下重复下单概率。 数据扩展性改造:设计按创建时间(月维度)动态分表路由组件,将订单与明细按月路由至子表;接入雪花算法生成订单号,替代自增主键,保证分布式场景全局唯一。 缓存体系建设:对菜品/套餐高频查询引入 Redis 缓存,采用“空值缓存 + 互斥锁重建 + 随机 TTL”组合策略,分别治理缓存穿透、击穿与雪崩;对管理端写操作采用延时双删,提升缓存与数据库一致性。 工程效率与实时能力:通过 AOP + 反射 + 自定义注解实现公共字段自动填充,减少重复样板代码;集成 WebSocket,实现“新订单/催单”实时推送。
结果(Result):下单链路在高峰场景下更平稳,主流程从同步强依赖转为异步削峰,系统吞吐与响应稳定性显著提升。 库存扣减与提交幂等机制落地后,超卖和重复下单风险得到有效控制,交易一致性增强。 订单分表与全局 ID 方案提升了数据增长下的查询与写入可扩展性,为后续业务扩容预留空间。 缓存治理体系显著降低数据库热点压力,并在高并发下保持较好的可用性与一致性。 统一化基础能力与自动填充机制提升了研发效率;WebSocket 实时提醒增强了商家端订单处理时效。
在线点单项目说明
1. 项目简介
本项目是一个基于 Spring Boot 的外卖后端项目,采用 Maven 多模块结构,覆盖了管理端与用户端的核心业务能力,包括:
- 员工与用户登录鉴权(JWT)
- 菜品/套餐/分类管理
- 购物车与下单流程
- 订单状态流转与统计报表
- Redis 缓存与一致性处理
- RabbitMQ 异步创建订单
- WebSocket 实时消息推送
- 定时任务(超时订单取消、派送中订单自动完成)
当前后端默认启动端口为 8081。
2. 仓库结构
项目采用聚合工程,根模块包含 3 个子模块:
sky-common:通用常量、异常、工具类、公共返回结构、配置属性类sky-pojo:DTO / Entity / VO 等数据模型sky-server:主服务模块(Controller / Service / Mapper / 配置 / 定时任务 / MQ / WebSocket)
目录示意:
sky-take-out
├─ sky-common
├─ sky-pojo
├─ sky-server
└─ k6_test
3. 技术栈
核心框架与组件:
- Java + Spring Boot
2.7.3 - MyBatis + PageHelper
- MySQL
- Redis
- RabbitMQ
- WebSocket
- Knife4j(Swagger 文档)
- Druid 数据源
- JWT(
jjwt)
4. 关键业务能力
4.1 鉴权与拦截
WebMvcConfiguration 注册了两个拦截器:
- 管理端:拦截
/admin/**,放行/admin/employee/login - 用户端:拦截
/user/**,放行/user/user/login
4.2 订单链路(重点)
订单创建链路做了多项增强:
- 提交幂等:基于 Redis 键避免重复提交
- 库存扣减:通过 Redis Lua 脚本原子扣减库存
- 异步落库:下单后发送 RabbitMQ 事件,由消费者创建订单和订单明细
- 分表路由:支持按月分表(可通过
sky.sharding.enabled开关控制) - 支付回调幂等:支付成功处理通过 Redis 锁防重
- WebSocket 推送:新订单/催单等消息实时推送到客户端
4.3 缓存与一致性
项目内置了缓存封装与一致性策略:
CacheClient:防缓存击穿(互斥锁)、空值缓存、TTL 抖动CacheConsistencyService:双删策略(立即删 + 延迟删)
4.4 定时任务
OrderTask 提供了两个调度任务:
- 每分钟扫描超时未支付订单并取消
- 每天凌晨 1 点自动完成超时“派送中”订单
5. 主要接口分组
按业务分为两大前缀:
- 管理端:
/admin/**- 员工:
/admin/employee - 分类:
/admin/category - 菜品:
/admin/dish - 套餐:
/admin/setmeal - 订单:
/admin/order - 工作台与报表:
/admin/workspace、/admin/report
- 员工:
- 用户端:
/user/**- 用户登录:
/user/user/login - 分类/菜品/套餐:
/user/category、/user/dish、/user/setmeal - 购物车:
/user/shoppingCart - 订单:
/user/order - 地址簿:
/user/addressBook
- 用户登录:
接口文档默认可通过:
http://localhost:8081/doc.html
6. 本地运行说明
6.1 环境要求
建议准备:
- JDK 8+
- Maven 3.6+
- MySQL 8.x
- Redis 6.x+
- RabbitMQ 3.x+
6.2 配置文件
主配置在:
sky-server/src/main/resources/application.ymlsky-server/src/main/resources/application-dev.yml
application.yml 已启用 dev 环境,并通过 sky.* 组织业务配置。
注意:当前
application-dev.yml中包含数据库、Redis、微信、OSS 等敏感信息示例。用于个人学习可行,但不建议直接用于生产或公开仓库。建议改为环境变量或私有配置中心。
6.3 启动步骤
在项目根目录执行:
mvn clean package -DskipTests
mvn -pl sky-server spring-boot:run
启动后访问:
- 服务地址:
http://localhost:8081 - 文档地址:
http://localhost:8081/doc.html - WebSocket 地址:
ws://localhost:8081/ws/{sid}
7. 压测与脚本
k6_test 目录下包含压测脚本与结果文件:
test1.js、test2.jsredis_cache_patterns.jssummary_k6_*.jsonrun_test2_with_sql.ps1
可用于对订单/缓存链路进行基础性能验证。
8. 后续优化建议
如果你计划继续完善这个项目,建议优先关注:
- 配置安全:移除仓库中的明文密钥,统一使用环境变量
- 数据库脚本:补充完整建表与初始化 SQL,降低新同学接入成本
- 可观测性:增加统一日志 traceId、慢 SQL 与关键指标监控
- 测试体系:补充 Service 层单测与关键接口集成测试
- WebSocket 任务:目前存在测试性定时广播,可按环境开关控制
这份文档基于当前仓库代码结构与配置编写,可作为项目交接、入门和二次开发的基础说明。