本文是我在做12306铁路购票项目的笔记。
总结出来吃透12306项目分4步走:1、把git上的代码拷下来,想尽一切办法运行;2、然后吃透项目中的核心业务,对项目有大致了解;3、把项目中运用的核心技术吃透,多打断点多跟踪代码;4、改动项目持续内化,产生一个新项目。
上述方法论对理解任何一个项目有效,本文仅对1、2步进行深入讲解。
壹、项目运行
一、克隆项目
克隆网址:https://gitee.com/nageoffer/12306
出现下面这个问题:
可以通过如下方式解决:
依赖下载成功:
二、安装中间件环境
这里是马哥提供的中间件服务器,免去中间件环境搭建的问题(如果需要Redis、RocketMQ以及 Nacos 域名可微信私信我)
-Dspring.data.redis.password=Sm9sVXBOYJjI030b5tz0trjpzvZzRhtZmEbv0uOImcD1wEDOPfeaqNU4PxHob/Wp
-Dspring.data.redis.port=19389
-Dunique-name=-自定义名称,可以切换为自己的名称
-Dframework.cache.redis.prefix=自定义名称,可以切换为自己的名称:
-Dspring.data.redis.host=Redis域名
-Drocketmq.name-server=RocketMQ域名
-Dspring.cloud.nacos.discovery.server-addr=Nacos域名
-Dspring.data.redis.password=Sm9sVXBOYJjI030b5tz0trjpzvZzRhtZmEbv0uOImcD1wEDOPfeaqNU4PxHob/Wp
-Dspring.data.redis.port=19389
-Dunique-name=-PBJ
-Dframework.cache.redis.prefix=PBJ:
-Dspring.data.redis.host=common-redis-dev.magestack.cn
-Drocketmq.name-server=common-rocketmq-dev.magestack.cn:9876
-Dspring.cloud.nacos.discovery.server-addr=common-nacos-dev.magestack.cn:8848
注意注意,一定要注意,要给下面每一个Application添加VM options这个参数,否则的话会因为缺少参数而无法启动。
基本启动成功:
中间件控制台:
Nacos: http://common-nacos-dev.magestack.cn:8848/nacos/index.html
用户名/密码:nacos/nacos
RocketMQ:RocketMq-console-ng
以分布式开启:
如果遇到下面Command line is too long的错误
可以修改下面这个地方:
三、初始数据库表
在项目中有自带数据库:
12306 铁路购票模式有两种启动模式,分别是聚合版 SpringBoot 模式以及 SpringCloud 微服务模式。
下面是SpringBoot聚合模式:
建立数据库12306:
下面是SpringCloud分布式模式:
建立下面4个数据库:
12306_ticket、12306_user_0、12306_pay_0、12306_order_0
按照上面的套路把12306_ticket、12306_user_0、12306_pay_0、12306_order_0 的数据库结构和数据全部导入。
确保这些表的数据都已全部导入?
四、运行后端
第一次运行启动聚合服务和网关服务即可:
五、运行前端
下面是前端nginx的下载地址:
https://pan.baidu.com/s/1IGrr8xjtFc7c-UJSn-pBtg
提取码:zzyb
如需压缩包可付费找我获取。
访问localhost如果出现下面页面代表成功:
访问:http://localhost:5175 ,跳转到12306的页面:
如果想用本地前端的方式启动,需要先下载node.js,推荐16以上的版本:
Index of /download/release/v16.20.1/ (nodejs.org)
安装yarn:
npm install -g yarn
贰、核心业务熟悉
六、发起支付
七、车票搜索
八、列车数据检索
九、注册用户
十、乘车人模块
十一、敏感信息加密
十二、用户购票责任链验证
十三、座位分配图
十四、实现列车购票流程
十五、列车余票保障缓存数据一致性
十六、库存扣减令牌限流
十七、分库分表
十八、车票订单查看
一、核心业务和技术
1、判断用户名是否已被注册接口,如何应对海量并发请求带来的缓存穿透问题?
2、用户敏感数据存储到数据库后,如何避免被黑客将数据库攻破并窃取用户信息?
3、海量并发查询车票列表接口,如何应对海量请求的查询,以及众多条件如何满足?
4、海量并发下单接口,如何应对海量用户下单请求,如何进行限流以保证系统不崩溃?以及如何正确落库?
5、用户下单后如何保障列车座位余票缓存和数据库一致性?非常典型的数据库和缓存一致性问题。
6、用户下单十分钟未支付,如何取消用户未付款订单?如果用户已支付,如何避免错误取消?
7、系统中用了消息队列后,如何确保消息不会被重复消费,保证业务系统消费幂等性?
8、海量用户和订单数据如何存储,通过什么分库分表规则保障系统高性能响应用户查询等请求?
9、如何通过分库分表基因算法保障分片键的易用性?比如一个订单号字段同时支持订单号和用户 ID 查询。
.10、海量数据分库分表后,为什么选择雪花算法作为 ID?如何保障雪花算法在大规模集群下生成不重复?
【如需文档加下方微信私信】