官网地址:magestack.cn
12306 铁路购票服务是与大家生活和出行相关的关键系统,包括会员、购票、订单、支付和网关等服务。
这个项目旨在让学习者可以快速掌握分布式系统设计的技巧,尤其适合对高并发、分布式感兴趣的同学学习。如果想深入理解和应用分布式系统的设计原则,这个项目将会是一个很好的学习资源。
项目中包含了缓存、消息队列、分库分表、设计模式等代码,通过这些代码可以全面了解分布式系统的核心知识点。
在系统设计中,采用 JDK17 + SpringBoot3&SpringCloud 微服务架构,构建高并发、大数据量下仍然能提供高效可靠的 12306 购票服务。
为了方便大家学习,该系统提供了两种版本:
- SpringBoot 聚合服务版本:适合测试和部署,可以直接启动
aggregation-service
聚合服务和网关服务。 - SpringCloud 微服务版本:适合学习微服务设计,可以分别启动支付、订单、用户、购票和网关服务。
根据自己的学习和使用需求,选择合适的版本启动即可。微服务版本侧重学习设计,聚合服务版本侧重测试和部署。请根据场景需要,选择正确的版本进行学习和使用。
学生为什么选 12306?
我的读者中有很多学生群体,他们反馈说实习和秋招的竞争变得非常激烈。大家的项目内容基本雷同,大多都是通过观看B站上的视频来学习并完成的。
这种情况导致学历一般的学生很难获得面试邀请。我之所以说学历一般的同学,是因为我也见过一些学历较好的同学只写了一些外卖和商城项目,但由于学历加持,他们能比较轻松拿到大厂的面试邀请。
如何判断一份学生的简历含金量怎么样?通常由以下项进行排序:
学校&学历 > 获奖经历 > 实习和工作经验 > 项目 > 证书 > 专业技能 > ......
在全体学生中,学校和学历以及获奖经历的比例相对较小。毕竟,出色的学校和重要的竞赛机会有限。对于更多的同学来说,他们只能在其他方面努力以展现自己的优势。
综合来看,项目经验是许多同学可以展现自己的重要领域。拥有出色的项目经验在简历上具有非常重要的意义。对于学历一般的同学而言,拥有优秀的项目经验可能会带来更多的面试邀请;而对于学历较好的同学而言,拥有出色的项目经验可能会使他们获得更好的公司机会。
为了实现这一目标,我决定选择一个能够在简历中成为亮点,引起面试官兴趣,并且大家熟知的项目------12306铁路购票系统。
项目质量怎么样?
我理解大家对选择一个合适的项目以投入时间和精力的担忧。选对项目既可以锻炼技能,又可以产出价值是非常重要的。
以用户服务系统为例,低并发和低数据量的系统相对简单,但高并发和海量数据的系统则需要考虑很多额外因素。
- 当用户在 12306 网站注册新账号或添加乘车人时,系统需验证用户提交信息的真实性和准确性。如何有效预防用户提交虚假信息,保障系统购票的安全?
- 12306 的大规模用户和乘车人数据如何选择分库分表?选择哪个字段作为分片键?如何在老业务上平滑上线分库分表?出现问题如何快速回滚?
- 系统支持会员使用用户名、手机号以及邮箱等多种方式进行登录。由于登录时无法确定用户的分片键,造成的"读请求扩散"问题如何解决?
- 在高并发的会员注册场景下,绝对会出现缓存穿透问题。网上鼓吹的对不存在 Key 进行缓存值设为 Null,以及布隆过滤器等都存在漏洞,如何解决?
- 存在较多的敏感信息,比如会员或者乘车人的姓名、手机号、邮箱、证件号码以及住址,如何防止数据库被攻击时造成的敏感信息泄露?
再以购票服务为例,当用户购买两个乘车人的高铁一等座票且没有选座时,座位的分配逻辑如下:
- 首先检查当前列车的一等座余票是否足够。如果余票不足,直接向客户端返回购票请求失败的响应。
- 获取所有车厢中有两个座位余票的车厢,并对这些车厢进行遍历,按照下述流程执行。
- 首先检查所有车厢中是否存在一等座车票的相邻座位。如果所有车厢中都没有相邻座位,进入下一步逻辑。
- 接着检查是否有车厢中包含两个不相邻的一等座座位?因为同车厢两座位相邻座位没有的话,就退而找同车厢不相邻座位。
- 如果以上逻辑都无法满足,那么最后选择分配不同车厢的不相邻座位。这种情况下,由于已经确认一等座的余票充足,因此一定能够成功完成购票。
通过以上步骤,购票系统能够在高铁一等座票余票充足的情况下,合理地分配座位,确保乘车人出行时有良好的座位体验。同时,如果余票不足,系统会优先满足乘车人顺利购票的需求。
项目文档
-
入门准备
-
快速开始
-
核心技术文档
-
手摸手从零到一实现
- 手摸手之梳理核心业务
- 手摸手之梳理数据库表结构涉及
- ......
-
面试系列
- 如何把 12306 写到简历上
- 小红书内容推荐部门一面
- ......
项目基础架构
1. 项目工程目录介绍
lua
├── checkstyle || -- # 代码格式检查组件
│ ├── 12306_checkstyle.xml || -- # 代码格式检查组件规则配置
│ └── 12306_checkstyle_suppression.xml || -- # 忽略代码格式检查组件规则配置
├── console-vue || -- # 12306 前端控制台项目
│ ├── README.md
│ ├── babel.config.js
│ ├── jsconfig.json
│ ├── node_modules
│ ├── package.json
│ ├── public
│ ├── src
│ ├── vue.config.js
│ └── yarn.lock
├── dependencies || -- # 12306 后端项目全局依赖版本控制
│ └── pom.xml
├── format || -- # 12306 后端项目格式化组件
│ ├── 12306_spotless_formatter.xml || -- # 12306 后端项目格式化组件规则配置
│ └── license-header || -- # 12306 后端项目开源协议头格式化
├── frameworks || -- # 12306 基础架构组件库
│ ├── base || -- # 12306 顶层抽象基础组件
│ ├── bizs || -- # 12306 业务相关基础组件,比如用户上下文等
│ ├── cache || -- # 12306 缓存基础组件
│ ├── common || -- # 12306 公共工具包组件
│ ├── convention || -- # 12306 项目规约组件
│ ├── database || -- # 12306 数据库持久层组件
│ ├── designpattern || -- # 12306 设计模式抽象基础组件
│ ├── distributedid || -- # 12306 分布式 ID 基础组件
│ ├── idempotent || -- # 12306 幂等基础组件,包括 HTTP 及不同消息队列实现
│ ├── log || -- # 12306 日志打印基础组件库
│ └── web || -- # 12306 Web 相关基础组件库
│ ├── pom.xml
├── resources || -- # 12306 项目数据库初始化及其它
│ ├── data || -- # 12306 数据库数据初始化
│ └── db || -- # 12306 数据库初始化
├── services || -- # 12306 后端项目集合
│ ├── aggregation-service || -- # 12306 SpringBoot 聚合模式服务
│ ├── gateway-service || -- # 12306 网关服务
│ ├── order-service || -- # 12306 订单服务
│ ├── pay-service || -- # 12306 支付服务
│ ├── ticket-service || -- # 12306 购票服务
│ └── user-service || -- # 12306 用户服务
│ ├── pom.xml
└── tests || -- # 12306 单元测试集合
│ ├── general || -- # 12306 通用单元测试
└── pom.xml
├── LICENSE
├── mvnw
├── mvnw.cmd
├── pom.xml
├── README.md
2. 后端架构依赖
技术 | 名称 | 版本 | 官网 | |
---|---|---|---|---|
1 | Spring Boot | 基础框架 | 3.0.7 | spring.io/projects/sp... |
2 | MyBatis-Plus | 持久层框架 | 3.5.3.1 | baomidou.com |
3 | HikariCP | 数据库连接池 | 5.0.1 | github.com/brettwooldr... |
4 | Redis | 分布式缓存数据库 | Latest | redis.io |
5 | RocketMQ | 消息队列 | 2.2.3 | rocketmq.apache.org |
6 | ShardingSphere | 数据库生态系统 | 5.3.2 | shardingsphere.apache.org |
7 | SpringCloud Alibaba | 分布式框架 | 2022.0.0.0-RC2 | github.com/alibaba/spr... |
8 | SpringCloud Gateway | 网关框架 | 2022.0.3 | spring.io/projects/sp... |
9 | FastJson2 | JSON 序列化工具 | 2.0.36 | github.com/alibaba/fas... |
10 | Canal | BinLog 订阅组件 | 1.1.6 | github.com/alibaba/can... |
11 | HuTool | 小而全的工具集项目 | 5.8.2 | hutool.cn |
12 | Swagger3 | 项目 API 文档框架 | 3.x | swagger.io |
13 | Knife4j | Swagger 增强框架 | 3.x | doc.xiaominfo.com |
14 | Maven | 项目构建管理 | 3.9.1 | maven.apache.org |
15 | Redisson | Redis Java 客户端 | 3.21.3 | redisson.org |
16 | Sentinel | 流控防护框架 | 1.8.6 | github.com/alibaba/Sen... |
17 | Hippo4j | 动态线程池框架 | 1.5.0 | hippo4j.cn |
18 | XXL-Job | 分布式定时任务框架 | 2.4.0 | www.xuxueli.com/xxl-job |
19 | SkyWalking | 分布式链路追踪框架 | 9.5.0 | skywalking.apache.org |
20 | JetCache | Java 缓存框架 | 2.7.3 | github.com/alibaba/jet... |
21 | TTL | 增强版 ThreadLocal | 2.14.3 | github.com/alibaba/tra... |
如何使用
12306 前端控制台演示环境:12306.magestack.cn
前端系统实现了与官网极为接近的业务逻辑和 UI 展示。
在学习过程中,通过类似官网的前端系统直接调试后端服务,可以避免纯通过接口测试的繁琐。这种真实场景的模拟,使得学习过程更加流畅高效。
目前前端系统还在开发中,部分业务及细节处还在调整,完成后统一给出控制台操作手册,请耐心等待。
1. 车票查询功能
2. 提交订单页,选择乘车人下单
3. 高铁在线选座页面
常见问题答疑
Q:面向人群是学生,但是里面这么多的代码设计方案,学生能看明白么?
A:文档中准备了两部分资料,一部分是讲解技术实现细节,通过该部分可以很好掌握核心技术;另一部分是讲如何从零到一实现系统;通过两种文档结合,可以很好吸收 12306 系统中的设计。
Q:如何把 12306 项目写到我的简历上?
A:马哥在文档库最后给大家提供了 12306 写到简历上的亮点、难点以及解决方案。其次,通过 12306 去面试的小伙伴的面试题也会进行汇总,免费供大家学习使用。
Q:工作几年的有必要看 12306 这个系统么?
A:我觉得有必要,已经工作的同学虽然没办法把这个项目应用到简历上,但是系统中好的设计却是可以代入到自己的项目中,提高自己项目的亮点以及难点。
项目文档
共计 100+ 核心技术文档!帮助你深入了解以及快手上手 12306 系统。
项目中的文档包括三部分,快速开始、核心技术文档以及从零到一开发。可根据自己的兴趣选择深入了解核心技术或从零到一复刻系统。