likes
comments
collection
share

校招:外卖和商城项目不吃香了,我选 12306!

作者站长头像
站长
· 阅读数 22

官网地址:magestack.cn

12306 铁路购票服务是与大家生活和出行相关的关键系统,包括会员、购票、订单、支付和网关等服务。

这个项目旨在让学习者可以快速掌握分布式系统设计的技巧,尤其适合对高并发、分布式感兴趣的同学学习。如果想深入理解和应用分布式系统的设计原则,这个项目将会是一个很好的学习资源。

项目中包含了缓存、消息队列、分库分表、设计模式等代码,通过这些代码可以全面了解分布式系统的核心知识点。

在系统设计中,采用 JDK17 + SpringBoot3&SpringCloud 微服务架构,构建高并发、大数据量下仍然能提供高效可靠的 12306 购票服务。

校招:外卖和商城项目不吃香了,我选 12306!

为了方便大家学习,该系统提供了两种版本:

  • SpringBoot 聚合服务版本:适合测试和部署,可以直接启动 aggregation-service 聚合服务和网关服务。
  • SpringCloud 微服务版本:适合学习微服务设计,可以分别启动支付、订单、用户、购票和网关服务。

根据自己的学习和使用需求,选择合适的版本启动即可。微服务版本侧重学习设计,聚合服务版本侧重测试和部署。请根据场景需要,选择正确的版本进行学习和使用。

校招:外卖和商城项目不吃香了,我选 12306!

学生为什么选 12306?

我的读者中有很多学生群体,他们反馈说实习和秋招的竞争变得非常激烈。大家的项目内容基本雷同,大多都是通过观看B站上的视频来学习并完成的。

这种情况导致学历一般的学生很难获得面试邀请。我之所以说学历一般的同学,是因为我也见过一些学历较好的同学只写了一些外卖和商城项目,但由于学历加持,他们能比较轻松拿到大厂的面试邀请。

如何判断一份学生的简历含金量怎么样?通常由以下项进行排序:

学校&学历 > 获奖经历 > 实习和工作经验 > 项目 > 证书 > 专业技能 > ......

在全体学生中,学校和学历以及获奖经历的比例相对较小。毕竟,出色的学校和重要的竞赛机会有限。对于更多的同学来说,他们只能在其他方面努力以展现自己的优势。

综合来看,项目经验是许多同学可以展现自己的重要领域。拥有出色的项目经验在简历上具有非常重要的意义。对于学历一般的同学而言,拥有优秀的项目经验可能会带来更多的面试邀请;而对于学历较好的同学而言,拥有出色的项目经验可能会使他们获得更好的公司机会。

为了实现这一目标,我决定选择一个能够在简历中成为亮点,引起面试官兴趣,并且大家熟知的项目——12306铁路购票系统。

项目质量怎么样?

我理解大家对选择一个合适的项目以投入时间和精力的担忧。选对项目既可以锻炼技能,又可以产出价值是非常重要的。

以用户服务系统为例,低并发和低数据量的系统相对简单,但高并发和海量数据的系统则需要考虑很多额外因素。

  1. 当用户在 12306 网站注册新账号或添加乘车人时,系统需验证用户提交信息的真实性和准确性。如何有效预防用户提交虚假信息,保障系统购票的安全?
  2. 12306 的大规模用户和乘车人数据如何选择分库分表?选择哪个字段作为分片键?如何在老业务上平滑上线分库分表?出现问题如何快速回滚?
  3. 系统支持会员使用用户名、手机号以及邮箱等多种方式进行登录。由于登录时无法确定用户的分片键,造成的“读请求扩散”问题如何解决?
  4. 在高并发的会员注册场景下,绝对会出现缓存穿透问题。网上鼓吹的对不存在 Key 进行缓存值设为 Null,以及布隆过滤器等都存在漏洞,如何解决?
  5. 存在较多的敏感信息,比如会员或者乘车人的姓名、手机号、邮箱、证件号码以及住址,如何防止数据库被攻击时造成的敏感信息泄露?

再以购票服务为例,当用户购买两个乘车人的高铁一等座票且没有选座时,座位的分配逻辑如下:

  1. 首先检查当前列车的一等座余票是否足够。如果余票不足,直接向客户端返回购票请求失败的响应。
  2. 获取所有车厢中有两个座位余票的车厢,并对这些车厢进行遍历,按照下述流程执行。
  3. 首先检查所有车厢中是否存在一等座车票的相邻座位。如果所有车厢中都没有相邻座位,进入下一步逻辑。
  4. 接着检查是否有车厢中包含两个不相邻的一等座座位?因为同车厢两座位相邻座位没有的话,就退而找同车厢不相邻座位。
  5. 如果以上逻辑都无法满足,那么最后选择分配不同车厢的不相邻座位。这种情况下,由于已经确认一等座的余票充足,因此一定能够成功完成购票。

通过以上步骤,购票系统能够在高铁一等座票余票充足的情况下,合理地分配座位,确保乘车人出行时有良好的座位体验。同时,如果余票不足,系统会优先满足乘车人顺利购票的需求。

项目文档

项目基础架构

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. 后端架构依赖

技术名称版本官网
1Spring Boot基础框架3.0.7spring.io/projects/sp…
2MyBatis-Plus持久层框架3.5.3.1baomidou.com
3HikariCP数据库连接池5.0.1github.com/brettwooldr…
4Redis分布式缓存数据库Latestredis.io
5RocketMQ消息队列2.2.3rocketmq.apache.org
6ShardingSphere数据库生态系统5.3.2shardingsphere.apache.org
7SpringCloud Alibaba分布式框架2022.0.0.0-RC2github.com/alibaba/spr…
8SpringCloud Gateway网关框架2022.0.3spring.io/projects/sp…
9FastJson2JSON 序列化工具2.0.36github.com/alibaba/fas…
10CanalBinLog 订阅组件1.1.6github.com/alibaba/can…
11HuTool小而全的工具集项目5.8.2hutool.cn
12Swagger3项目 API 文档框架3.xswagger.io
13Knife4jSwagger 增强框架3.xdoc.xiaominfo.com
14Maven项目构建管理3.9.1maven.apache.org
15RedissonRedis Java 客户端3.21.3redisson.org
16Sentinel流控防护框架1.8.6github.com/alibaba/Sen…
17Hippo4j动态线程池框架1.5.0hippo4j.cn
18XXL-Job分布式定时任务框架2.4.0www.xuxueli.com/xxl-job
19SkyWalking分布式链路追踪框架9.5.0skywalking.apache.org
20JetCacheJava 缓存框架2.7.3github.com/alibaba/jet…
21TTL增强版 ThreadLocal2.14.3github.com/alibaba/tra…

如何使用

12306 前端控制台演示环境:12306.magestack.cn

前端系统实现了与官网极为接近的业务逻辑和 UI 展示。

在学习过程中,通过类似官网的前端系统直接调试后端服务,可以避免纯通过接口测试的繁琐。这种真实场景的模拟,使得学习过程更加流畅高效。

目前前端系统还在开发中,部分业务及细节处还在调整,完成后统一给出控制台操作手册,请耐心等待。

1. 车票查询功能

校招:外卖和商城项目不吃香了,我选 12306!

2. 提交订单页,选择乘车人下单

校招:外卖和商城项目不吃香了,我选 12306!

3. 高铁在线选座页面

校招:外卖和商城项目不吃香了,我选 12306!

常见问题答疑

Q:面向人群是学生,但是里面这么多的代码设计方案,学生能看明白么?

A:文档中准备了两部分资料,一部分是讲解技术实现细节,通过该部分可以很好掌握核心技术;另一部分是讲如何从零到一实现系统;通过两种文档结合,可以很好吸收 12306 系统中的设计。

Q:如何把 12306 项目写到我的简历上?

A:马哥在文档库最后给大家提供了 12306 写到简历上的亮点、难点以及解决方案。其次,通过 12306 去面试的小伙伴的面试题也会进行汇总,免费供大家学习使用。

Q:工作几年的有必要看 12306 这个系统么?

A:我觉得有必要,已经工作的同学虽然没办法把这个项目应用到简历上,但是系统中好的设计却是可以代入到自己的项目中,提高自己项目的亮点以及难点。

项目文档

共计 100+ 核心技术文档!帮助你深入了解以及快手上手 12306 系统。

项目中的文档包括三部分,快速开始、核心技术文档以及从零到一开发。可根据自己的兴趣选择深入了解核心技术或从零到一复刻系统。

校招:外卖和商城项目不吃香了,我选 12306!