谷粒商城项目总结

本文详细总结了谷粒商城项目的实现过程,包括网关服务与Nginx反向代理、商品业务分析、分布式事务Seata、Elasticsearch集成、RabbitMQ应用、Redis分布式锁、商品详情页接口、CompletableFuture异步调用、JWT无状态登录、登录功能实现、局部过滤器、购物车流程、分布式定时任务Xxl-Job以及订单创建流程等关键模块的技术实践。

谷粒商城项目总结

一、网关服务+Nginx反向代理(域名代理)

1.路由分发
Nginx反向代理流程图

  1. 修改宿主机的 hosts 文件,用域名映射虚拟机的IP地址
  2. Nginx 监听80端口,使用域名代理宿主机的网关8888端口号
  3. 网关服务区路由微服务路径
  4. 浏览器使用域名访问微服务成功

2.跨域问题

  • 跨域的概念:跨域是浏览器针对ajax请求的一种限制,浏览器的同源策略限制
  • 跨域的原因:1.协议不同 https、2.一级域名不同 、3.子域名不同、4.端口号不同
  • 解决方案:
    • 1.jsonp:麻烦、只能解决get请求的跨域问题
    • 2.nginx:代理为不跨域:low;配置cors规范:违背了devops思想
    • 3.cors规范:原理:预检请求、真正请求
  • 这里使用网关解决跨域问题:配置类:CorsWebFilter(webflux)

二、新增商品业务分析

表关系分析
新增九张表

1.保存 spu 相关信息

  • 保存 pms_spu
  • 保存 pms_spu_desc
  • 保存 pms_spu_attr_value

2.保存 sku 相关信息

  • 保存 pms_sku
  • 保存 pms_sku_images
  • 保存 pms_sku_attr_value

3.保存营销相关信息

  • 保存 sms_sku_bounds
  • 保存 sms_sku_full_reduction
  • 保存 sms_sku_ladder

三、谷粒商城分布式事务、集成 seata 流程

https://blog.csdn.net/qq_61084993/article/details/120892467

四、谷粒商城集成 elasticsearch

https://blog.csdn.net/qq_61084993/article/details/121912451

六、谷粒商城集成 RabbitMQ

https://blog.csdn.net/qq_61084993/article/details/120729118

七、Redis 实现分布式锁实现缓存

https://blog.csdn.net/qq_61084993/article/details/121902749

八、商品详情页业务分析

给商品详情页提供数据远程调用 12 个接口(参数:skuId)

  1. 根据id查询sku信息
  2. 根据三级分类id查询一二三级分类
  3. 根据品牌id查询品牌
  4. 根据skuId查询sku
  5. 根据skuId查询sku所有图片
  6. 根据skuId查询sku的所有营销信息
  7. 根据skuId查询sku的库存信息
  8. 根据spuId查询spu下的所有销售属性
  9. 根据skuId查询sku下的所有属性
  10. 查询spu下skuId及销售属性的关系
  11. 根据spuId查询spu的描述信息
  12. 查询组及组下参数和值

九、CompletableFuture异步调用

方法不以Async结尾同步执行
方法以Async结尾异步执行
runAsync不支持返回值、异步
supplyAsync可以支持返回值、异步
whenComplete处理计算结果,同步
whenCompleteAsync处理计算结果,异步
exceptionally当异常时才会执行,处理异常情况
thenApply获取上一个任务的返回结果,也有自己的返回结果集
thenAccept获取上一个任务的返回结果,但是没有自己的结果
thenRun既不获取上一个任务的返回结果,也没有自己的结果
allOf等待所有任务完成
anyOf只要有一个任务完成

十、JWT 实现无状态登录

JWT交互流程

  1. 当客户端第一次发送请求时,服务端会对用户进行验证(登录)
  2. 认证通过后,会根据 secret 生成 token
  3. 将生成的 token 返回给浏览器,作为登录的凭证
  4. 用户以后的每次请求都会携带 token
  5. 服务端利用公钥解析 token 中的 jwt ,校验签名有效后,从 Payload 中获取用户信息
  6. 处理请求,返回响应结果

十二、完成登录功能

  1. 客户端携带用户名和密码请求登录,并携带当前页的路径
  2. 授权中心调用用户中心接口,查询用户是否存在
  3. 如果不存在,则提示用户名或密码错误
  4. 如果存在则生成 jwt ,jwt 要放盗取
  5. 把 jwt 放入 cookie
  6. 为方便展示,向 cookie 中单独写入昵称
  7. 重定向回到登录前的页面

十三、局部过滤器的实现流程

  1. 编写一个实现类实现 GatewayFilterFactory 接口,推荐继承 AbstractGatewayFilterFactory 基类,泛型为 step3 的实体类
  2. 配置过滤器,实现具体的拦截业务,见题十四
  3. 定义一个静态内部实体类,多个参数定义集合字段
  4. 重写父类的无参构造方法,调用 super(step3 的实体类)
  5. 重写 shortcutFieldOrder 方法(定义多个参数的执行顺序)
  6. 需要重写 shortcutType 方法返回 ShortcutType.GATHER_LIST

十四、局部过滤器拦截登录状态业务分析

  1. 判断拦截请求是否在拦截名单中,不在则直接放行
  2. 获取请求中的 token ,同步请求从cookie中获取,异步请求从header中获取
  3. 判断 token 是否为空,为空直接拦截
  4. 不为空就解析 jwt 获取登录信息,解析异常也直接拦截
  5. 判断是否被盗用,通过登录信息中的ip和当前请求的ip比较
  6. 传递登录信息给后续服务,后续各服务就不用再去解析了
  7. 放行

十五、添加购物车流程

  1. 获取用户的登录信息:登录取 userId,未登录取 userkey
  2. Map<UserId/userKey,Map<skuId, cartJson>> 根据外层的key获取内层的map结构
  3. 判断购物车里是否包含该商品
  4. 如果包含则更新数量
  5. 如果不包含则新增购物车
  6. 缓存实时价格
  7. 将购物车信息缓存到 Redis

十六、查询购物车流程

  1. 查询未登录的购物车,查询购物车时,查询实时价格缓存
  2. 判断是否登录,为登录则直接返回
  3. 如果已经登录,则进行合并购物车的操作
    1. 获取登录状态的购物车
    2. 判断是否存在未登录状态的购物车,有则遍历未登录的购物车合并到已登录的购物车中
    3. 判断登录状态购物车是否存在该商品有就直接更新,没有则新增
  4. 合并完未登录的购物车之后,要删除未登录的购物车
  5. 查询登录状态所有购物车信息,查询购物车时,查询实时价格缓存

十七、分布式定时任务 xxl-job

  1. 搭建调度中心
    1. 把doc/db/tables_xxl_job.sql导入到mysql
    2. 修改调度中心的配置文件:端口号、数据源、accessToken
    3. 打包:mvn clean package -Dmaven.skip.test=true
    4. 运行:java -jar xxl-job-admin.xxx.jar
    5. 集群:1.DB一致 2.系统时间一致 3.nginx作负载均衡
  2. 搭建执行器工程,定义任务
    1. 引入依赖:xxl-job-core
    2. 修改执行器配置:端口号、调度中心地址、accessToken、appName、日志目录
    3. java 配置:XxlJobConfig.java
    4. 定义任务
  3. 在调度中心配置任务
    1. 配置执行器
    2. 配置任务
    3. 运行,查看日志

十八、添加订单的流程

  1. 防重,OrderToken 不能为空,也不能重复提交订单
  2. 验证限购数
  3. 验总价:页面总价格 和 数据库实时总价
  4. 验库存并锁库存(原子性)
  5. 创建订单,远程调用 oms 保存订单的接口
  6. 如果订单创建失败,立发送消息马释放库存
  7. 订单创建成功,发送延时消息,将来定时关单并且解库存
  8. 订单创建成功,发送延时消息,将来定时解锁库存
  9. 订单创建成功,发送消息异步删除购物车中对应的商品
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三份强势七分暖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值