返回成就页

在线点单平台

在线点单平台

项目背景

该项目是一个面向“本地生活/餐饮外卖”场景的后端系统,目标是支撑商家端运营与用户端下单的完整闭环。随着业务从课程级 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 实时提醒增强了商家端订单处理时效。

JAVASpring MVCRabbitMQRedisMySQLJWTWebSocket

在线点单项目说明

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 订单链路(重点)

订单创建链路做了多项增强:

  1. 提交幂等:基于 Redis 键避免重复提交
  2. 库存扣减:通过 Redis Lua 脚本原子扣减库存
  3. 异步落库:下单后发送 RabbitMQ 事件,由消费者创建订单和订单明细
  4. 分表路由:支持按月分表(可通过 sky.sharding.enabled 开关控制)
  5. 支付回调幂等:支付成功处理通过 Redis 锁防重
  6. 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.yml
  • sky-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.jstest2.js
  • redis_cache_patterns.js
  • summary_k6_*.json
  • run_test2_with_sql.ps1

可用于对订单/缓存链路进行基础性能验证。

8. 后续优化建议

如果你计划继续完善这个项目,建议优先关注:

  1. 配置安全:移除仓库中的明文密钥,统一使用环境变量
  2. 数据库脚本:补充完整建表与初始化 SQL,降低新同学接入成本
  3. 可观测性:增加统一日志 traceId、慢 SQL 与关键指标监控
  4. 测试体系:补充 Service 层单测与关键接口集成测试
  5. WebSocket 任务:目前存在测试性定时广播,可按环境开关控制

这份文档基于当前仓库代码结构与配置编写,可作为项目交接、入门和二次开发的基础说明。