gulimal-谷粒商城学习笔记
文章平均质量分 86
__Simon'
如山间清爽的风,如古城温暖的阳光。
展开
-
订单服务篇-本地事务与分布式事务
文章目录一、本地事务1.事务的基本性质2.事务的隔离级别3.事务的传播行为二、分布式事务1.为什么会有分布式事务2.分布式事务基础1、CAP理论2、BASE理论3.分布式事务集中解决方案1、2PC模式(二阶提交)2、TCC补偿式事务-柔性事务3、可靠消息+最终一致性一、本地事务1.事务的基本性质数据库事务的几个特性:原子性(Atomicity)、一致性(Consistency)、隔离性/独立性(Isolation)和持久性(Durability),简称ACID原子性:一系列的操作整体不可拆分,要么原创 2021-07-22 14:41:17 · 263 阅读 · 0 评论 -
订单服务篇-使用Token机制解决接口幂等性
文章目录一、在何处使用二、怎么使用1.生成Token2.验证Token一、在何处使用二、怎么使用1.生成Token//防重复令牌String token = UUID.randomUUID().toString().replace("-", "");orderConfirmVo.setOrderToken(token);//保存到redis redisTemplate.opsForValue().set(OrderConstant.USER_ORDER_TOKEN_PREFIX+原创 2021-07-21 10:43:49 · 962 阅读 · 2 评论 -
订单服务篇-接口幂等性
文章目录一、什么是幂等性二、哪些情况需要防止三、什么情况下需要幂等四、幂等解决方案1、Token机制(1) 步骤(2) 危险性1.先删除Token还是先后删除Token2.Token获取、比较和删除必须是原子性2、各种锁机制1.数据库悲观锁2.数据库乐观锁3.业务层分布式锁3、各种唯一约束1.数据库唯一约束2.redis set防重4、防重表5、全局请求唯一id一、什么是幂等性接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。比如支付场景,用户购买原创 2021-07-19 15:26:49 · 1651 阅读 · 0 评论 -
订单服务篇-Feign远程调用丢失请求头和异步编排下丢失上下文
文章目录一、从购物车模块跳转订单模块二、跳转到结算页面需要先验证用户是否登录1.LoginUserInterceptor2.OrderWebConfiguration三、跳转到toTrade方法逻辑1.远程调用memberFeignService会员服务获取地址1.远程调用cartFeignService购物车服务获取购物项1.拦截器通过session获取不到用户2.追踪Feign远程调用源码1.丢失请求头2.原因3.解决方法一、从购物车模块跳转订单模块点击去结算会跳转到order模块中的/toTr原创 2021-06-24 14:31:34 · 671 阅读 · 1 评论 -
消息队列篇-可靠消息投递
文章目录一、生产者确认1、publisher-confirm-type2、publisher-returns3、测试发送消息1.正常发送2.测试到达交换机,没有到达队列二、消费者确认1.AUTO 自动确认2.NONE 不确认模式3.MANUAL 手动确认一、生产者确认在yml文件中配置:spring: rabbitmq: publisher-confirm-type: CORRELATED publisher-returns: truepublisher-confirm-type:原创 2021-06-22 18:09:50 · 764 阅读 · 0 评论 -
消息队列篇-简单使用
文章目录一、引入springboot-amqp启动器二、查看配置类RabbitAutoConfiguration三、AmqpAdmin1.配置gulimall-order模块的yml文件2.在启动类添加@EnableRabbit注解3.使用AmqpAdmin创建Exchange交换器4.使用AmqpAdmin创建Queue队列5.使用AmqpAdmin创建Binding绑定四、RabbitTemplate1.发送字符串纯文本消息2.发送对象消息1.默认序列化机制是jdk字节流2.修改RabbitMQ序列化机原创 2021-06-22 14:16:38 · 278 阅读 · 0 评论 -
消息队列篇-RabbitMQ四种交换器模式(Direct、Fanout、Topic、Header)
文章目录一、Direct模式1、创建四个不同名称的Queue2、创建direct类型的交换器exchange.direct3、将exchange.direct与四个Queue绑定4、给exchange.direct交换机发送消息5、接收到消息的队列simon.emps消费消息6、总结二、Fanout模式1.创建fanout类型的交换机exchange.fanout2.将exchange.fanout与四个Queue绑定3.给exchange.fanout发送消息4.队列列表查看消息5.总结三、Topic模式原创 2021-06-21 18:24:53 · 2008 阅读 · 0 评论 -
消息队列篇-消息队列简介与RabbitMQ安装
文章目录一、MQ简介1.消息队列架构2.消息队列特性3.AMQP和JMS4.常见的MQ产品二、RabbitMQ1.安装Erlang2.安装RabbitMQ2.读入数据总结一、MQ简介消息队列,即MQ,Message Queue。1.消息队列架构Producer:消息生产者,负责生产和发送消息到Broker;Broker:消息处理中心,负责消息存储、确认、重试等;Consumer:消息消费中心,负责从Broker中获取消息并处理。2.消息队列特性异步性:将耗时的同步任务通过发送消息的原创 2021-06-21 15:23:46 · 201 阅读 · 0 评论 -
注册登录篇-使用SpringSession进行分布式缓存
文章目录一、分布式session1.session原理2.分布式下session共享出现的问题3.分布式下session共享出现的问题1.session复制2.客户端存储3. Hash一致性4. Redis统一存储(最终选择)二、使用SpringSession整合Redis1.引入springsession和redis整合的依赖2.添加yml配置文件3.启动类添加@EnableRedisHttpSession注解4.登录后出现的问题1. gulimall.com没有Cookie2. auth.gulimal原创 2021-06-15 16:36:04 · 478 阅读 · 0 评论 -
注册登录篇-注册
文章目录一、新建gulimall-auth-sever服务二、新建视图跳转配置二、注册逻辑实现1.注册页面2.封装注册Vo3.JSR303校验后台传入数据4.发送短信验证码1.购买阿里云短信服务2.查看购买的短信服务接口文档3.编写发送验证码代码1.根据接口文档中java代码示例编写Component2.编写发送验证码Controller3.验证gulimall-third-party中短信是否能发送成功4.在gulimall-auth-server中编写短信发送代码5.编写远程调用的openFeign接口原创 2021-06-08 12:13:51 · 1414 阅读 · 2 评论 -
异步与线程池
文章目录一、初始化线程的4种方式二、new ThreadPoolExecutor()七大参数三、线程池运行任务的流程1.流程2.面试题四、常见的4种线程池五、CompletableFuture异步编排1.CompletableFuture创建异步对象2.计算完成时回调方法(whenComplete、exceptionally)3.handle方法4.线程串行化方法5.两任务组合(都要完成)一、初始化线程的4种方式继承Thread类实现Runnable接口实现Callable接口+FutureTa原创 2021-06-03 16:04:24 · 239 阅读 · 0 评论 -
缓存篇-SpringCache
文章目录一、SpringCache是什么?二、SpringCache简单使用(整合redis)1.引入依赖2.自动配置缓存源代码1.CacheAutoConfiguration2.自动配置RedisCacheConfiguration3.自定义配置缓存1.定义配置类,重新注入RedisCacheConfiguration2.改造三级分类缓存代码3.测试缓存是否起作用4.springCache注解的使用1.@Cacheable2.@CacheEvict4.springCache解决缓存失效问题1.缓存穿透2.原创 2021-05-28 16:53:56 · 491 阅读 · 0 评论 -
缓存篇-Redisson的使用
文章目录前言一、Redisson是什么?二、使用Redisson进行分布式锁改造1.引入pom依赖2.配置注入对象总结前言使用redisson进行redis客户端操作一、Redisson是什么?Redisson是一个在Redis的基础上实现的Java驻内存数据网络(In-Memory Data Grid)。不仅提供了一些列的分布式java常用对象,还提供了许多分布式服务。Redission提供了Redis最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离,集中精力在原创 2021-05-27 16:34:39 · 3008 阅读 · 0 评论 -
缓存篇-使用Redis进行分布式锁应用
文章目录前言一、redis分布式锁的原理二、使用redis进行分布式锁改造1.第一阶段1.使用setnx进行加锁2.出现的问题(死锁)2.第二阶段(解决第一阶段死锁问题)1.设置过期时间2.出现问题(设置key和过期时间不是原子性)3.解决key和过期时间不是原子性3.第三阶段(出现删锁问题)1.解决删掉其他线程锁的问题(指定值为uuid)2.出现问题(依然不是原子性删除)4.第四阶段(原子操作解决删锁问题)总结前言本地缓存的问题:每个微服务都得要有自己的缓存服务,数据更新时只能更新本服务的缓存 造成原创 2021-05-26 17:17:12 · 241 阅读 · 0 评论 -
缓存篇-Redis缓存失效以及解决方案
文章目录前言一、缓存穿透1.原因2.解决方案二、缓存雪崩1.原因2.解决方案三、缓存击穿1.缓存击穿和缓存雪崩的区别2.解决方案1.加synchronized(this)锁的问题2.加synchronized(this)锁的解决方案前言提示:redis改造商品服务一、缓存穿透1.原因缓存穿透是指缓存和数据库中都没有数据,用户不断发起请求,比如id卫负数或者id值特别大不存在的值,这时请求越过redis直接访问数据库,造成数据库压力过大。2.解决方案缓存空对象布隆过滤器mvc拦截二原创 2021-05-26 15:18:29 · 2672 阅读 · 0 评论 -
Nginx篇-Nginx配置动静分离
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、要干什么?二、怎么干1.在nginx中新建文件夹,上传到新建目2.修改nginx配置3.删除product代码模块下的静态资源4.修改product代码中html静态引入5.启动gateway,nginx,product进行测试一、要干什么?将商品模块的静态资源放入nginx中直接访问。二、怎么干1.在nginx中新建文件夹,上传到新建目在nginx安装目录下的html文件中新建static/index文件将pr原创 2021-05-25 18:11:53 · 178 阅读 · 0 评论 -
Nginx篇-springCloud配置Gateway+Nginx进行反向代理和负载均衡
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、要做什么?二、怎么做?1.安装并启动nginx1.安装nginx2.启动nginx3.解决80端口被占用4.再次启动nginx2.配置nginx做反向代理一、要干什么一、怎么干1.使用域名进行nginx访问2.使用域名访问2.配置nginx反向代理,将请求转发到商品服务3.重启nginx4.启动商品服务5.验证域名访问3.配置nginx+Gateway做反向代理和负载均衡一、要干什么二、怎么干1.在nginx.conf文件中原创 2021-05-25 12:01:43 · 7175 阅读 · 8 评论