官网地址:magestack.cn
12306 铁路购票服务是与我们日子和出行相关的要害体系,包括会员、购票、订单、付出和网关等服务。
这个项目旨在让学习者能够快速把握分布式体系规划的技巧,尤其合适对高并发、分布式感爱好的同学学习。假如想深化理解和应用分布式体系的规划准则,这个项目将会是一个很好的学习资源。
项目中包括了缓存、音讯行列、分库分表、规划形式等代码,经过这些代码能够全面了解分布式体系的中心知识点。
在体系规划中,采用 JDK17 + SpringBoot3&SpringCloud 微服务架构,构建高并发、大数据量下依然能供给高效牢靠的 12306 购票服务。
为了便利我们学习,该体系供给了两种版别:
- SpringBoot 聚合服务版别:合适测验和布置,能够直接发动
aggregation-service
聚合服务和网关服务。 - SpringCloud 微服务版别:合适学习微服务规划,能够分别发动付出、订单、用户、购票和网关服务。
依据自己的学习和运用需求,挑选合适的版别发动即可。微服务版别偏重学习规划,聚合服务版别偏重测验和布置。请依据场景需求,挑选正确的版别进行学习和运用。
学生为什么选 12306?
我的读者中有许多学生群体,他们反馈说实习和秋招的竞赛变得非常激烈。我们的项目内容基本雷同,大多都是经过观看B站上的视频来学习并完成的。
这种情况导致学历一般的学生很难取得面试邀请。我之所以说学历一般的同学,是因为我也见过一些学历较好的同学只写了一些外卖和商城项目,但因为学历加持,他们能比较轻松拿到大厂的面试邀请。
怎么判别一份学生的简历含金量怎么样?一般由以下项进行排序:
校园&学历 > 获奖阅历 > 实习和工作经历 > 项目 > 证书 > 专业技能 > ……
在全体学生中,校园和学历以及获奖阅历的份额相对较小。毕竟,超卓的校园和重要的竞赛机会有限。关于更多的同学来说,他们只能在其他方面努力以展现自己的优势。
综合来看,项目经历是许多同学能够展现自己的重要领域。具有超卓的项目经历在简历上具有非常重要的意义。关于学历一般的同学而言,具有优秀的项目经历可能会带来更多的面试邀请;而关于学历较好的同学而言,具有超卓的项目经历可能会使他们取得更好的公司机会。
为了完成这一方针,我决议挑选一个能够在简历中成为亮点,引起面试官爱好,而且我们熟知的项目——12306铁路购票体系。
项目质量怎么样?
我理解我们对挑选一个合适的项目以投入时刻和精力的担忧。选对项目既能够锻炼技能,又能够产出价值是非常重要的。
以用户服务体系为例,低并发和低数据量的体系相对简单,但高并发和海量数据的体系则需求考虑许多额外因素。
- 当用户在 12306 网站注册新账号或增加搭车人时,体系需验证用户提交信息的实在性和准确性。怎么有用防备用户提交虚伪信息,保障体系购票的安全?
- 12306 的大规模用户和搭车人数据怎么挑选分库分表?挑选哪个字段作为分片键?怎么在老事务上滑润上线分库分表?出现问题怎么快速回滚?
- 体系支撑会员运用用户名、手机号以及邮箱等多种方法进行登录。因为登录时无法承认用户的分片键,造成的“读恳求分散”问题怎么解决?
- 在高并发的会员注册场景下,绝对会出现缓存穿透问题。网上鼓吹的对不存在 Key 进行缓存值设为 Null,以及布隆过滤器等都存在漏洞,怎么解决?
- 存在较多的敏感信息,比如会员或者搭车人的姓名、手机号、邮箱、证件号码以及住址,怎么防止数据库被攻击时造成的敏感信息泄露?
再以购票服务为例,当用户购买两个搭车人的高铁一等座票且没有选座时,座位的分配逻辑如下:
- 首要查看当时列车的一等座余票是否满意。假如余票不足,直接向客户端回来购票恳求失利的响应。
- 获取一切车厢中有两个座位余票的车厢,并对这些车厢进行遍历,按照下述流程履行。
- 首要查看一切车厢中是否存在一等座车票的相邻座位。假如一切车厢中都没有相邻座位,进入下一步逻辑。
- 接着查看是否有车厢中包括两个不相邻的一等座座位?因为同车厢两座位相邻座位没有的话,就退而找同车厢不相邻座位。
- 假如以上逻辑都无法满意,那么最后挑选分配不同车厢的不相邻座位。这种情况下,因为已经承认一等座的余票足够,因此必定能够成功完成购票。
经过以上步骤,购票体系能够在高铁一等座票余票足够的情况下,合理地分配座位,保证搭车人出行时有杰出的座位体会。一起,假如余票不足,体系会优先满意搭车人顺利购票的需求。
项目文档
-
入门预备
- 什么是 12306
- 为什么 12306 更合适学生
- 后端技能架构选型
- 项目接口文档
- 前端操控台手册
- 怎么从零到一学习 12306
-
快速开始
- 项目依靠中间件环境搭建
- 快速发动(后端)
- 快速发动(前端)
- 12306 用户体系建设概要
- ……
-
中心技能文档
- 怎么生成大局唯一分布式 ID
- 怎么运用 Builder 形式创立线程池
- 责任链形式重构杂乱事务场景
- 死磕规划形式之笼统责任链形式
- 战略形式在项目规划中用得最多
- 怎么运用线程池不容易出毛病
- ……
-
手摸手从零到一完成
- 手摸手之整理中心事务
- 手摸手之整理数据库表结构触及
- ……
-
面试系列
- 怎么把 12306 写到简历上
- 小红书内容引荐部门一面
- ……
项目根底架构
1. 项目工程目录介绍
├── 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 体系。
项目中的文档包括三部分,快速开始、中心技能文档以及从零到一开发。可依据自己的爱好挑选深化了解中心技能或从零到一复刻体系。