谷粒商城项目总结
一、网关服务+Nginx反向代理(域名代理)
1.路由分发

- 修改宿主机的 hosts 文件,用域名映射虚拟机的IP地址
- Nginx 监听80端口,使用域名代理宿主机的网关8888端口号
- 网关服务区路由微服务路径
- 浏览器使用域名访问微服务成功
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)
- 根据id查询sku信息
- 根据三级分类id查询一二三级分类
- 根据品牌id查询品牌
- 根据skuId查询sku
- 根据skuId查询sku所有图片
- 根据skuId查询sku的所有营销信息
- 根据skuId查询sku的库存信息
- 根据spuId查询spu下的所有销售属性
- 根据skuId查询sku下的所有属性
- 查询spu下skuId及销售属性的关系
- 根据spuId查询spu的描述信息
- 查询组及组下参数和值
九、CompletableFuture异步调用
| 方法不以Async结尾 | 同步执行 |
|---|---|
| 方法以Async结尾 | 异步执行 |
| runAsync | 不支持返回值、异步 |
| supplyAsync | 可以支持返回值、异步 |
| whenComplete | 处理计算结果,同步 |
| whenCompleteAsync | 处理计算结果,异步 |
| exceptionally | 当异常时才会执行,处理异常情况 |
| thenApply | 获取上一个任务的返回结果,也有自己的返回结果集 |
| thenAccept | 获取上一个任务的返回结果,但是没有自己的结果 |
| thenRun | 既不获取上一个任务的返回结果,也没有自己的结果 |
| allOf | 等待所有任务完成 |
| anyOf | 只要有一个任务完成 |
十、JWT 实现无状态登录

- 当客户端第一次发送请求时,服务端会对用户进行验证(登录)
- 认证通过后,会根据 secret 生成 token
- 将生成的 token 返回给浏览器,作为登录的凭证
- 用户以后的每次请求都会携带 token
- 服务端利用公钥解析 token 中的 jwt ,校验签名有效后,从 Payload 中获取用户信息
- 处理请求,返回响应结果
十二、完成登录功能
- 客户端携带用户名和密码请求登录,并携带当前页的路径
- 授权中心调用用户中心接口,查询用户是否存在
- 如果不存在,则提示用户名或密码错误
- 如果存在则生成 jwt ,jwt 要放盗取
- 把 jwt 放入 cookie
- 为方便展示,向 cookie 中单独写入昵称
- 重定向回到登录前的页面
十三、局部过滤器的实现流程
- 编写一个实现类实现 GatewayFilterFactory 接口,推荐继承 AbstractGatewayFilterFactory 基类,泛型为 step3 的实体类
- 配置过滤器,实现具体的拦截业务,见题十四
- 定义一个静态内部实体类,多个参数定义集合字段
- 重写父类的无参构造方法,调用 super(step3 的实体类)
- 重写 shortcutFieldOrder 方法(定义多个参数的执行顺序)
- 需要重写 shortcutType 方法返回 ShortcutType.GATHER_LIST
十四、局部过滤器拦截登录状态业务分析
- 判断拦截请求是否在拦截名单中,不在则直接放行
- 获取请求中的 token ,同步请求从cookie中获取,异步请求从header中获取
- 判断 token 是否为空,为空直接拦截
- 不为空就解析 jwt 获取登录信息,解析异常也直接拦截
- 判断是否被盗用,通过登录信息中的ip和当前请求的ip比较
- 传递登录信息给后续服务,后续各服务就不用再去解析了
- 放行
十五、添加购物车流程
- 获取用户的登录信息:登录取 userId,未登录取 userkey
- Map<UserId/userKey,Map<skuId, cartJson>> 根据外层的key获取内层的map结构
- 判断购物车里是否包含该商品
- 如果包含则更新数量
- 如果不包含则新增购物车
- 缓存实时价格
- 将购物车信息缓存到 Redis
十六、查询购物车流程
- 查询未登录的购物车,查询购物车时,查询实时价格缓存
- 判断是否登录,为登录则直接返回
- 如果已经登录,则进行合并购物车的操作
- 获取登录状态的购物车
- 判断是否存在未登录状态的购物车,有则遍历未登录的购物车合并到已登录的购物车中
- 判断登录状态购物车是否存在该商品有就直接更新,没有则新增
- 合并完未登录的购物车之后,要删除未登录的购物车
- 查询登录状态所有购物车信息,查询购物车时,查询实时价格缓存
十七、分布式定时任务 xxl-job
- 搭建调度中心
- 把doc/db/tables_xxl_job.sql导入到mysql
- 修改调度中心的配置文件:端口号、数据源、accessToken
- 打包:mvn clean package -Dmaven.skip.test=true
- 运行:java -jar xxl-job-admin.xxx.jar
- 集群:1.DB一致 2.系统时间一致 3.nginx作负载均衡
- 搭建执行器工程,定义任务
- 引入依赖:xxl-job-core
- 修改执行器配置:端口号、调度中心地址、accessToken、appName、日志目录
- java 配置:XxlJobConfig.java
- 定义任务
- 在调度中心配置任务
- 配置执行器
- 配置任务
- 运行,查看日志
十八、添加订单的流程
- 防重,OrderToken 不能为空,也不能重复提交订单
- 验证限购数
- 验总价:页面总价格 和 数据库实时总价
- 验库存并锁库存(原子性)
- 创建订单,远程调用 oms 保存订单的接口
- 如果订单创建失败,立发送消息马释放库存
- 订单创建成功,发送延时消息,将来定时关单并且解库存
- 订单创建成功,发送延时消息,将来定时解锁库存
- 订单创建成功,发送消息异步删除购物车中对应的商品
本文详细总结了谷粒商城项目的实现过程,包括网关服务与Nginx反向代理、商品业务分析、分布式事务Seata、Elasticsearch集成、RabbitMQ应用、Redis分布式锁、商品详情页接口、CompletableFuture异步调用、JWT无状态登录、登录功能实现、局部过滤器、购物车流程、分布式定时任务Xxl-Job以及订单创建流程等关键模块的技术实践。

1万+

被折叠的 条评论
为什么被折叠?



