🔹 一、用户访问层(前端 + 网关)
✅ 设计目标:
- 接收用户请求,统一入口
- 实现负载均衡、限流、鉴权、路由
✅ 技术选型:
- 前端:React/Flutter/小程序等
- API 网关:Spring Cloud Gateway / Nginx + Lua
- 安全拦截:JWT、OAuth2、验证码校验
✅ 功能职责:
- 用户登录、实名认证
- 请求统一入口路由到后端微服务
- 实现访问频率控制、IP 黑名单、滑动验证码
✅ 和下游交互:
- 将用户的请求根据路径路由到用户服务、车票服务、购票服务、候补服务
🔹 二、应用服务层(Spring Boot 微服务)
✅ 设计目标:
- 拆分业务逻辑,支持弹性部署和水平扩展
- 各服务高内聚低耦合
✅ 微服务模块:
1. 用户服务
- 处理用户注册、登录、实名认证、行为记录
- 与风控系统协同识别异常用户
2. 车票服务
- 查询车次、班次、余票、票价(配合 Redis 提升性能)
- 支持分页、模糊搜索、按站点筛选等功能
3. 购票服务
- 实现抢票逻辑:下单 → 扣库存 → 支付 → 出票
- 使用 Redis + 分布式锁控制余票,Kafka 异步入库
- 下单请求写入 Kafka,避免数据库瞬时写崩
4. 候补服务
- 支持用户提交候补请求
- 定时扫描退票信息,从候补队列中匹配出可出票用户
🔹 三、异步消息系统(Kafka)
✅ 设计目标:
- 解耦服务,提高异步处理能力
- 高吞吐、高可用、持久化消息处理
✅ 核心作用:
- 抢票请求进入 Kafka 队列,后台异步处理(防止瞬时流量打挂数据库)
- 购票成功后异步通知用户 / 更新库存 / 记录日志
- 候补服务监听退票事件
✅ 和上下游交互:
- 购票服务、候补服务生产消息
- Redis、MySQL、风控系统消费消息
🔹 四、缓存系统(Redis)
✅ 设计目标:
- 提升读写性能,降低数据库压力
- 实现热点数据缓存、库存控制、限流令牌桶
✅ 使用方式:
- 缓存热点数据:车次信息、站点列表、余票数量
- 使用 Redis + Lua 脚本原子扣减余票
- 使用 Redisson 实现分布式锁控制并发写
-- 原子扣库存脚本
if redis.call("get", KEYS[1]) >= ARGV[1] then
return redis.call("decrby", KEYS[1], ARGV[1])
else
return -1
end
🔹 五、数据库层(MySQL)
✅ 设计目标:
- 存储核心业务数据,保证数据一致性
- 支持高并发下的写入保障和读写分离
✅ 数据库设计:
- 用户表、订单表、车票表、交易记录表、候补记录表
- 分库分表设计(按用户 ID 或车次分片)
- 配合读写分离中间件(如 MyCat)提速查询
🔹 六、安全防控 & 风控系统
✅ 设计目标:
- 防止黄牛、刷票、恶意请求
- 提升系统抗攻击能力
✅ 技术手段:
- 滑动验证码、人机行为识别、设备指纹
- 接入行为模型(机器学习)分析用户抢票行为
- 定时清理黑名单,动态风控策略下发
- 配合 Kafka 异步接收行为日志进行分析
🔄 模块之间的交互流程
下面是一个抢票请求的典型交互流程:
-
用户通过浏览器/App 提交购票请求,经过网关校验并路由到购票服务。
-
购票服务检查余票信息(从 Redis 缓存),尝试原子扣减。
-
如果成功,则将购票操作封装为消息发送到 Kafka。
-
后台异步消费者从 Kafka 消费消息,执行:
- 写入 MySQL(订单数据)
- 通知候补系统更新排队状态
- 通知 Redis 更新库存副本
-
安全系统监听用户行为,如发现异常则记录至黑名单,后续拦截。
✅ 总结
该系统采用微服务 + 缓存 + 消息队列 + 安全风控的组合拳,有效应对高并发、强一致性、安全性等挑战。
| 模块 | 技术亮点 |
|---|---|
| 网关 | 限流、鉴权、请求路由 |
| 微服务 | 高内聚、可独立扩展 |
| Kafka | 异步削峰,保障稳定性 |
| Redis | 高性能缓存、原子扣票 |
| MySQL | 分库分表、读写分离 |
| 风控系统 | 黄牛识别、人机识别、黑名单 |
整个架构体现了弹性扩展 + 高性能处理 + 安全可靠性的设计目标,是 Java 后端分布式系统设计的典范之一。