# 蜂巢生活-本地生活高并发服务平台 **Repository Path**: bujianwen/HiveTrade ## Basic Information - **Project Name**: 蜂巢生活-本地生活高并发服务平台 - **Description**: 初步定为高并发高可用能力展示 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-11 - **Last Updated**: 2026-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HiveTrade 蜂巢交易平台 > 📱 类小程序风格的美食生活服务平台 · 单体架构 > 聚焦**高并发秒杀**与**海量数据分片**的后端技术实践 --- ## 📱 小程序端 ### 首页与登录 | 小程序首页 | 小程序登录 | 小程序注册 | |:---:|:---:|:---:| | ![首页](picture/首页x.png) | ![登录](picture/登录x.png) | ![注册](picture/注册页面x.png) | 小程序首页顶部展示城市切换器和搜索框,支持按城市筛选店铺数据。中间是分类导航区,涵盖美食、KTV、健身运动、酒吧等十多个生活服务类目。下方是热门探店 Feed 流,采用无限滚动加载方式展示用户发布的探店笔记。登录和注册采用手机验证码方式,流程简洁。 ### 搜索与浏览 | 小程序搜索 | 小程序查看文章 | |:---:|:---:| | ![搜索](picture/搜索x.png) | ![查看文章](picture/查看文章x.png) | 搜索支持按店铺名称关键词模糊匹配,结果以卡片列表形式展示。查看文章页面顶部是图片轮播,往下依次展示作者信息、正文内容、关联店铺卡片、点赞和评论区。 ### 内容创作 | 小程序发布笔记 | |:---:| | ![发布笔记](picture/发布笔记x.png) | 用户可以在小程序上发布探店笔记,支持多图上传、删除、关联商户。已发布的文章支持再次编辑修改标题、内容和图片。 ### 店铺管理 | 小程序店铺管理 | 小程序创建店铺 | |:---:|:---:| | ![店铺管理](picture/店铺管理x.png) | ![创建店铺](picture/创建店铺x.png) | 店铺管理展示所有店铺列表,点击可进入详情。创建店铺需要填写名称、分类、地址、人均价格和营业时间,提交后自动生成店铺详情页。 ### 优惠券系统 | 小程序发布优惠券 | 小程序抢券 | 小程序已抢优惠券 | |:---:|:---:|:---:| | ![发布优惠券](picture/发布优惠卷x.png) | ![抢券](picture/抢券x.png) | ![已抢优惠券](picture/已抢优惠卷x.png) | 优惠券分为普通券(满减代金券)和秒杀券(限时抢购)。秒杀具备完整的高并发流程:Redis 双维度限流、Kafka 异步削峰、Lua 脚本原子库存扣减。已抢到的优惠券可在"我的优惠券"中查看和取消。 ### 个人中心与 AI 助手 | 小程序个人主页 | 小程序 AI 助手 | |:---:|:---:| | ![个人主页](picture/个人主页x.png) | ![AI助手](picture/AI助手(可点击跳转)x.png) | 个人主页管理用户信息和操作入口,包含我的优惠券、新增优惠券、我的店铺等快捷按钮,以及自己发布的笔记列表。AI 助手基于 LangChain4j + 通义千问,用户可用自然语言交互,助手调用 Java 工具执行操作并以结构化卡片返回,点击可跳转对应页面。 --- ## 🌐 网页端 ### 首页与登录 | 网页首页 | 网页登录 | 网页注册 | |:---:|:---:|:---:| | ![首页](picture/首页.png) | ![登录](picture/登录.png) | ![注册](picture/注册页面.png) | 网页端与小程序的布局和功能保持一致,提供相同的浏览和操作体验。 ### 搜索与浏览 | 网页搜索 | 网页查看文章 | |:---:|:---:| | ![搜索](picture/搜索.png) | ![查看文章](picture/查看文章.png) | ### 内容创作 | 网页发布笔记 | |:---:| | ![发布笔记](picture/发布笔记.png) | ### 店铺管理 | 网页店铺管理 | 网页创建店铺 | |:---:|:---:| | ![店铺管理](picture/店铺管理.png) | ![创建店铺](picture/创建店铺.png) | ### 优惠券系统 | 网页发布优惠券 | 网页抢券 | 网页已抢优惠券 | |:---:|:---:|:---:| | ![发布优惠券](picture/发布优惠卷.png) | ![抢券](picture/抢券.png) | ![已抢优惠券](picture/已抢优惠卷.png) | ### 个人中心与 AI 助手 | 网页个人主页 | 网页 AI 助手 | |:---:|:---:| | ![个人主页](picture/个人主页.png) | ![AI助手](picture/AI助手(可点击跳转).png) | --- ## ⚡ 核心亮点 — 高并发秒杀系统 ### 整体架构 ``` ┌──────────────────────────────────────────────────────┐ │ 客户端 (Vue3) │ ├──────────────────────────────────────────────────────┤ │ Nginx 反向代理 │ ├──────────────────────────────────────────────────────┤ │ Spring Boot 单体应用 (单 JAR) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │ │ │ 限流层 │ │ 业务层 │ │ 数据层 │ │ │ │ Redis │→ │ Service │→ │ MyBatis-Plus │ │ │ │ 滑动窗口 │ │ 异步削峰 │ │ ShardingSphere │ │ │ │ 令牌桶 │ │ Lua 扣减 │ │ MySQL 分库分表 │ │ │ └──────────┘ └──────────┘ └────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────┐ │ │ │ 中间件层 │ │ │ │ Redis · Kafka · Redisson · 布隆过滤器 │ │ │ └────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────┘ ``` ### 秒杀抢购完整链路 ``` 用户点击"限时抢购" │ ▼ ┌──────────────────────────────────────┐ │ ① 双维度限流 │ │ Redis 滑动窗口 │ │ ├─ IP 级别: 5s 内 3 次 │ │ └─ 用户级别: 60s 内 5 次 │ │ 超限 → 请求拦截 + 可选的封禁惩罚 │ └──────────────┬───────────────────────┘ ▼ ┌──────────────────────────────────────┐ │ ② 发放访问令牌 │ │ 通过限流 → 生成唯一 accessToken │ │ 令牌作为后续请求的凭证 │ └──────────────┬───────────────────────┘ ▼ ┌──────────────────────────────────────┐ │ ③ 下单(Kafka 异步削峰) │ │ 携带令牌 → 发送消息到 Kafka │ │ 消费者异步处理 → 立即返回"处理中" │ │ 避免同步写入时的连接堆积 │ └──────────────┬───────────────────────┘ ▼ ┌──────────────────────────────────────┐ │ ④ 库存扣减(Lua 脚本原子操作) │ │ Redis + Lua 保证: │ │ ├─ 库存充足判断 │ │ ├─ 一人一单校验 │ │ └─ 库存原子扣减 │ │ 整段脚本单线程执行,无并发问题 │ └──────────────┬───────────────────────┘ ▼ ┌──────────────────────────────────────┐ │ ⑤ 轮询确认订单(10s 超时) │ │ 前端每 800ms 轮询订单状态 │ │ 超时提示"请稍后在订单页查看" │ └──────────────┬───────────────────────┘ ▼ ┌──────┴──────┐ ▼ ▼ [成功] [失败] 显示"已购" 显示原因 可取消领取 可重新抢购 ``` ### 高并发保障措施 - **限流** — Redis 滑动窗口 + 令牌桶,IP / 用户双维度拦截恶意刷单 - **异步** — Kafka 消息队列削峰填谷,避免瞬时流量击穿数据库 - **原子性** — Lua 脚本一次性完成库存扣减 + 一人一单校验,替代分布式锁 - **缓存** — 秒杀券数据提前加载到 Redis,减少数据库直接读取 - **穿透防护** — 布隆过滤器过滤不存在的数据查询 - **幂等** — 令牌机制 + 唯一索引防止重复下单 - **兜底** — 前端 10s 轮询超时提示,保障用户体验 --- ## 🏗️ 后端技术深度解析 ### 技术栈概览 **框架与语言:** Spring Boot 3.5.4(IoC / AOP / 自动配置)+ JDK 17 + MyBatis-Plus 3.5.7 **数据层:** Apache ShardingSphere 5.3.2 分库分表(2 库 × 2 表水平拆分 + 广播表)、MySQL 8.0 **缓存与中间件:** Redis 6+(缓存预热 / 滑动窗口限流 / Lua 原子脚本 / 分布式锁)、Apache Kafka 3+(秒杀异步削峰 / 缓存失效广播)、Redisson 3.52(可重入锁 / 延迟队列) **AI:** LangChain4j 0.36.2(@Tool 注解 + AiServices 构建器)+ 通义千问 Qwen(意图识别 + 自然语言生成) **基础设施:** 雪花算法 ID 生成器(全局唯一、趋势递增)、布隆过滤器(万分之一误判率)、Jackson + json-bigint(大数精度处理)、Hutool、Log4j2、Spring Actuator + Prometheus ### Redis 多场景应用 ``` ┌────────────────────────────────────────────────────────────┐ │ Redis 应用全景 │ ├────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ ① 缓存层 │ │ │ │ ├─ 店铺缓存(CACHE_SHOP_KEY + 逻辑过期) │ │ │ │ ├─ 用户信息缓存(Hash 结构、TTL 自动续期) │ │ │ │ ├─ 优惠券缓存(秒杀券数据预热) │ │ │ │ └─ 空值缓存(缓存穿透 → 短期空缓存) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ ② 限流层 │ │ │ │ ├─ 滑动窗口算法(ZSET + Lua) │ │ │ │ │ ├─ IP 级别:5s 窗口内 3 次上限 │ │ │ │ │ └─ 用户级别:60s 窗口内 5 次上限 │ │ │ │ └─ 令牌桶算法(限流速率 + 突发处理) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ ③ 原子操作层 (Lua 脚本) │ │ │ │ ├─ seckillVoucher.lua:库存扣减 + 一人一单校验 │ │ │ │ ├─ seckillVoucherRollBack.lua:库存回滚 │ │ │ │ ├─ seckill_access_token.lua:令牌生成 + 限流 │ │ │ │ ├─ rateLimitSliding.lua:滑动窗口限流 │ │ │ │ └─ tokenBucket.lua:令牌桶限流 │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ ④ 分布式锁 (Redisson) │ │ │ │ ├─ 缓存重建互斥锁(防止缓存击穿) │ │ │ │ ├─ 秒杀锁(一人一单) │ │ │ │ └─ 延迟队列(抢券提醒定时任务) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ ``` ### Kafka 消息架构 ``` 生产者 (秒杀下单) 消费者 (异步处理) ┌──────────────────┐ ┌──────────────────────┐ │ SeckillVoucher │───Topic──→│ SeckillVoucher │ │ Producer │ │ Consumer │ │ 发送下单消息 │ │ 处理订单 + 扣库存 │ └──────────────────┘ └──────────────────────┘ ┌──────────────────┐ ┌──────────────────────┐ │ 缓存失效发布 │───Topic──→│ 缓存失效消费者 │ │ Publisher │ │ Subscriber │ │ SeckillVoucher │ │ 删除本地缓存 │ │ CacheInval │ │ │ └──────────────────┘ └──────────────────────┘ ┌──────────────────┐ ┌──────────────────────┐ │ DLQ (死信队列) │───Topic──→│ DLQ Consumer │ │ 失败消息重试 │ │ 最终兜底处理 │ └──────────────────┘ └──────────────────────┘ ``` ### 数据库分片策略 ``` ┌───────────────────────────────────────────────────────┐ │ ShardingSphere 分片规则 │ ├───────────────────────────────────────────────────────┤ │ │ │ ds_0 (hivetrade_0) ds_1 (hivetrade_1) │ │ ┌────────────────────┐ ┌────────────────────┐ │ │ │ tb_voucher_0 │ │ tb_voucher_0 │ │ │ │ tb_voucher_1 │ │ tb_voucher_1 │ │ │ │ │ │ │ │ │ │ tb_seckill_voucher_0│ │ tb_seckill_voucher_0│ │ │ │ tb_seckill_voucher_1│ │ tb_seckill_voucher_1│ │ │ │ │ │ │ │ │ │ tb_user_0 / _1 │ │ tb_user_0 / _1 │ │ │ │ tb_voucher_order_0/1│ │ tb_voucher_order_0/1│ │ │ └────────────────────┘ └────────────────────┘ │ │ │ │ 广播表(全库同步,不分片): │ │ tb_shop · tb_blog · tb_blog_comments │ │ tb_follow · tb_shop_type · tb_sign │ │ tb_rollback_failure_log │ │ │ │ 分片算法: │ │ tb_voucher: database = id % 2 │ │ table = (id / 2) % 2 │ │ tb_seckill_voucher: database = voucher_id % 2 │ │ table = (voucher_id / 2) % 2 │ │ tb_voucher_order: database = user_id % 2 │ │ table = voucher_id % 2 (MOD) │ │ tb_user: database = id % 2 │ │ table = (id / 2) % 2 │ └───────────────────────────────────────────────────────┘ ``` ### 缓存策略体系 ``` ┌──────────────────────────────────────────────────────┐ │ 缓存策略 │ ├──────────────────────────────────────────────────────┤ │ │ │ ① 缓存穿透防护 │ │ ├─ 布隆过滤器:启动时预热所有存在的 ID │ │ │ 查询前先判断 ID 是否存在,不存在直接拒绝 │ │ │ (expectedInsertions=50000, falseProbability=0.01) │ │ └─ 空值缓存:即使查不到也缓存空值(短 TTL) │ │ │ │ ② 缓存击穿防护 │ │ ├─ 互斥锁方案:查询缓存未命中时加锁,只允许一个线程重建 │ │ └─ 逻辑过期方案:设置逻辑过期时间,异步线程后台刷新 │ │ │ │ ③ 缓存雪崩防护 │ │ ├─ 不同 Key 设置随机 TTL,避免同时过期 │ │ └─ Redis 高可用(主从 + Sentinel) │ │ │ │ ④ 缓存更新策略 │ │ ├─ 更新数据库 → 删除缓存(延迟双删) │ │ └─ 秒杀券库存变更 → 广播缓存失效消息 │ │ │ └──────────────────────────────────────────────────────┘ ``` ### 拦截器链 ``` 请求进入 │ ▼ ┌────────────────────────────────────────────┐ │ RefreshTokenInterceptor (order=0) │ │ 路径: /** (全部) │ │ 职责: 从 Header 提取 Token → Redis 查询用户 │ │ 刷新 TTL → 存入 ThreadLocal (UserHolder) │ └────────────────┬───────────────────────────┘ ▼ (放行) ┌────────────────────────────────────────────┐ │ LoginInterceptor (order=1) │ │ 路径: 白名单外所有 (exclude: /shop/**, │ │ /voucher/**, /imgs/**, /uploads/**等) │ │ 职责: UserHolder 为空 → 返回 401 │ └────────────────┬───────────────────────────┘ ▼ Controller 处理 ``` ### 雪花 ID 生成器 ``` ┌──────────────────────────────────────────────────────┐ │ SnowflakeIdGenerator │ ├──────────────────────────────────────────────────────┤ │ │ │ 64-bit Long 结构: │ │ ┌─────────┬──────────────┬─────────────┬───────────┐ │ │ │ 1 bit │ 41 bit │ 10 bit │ 12 bit │ │ │ │ 符号位 │ 时间戳差 │ 工作机器ID │ 序列号 │ │ │ │ (0) │ (ms) │ (5+5) │ (自增) │ │ │ └─────────┴──────────────┴─────────────┴───────────┘ │ │ │ │ 特性: │ │ ├─ 全局唯一、趋势递增 │ │ ├─ 支持 1024 个节点(32 数据中心 × 32 机器) │ │ ├─ 每毫秒 4096 个 ID │ │ └─ 回拨时钟自动处理(Zookeeper/Redis 协调) │ └──────────────────────────────────────────────────────┘ ``` ### Spring Boot 拦截器 + 静态资源配置 ``` MvcConfig (implements WebMvcConfigurer) ├── addInterceptors() │ ├── RefreshTokenInterceptor (order=0) → 全部路径 │ └── LoginInterceptor (order=1) → 白名单排除 │ └── addResourceHandlers() └── /blogs/** → file:/uploaded/imgs/blogs/ WebConfig (implements WebMvcConfigurer) └── addResourceHandlers() ├── /imgs/blogs/** → file:/uploaded/imgs/blogs/ └── /uploads/** → file:/uploaded/imgs/ ``` ### AI Agent 工作流 ``` ┌─────────┐ ┌──────────┐ ┌───────────┐ ┌─────────┐ │ 用户输入 │→ │ 意图匹配 │→ │ 调用 @Tool │→ │ 结构化 │ │ "搜索火锅"│ │ 关键词识别 │ │ Java 方法 │ │ 结果返回 │ └─────────┘ └──────────┘ └───────────┘ └────┬────┘ │ ┌──────────────────────────────┘ ▼ ┌────────────────┐ ┌──────────────┐ │ LLM 生成友好文本 │ ←── │ 通义千问 Qwen │ └───────┬────────┘ └──────────────┘ ▼ ┌────────────────┐ │ 前端渲染卡片按钮 │ │ 点击跳转对应页面 │ └────────────────┘ ``` ### Lua 原子脚本示例 (seckillVoucher.lua) ```lua -- 1. 校验库存 if (redis.call('exists', stockKey) == 0) then return -1 end local stock = redis.call('get', stockKey); if (tonumber(stock) <= 0) then return -2 end -- 2. 校验一人一单 if (redis.call('sismember', orderKey, userId) == 1) then return -3 end -- 3. 扣减库存 redis.call('decrby', stockKey, 1); -- 4. 记录用户 redis.call('sadd', orderKey, userId); return 0; -- 成功 ``` --- ## 🗄️ 项目结构 ``` HiveTrade/ # 根项目(父 POM) ├── HiveTrade-core-service/ # 【核心】Spring Boot 单体应用 │ ├── src/main/java/com/HiveTrade/ │ │ ├── agent/ # AI Agent(LangChain4j) │ │ │ ├── AgentResponse.java # 结构化响应 DTO │ │ │ ├── AgentTools.java # @Tool 工具定义 │ │ │ ├── AiAgentController.java # /ai-agent/chat 接口 │ │ │ └── AiAgentService.java # Agent 服务 │ │ ├── controller/ # REST 控制器 │ │ ├── service/impl/ # 业务逻辑实现 │ │ ├── mapper/ # MyBatis 映射 │ │ ├── entity/ # 实体类 │ │ ├── kafka/ # Kafka 生产/消费 │ │ │ ├── consumer/ # 秒杀订单消费者 │ │ │ └── producer/ # 秒杀订单生产者 │ │ ├── lua/ # Lua 脚本封装 │ │ ├── cache/ # 缓存失效发布/订阅 │ │ ├── delay/ # 延迟队列(提醒) │ │ ├── init/ # 启动初始化(布隆过滤器/缓存) │ │ └── config/ # 配置 / 拦截器 / 异常处理 │ └── src/main/resources/ │ ├── prompts/agent-system.md # AI 系统提示词 │ ├── lua/ # Redis Lua 脚本文件 │ ├── application.yaml # 应用配置 │ └── shardingsphere.yaml # 分库分表配置 ├── HiveTrade-vue3/ # 前端项目 │ └── src/views/ │ ├── index.vue # 首页(分类+Feed流+搜索) │ ├── shop/{List,Detail,Manage,MyShops}.vue │ ├── blog/{Detail,Edit}.vue │ ├── voucher/{Manage,MyVouchers}.vue │ ├── info/{InfoHtml,InfoEdit}.vue │ ├── ai/AiChat.vue # AI 聊天浮动组件 │ └── login/LoginPage.vue ├── picture/ # 项目页面截图 ├── sql/ # SQL 脚本(数据初始化/优惠券) ├── HiveTrade-common/ # 通用模块 ├── HiveTrade-parameter/ # 参数 DTO 定义 ├── HiveTrade-sharding/ # ShardingSphere 扩展 ├── HiveTrade-redis-tool-framework/ # Redis 工具框架 ├── HiveTrade-redisson-framework/ # Redisson 分布式锁/延迟队列 ├── HiveTrade-mq-framework/ # 消息队列抽象 ├── HiveTrade-id-generator-framework/ # 雪花 ID 生成器 └── pom.xml # 父 POM(多模块聚合) ``` --- ## ⚡ 快速启动 ### 前置环境 | 组件 | 版本 | 用途 | |:---|:---|:---| | JDK | 17+ | 编译运行 | | MySQL | 8.0+ | 持久化 + ShardingSphere 分片 | | Redis | 6.0+ | 缓存 / 限流 / 分布式锁 | | Kafka | 3.0+ | 秒杀异步消息 | | Node.js | 18+ | 前端构建 | | Maven | 3.8+ | 后端构建 | ### 启动 ```bash # 1. 导入数据库(修改连接信息后执行) mysql -h -u root -p < sql/reset_data.sql mysql -h -u root -p < sql/add_vouchers.sql # 2. 修改配置 # application.yaml → 中间件地址 # shardingsphere.yaml → 分片数据库连接 # 3. 编译安装框架模块 + 启动后端 cd HiveTrade mvn clean install -DskipTests -q cd HiveTrade-core-service mvn spring-boot:run # 4. 启动前端 cd HiveTrade-vue3 npm install npm run dev ``` ### AI 助手配置 ```bash # 环境变量(阿里云 DashScope) set AI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ``` --- ## 📝 License MIT License