一、管理员
进行后台管理
二、数据库
分库:商品,订单,秒杀,用户+权限+支付log
三、文件上传和下载
- Ceph集群
- Swift API
- 配置用户信息,获取容器,使用容器进行upload+download
四、商品发布
id不为空,修改,id为空,增加
product:spu+skus
五、OpenResty:nginx+lua
动静分离:location
多级缓存:lua脚本+redis缓存,先查nginx缓存,再查redis,最后查后端服务
后端服务开启缓存:@CacheConfig,@Cacheable,@CacheEvict,@CachePut
缓存一致性:canal+EntryHandler+调用后端缓存更新接口
六、ES
- ES的构建:通过实现ElasticsearchRepository接口,重写方法,实现ES更新的Feign接口,canal调用feign接口,实现数据库更新同步ES索引
- ES的搜索:
- 构建搜索条件:普通搜索+排序withSort+分页withPageable
- 构建分组条件:品牌/分类:List;属性Map<String,Set<String>>
- 亮亮:withHighlightBuilder
七、搜索页面+详情页面
数据绑定:thymeleaf+vue
商品详情静态页面:通过templateengine,使用模版+数据+输出,得到对应的静态页面
canal实时生成静态页面
八、购物车:Mongodb
查询多+数据量大+持久
1.数据量大;2.结构化的数据,比如JSON数据;3.支持复杂查询
mapper继承mongodbrepository
MongoTemplate操作:key是username+id
九、下单操作
1.订单
根据用户名查到对应列表
订单下单处理:先看库存,够用扣减,增加订单,增加订单明细,删除购物车数据
订单:使用Seata的AT模式,构建分布式事务组
2.支付
支付系统调用微信API,加密传输:MD5验签+AES
微信验签,微信进行预支付,返回二维码地址,前台通过Qrious展示二维码
微信进行密码输入,验证之后,返回支付结果给回调地址
支付系统通过MQ异步生成支付日志,异步更改订单状态
主动查询支付结果:将不可逆转的日志结果,存到pay_log,没有数据再去查微信支付服务
3.退款
更改订单状态退款申请中,进行退款申请,使用MQ让支付系统发起退款申请
支付系统使用MQ将退款申请结果返回给订单系统
成功:更改订单状态
不成功:回滚库存
十、每日秒杀
1.页面
秒杀商品:es索引库
秒杀商品详情页:静态页面生成
定时任务:elastic-job lite,当活动增加或修改,创建对应的定时任务删除静态页面
2.热门数据获取
Lua脚本收集logjson日志,发送给Kafka,
在访问html详情页的location里面,进行log_by_lua的配置,
Apache Druid:数据摄入:kafka
3.热门商品分离
每隔10分钟,读取新增热门商品,将islock改为1,进行隔离,加入缓存
4.秒杀隔离实现
微服务网关过滤器,拦截秒杀请求
进行排队判断:排队标识避免重复排队,加入RocketMQ
排队下单:使用redission分布式锁,先过布隆过滤器,然后下单,扣减库存,库存为0加入布隆过滤器
十一、网关鉴权
1.JWT令牌
登录的时候创建令牌,加上ip,返回给用户
用户访问,校验令牌+ip
2.网关过滤器
redis布隆过滤器里面存储对应的uri,先校验uri是否有效
redis存储对应的权限,先检查是否拦截,拦截就进行权限校验
ApplicationRunner:加入所有权限和所有角色权限映射
pathMatcher:通配符匹配
权限校验完,进行秒杀热商品排队
十二、限流
- sentinel+gateway限流:网关API分组,限流规则
- nginx限流:速率+连接数+黑白名单
- LVS百万并发:NAT模式,TUN模式,DR模式