--- title: "00-总览" created: 2025-12-08 aliases: - 总览 tags: - 项目 --- # 总览 ## 一、 项目背景与核心价值 为什么学习这个项目? 普通的CRUD(增删改查)项目(如传统商城、外卖)在简历中已严重同质化,无法满足当前对高并发、高可用架构设计的面试要求 。 - **核心目标**:从0到1构建一个贴近真实大麦网业务的票务系统,重点解决“热门演唱会抢票”**场景下的**高并发、高吞吐量问题 2222。 - **技术深度**:不仅仅是业务实现,更强调架构设计(如分库分表、分布式锁优化、多级缓存、一致性保障)在生产环境中的落地 3333。 --- ## 二、 核心技术架构 (Tech Stack) 该项目采用 **Spring Cloud Alibaba** 微服务生态,技术选型覆盖了互联网大厂的主流配置 4444。 | **层次** | **技术组件** | **作用/说明** | | --- | --- | --- | | **基础框架** | Spring Boot + Spring Cloud | 微服务核心框架 55 | | **服务治理** | Nacos | 服务注册与发现、配置中心 6666 | | **网关层** | Spring Cloud Gateway | 统一流量入口、鉴权 77 | | **流量防护** | Sentinel / Hystrix | 熔断降级、限流保护 8888 | | **数据持久** | MySQL + MyBatis-Plus | 核心业务数据存储 99 | | **分库分表** | ShardingSphere | 解决海量订单和用户数据的存储瓶颈 10101010 | | **缓存架构** | Redis + Redisson | 分布式缓存、分布式锁工具 1111 | | **消息队列** | Kafka / RocketMQ | 异步解耦、削峰填谷(用于订单、日志等) 12121212 | | **搜索服务** | Elasticsearch | 节目搜索、复杂查询支持 1313 | | **日志监控** | ELK (Logstash, Kibana) + SpringBootAdmin | 日志收集与服务状态监控 14141414 | | **工具链** | AJ-Captcha, XXL-Job, Docker, Jenkins | 验证码、定时任务、容器化部署 15151515 | --- ## 三、 基础设施与组件化设计 在微服务架构中,“组件库”的设计至关重要。项目通过SpringBoot自动装配机制,封装了大量通用组件,实现了高内聚低耦合 16。 ### 1. 基础规范与安全 - **Web服务标准化**:统一了全局异常处理、业务异常定义、以及API返回体(Response Body)规范 17171717。 - **接口防护(防刷/幂等)**: - 利用 `Lua + Redis` 实现时间窗口内的限流控制 18181818。 - 设计防重复幂等组件,防止网络重试导致的重复操作 19。 - 通过MQ异步记录异常请求行为 20。 ### 2. 分布式ID设计 - **问题**:传统ID生成策略在Kubernetes(K8s)容器化部署下容易产生重复ID 21212121。 - **方案**:定制优化后的雪花算法(Snowflake),解决容器重启或动态扩缩容时的机器ID冲突问题,同时兼容百度UID算法优化 22222222。 ### 3. 数据与通信封装 - **Redis定制**:统一管理Key的前缀和生命周期,封装API以直接操作对象,屏蔽底层序列化细节 23232323。 - **Feign定制**:优化服务间调用的数据传递格式 24。 - **Elasticsearch定制**:封装API以解决深分页(Deep Pagination)带来的性能问题 25。 --- ## 四、 核心业务亮点与高并发解决方案(重难点) 这是学习该项目最核心的部分。你需要针对每一个业务模块,理解其面临的“并发痛点”**以及**“设计方案”。 ### 1. 用户服务体系 - **痛点**: - **读扩散问题**:用户可能通过手机号、邮箱等多种方式登录。如果按用户ID分库分表,非ID查询会导致扫描所有库(读扩散) 262626 - **缓存穿透**:高并发注册或登录时,恶意请求查询不存在的用户,直接击穿数据库 272727。 - **解决方案**: - 设计合理的分片策略(Mapping表或基因法)解决多维登录的读扩散 28。 - 采用布隆过滤器或空值缓存策略应对缓存穿透,结合图形验证码防止恶意流量 2929292929292929。 - 利用**组合模式**重构复杂的注册验证逻辑,提升代码可维护性 30。 ### 2. 节目详情与展示 - **痛点**: - **热点数据查询**:热门演唱会详情页瞬间访问量巨大(百万级QPS),Redis单点可能扛不住 。31313131 - **解决方案**: - **多级缓存架构**:本地缓存(Caffeine/Guava)+ 分布式缓存(Redis)的双重保障 323232。 - **缓存一致性**:解决本地缓存与分布式缓存数据同步的问题 33。 - **深分页优化**:解决Elasticsearch在查询大量节目列表时的性能瓶颈 34。 ### 3. 购票与库存交易(核心中的核心) - **痛点**: - **超卖与少卖**:高并发下如何保证库存扣减的原子性? 35。 - **分布式锁性能**:简单的分布式锁会导致请求排队,性能极其低下 36。 - **数据一致性**:Redis扣减了库存,但数据库更新失败怎么办?或者支付回调延迟如何处理? 37373737。 - **解决方案**: - **锁的深度优化**: - 从“粗粒度锁”优化到“细粒度锁” 38。 - 探索“无锁化”设计,利用Redis原子操作或Lua脚本实现无锁扣减,极大提升吞吐量 3939。 - **库存扣减策略**:详解预扣库存、实扣库存的逻辑,以及Redis与DB之间的数据最终一致性保障(如延迟双删的讨论与替代方案) 40404040。 - **购票人限制**:在高并发场景下,如何快速校验单人限购数量 41。 ### 4. 订单系统 - **痛点**: - **分库分表查询维度**:订单表如果按Order ID分片,用户查自己的订单列表变慢;按User ID分片,后台按订单号查变慢 424242。 - **延迟关闭**:用户下单后未支付,超时需要自动关闭订单。轮询数据库效率太低 434343434343。 - **解决方案**: - **双写或索引表**:解决订单的多维查询瓶颈 44。 - **延迟队列**:对比分析使用Redis ZSet vs 消息队列(RocketMQ/Kafka)实现延迟订单关闭的优劣 454545454545454545。 - **支付回调幂等**:接收支付宝/微信回调时,确保状态更新的唯一性和正确性 46。 --- ## 五、 推荐学习路径 根据文档建议,为了不“像无头苍蝇一样”,建议按照以下顺序由浅入深学习 47474747: **第一阶段:项目启动与基础 (打地基)** 1. **项目概要**:了解业务背景、技术架构图、数据库表关系 48484848。 2. **环境搭建**:安装Nacos, Sentinel, Kafka, Redis等中间件,跑通前后端项目 49494949。 3. **基础组件**:阅读代码,学习Swagger/Knife4j、GlobalExceptionHandler、Result包装类的封装 50505050。 **第二阶段:核心业务开发 (通流程)** 1. **用户模块**:实现注册登录、参数加密解密、图形验证码集成 51515151。 2. **节目模块**:实现列表展示、详情查询,接入Elasticsearch 52。 3. **交易模块**:跑通下单、锁座、模拟支付、订单生成全流程 53535353。 **第三阶段:高并发与架构优化 (核心竞争力)** 此阶段需带着问题去学习,是面试加分项 54545454。 1. **深入研究锁**:分布式锁的实现细节(Redisson原理)、锁粒度优化、无锁化扣减库存 55。 2. **攻克分库分表**:实战ShardingSphere配置,解决读扩散问题 5656。 3. **多级缓存实战**:引入本地缓存,处理缓存击穿/穿透/雪崩 57。 4. **一致性保障**:研究MQ在分布式事务中的应用(如订单支付后的状态流转) 58。 **第四阶段:简历与面试准备** 1. 总结**“深挖细节亮点**”中的13+个核心问题(如分布式ID生成、库存一致性、分库分表查询等) 59。 2. 整理项目难点:例如“我是如何通过无锁化设计将购票QPS提升10倍的”或“我是如何解决分库分表下的多维查询问题的” 60606060。 --- **企业级项目导航**:⬅️ [[04-白话讲解|04-白话讲解]] | 00-总览 | ➡️ [[01-大麦项目如何来学习|01-大麦项目如何来学习]]