SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级
一、微服务保护

1.雪崩问题


如何做好后备方案就是后续:
2.雪崩解决方案


某一个服务的线程是固定的,出现故障线程占满后,就不会让取调用这个服务,对其他服务就没有影响。



3.Sentinel
①初识Sentinel

配置过程:
day05-服务保护和分布式事务 - 飞书云文档 (feishu.cn)
先搭建sentinel,下载Jar包cmd运行,访问网页控制台;
再项目引入依赖,配置地址。


这样设置后就会根据请求方式和请求路径监控接口:比如这里Get,Put是相同路径不同请求方式,也被监控到了
②请求限流


QPS每秒钟请求的数量
填好后就可以限流了:
③线程隔离

在购物车功能中,如果不设置线程隔离,当查询购物车功能并发高了耗尽TomCat资源后,修改购物车商品数量也会收到影响。设置查询购物车功能的并发线程数后,查询不行,但修改不影响。
④Fallback

设置enabled为true后就会看到carts产生了子路簇点

采用方式二



⑤服务熔断
熔断就是根据异常比例,慢请求比例,达到一定值就会拒绝去到fallback

切换熔断或者不熔断的原理

响应超过最大RT就是慢比例,熔断时长是熔断时间多久,最小请求数是请求多少次看比例是否达到,统计时长就是最小请求数在这个时间范围内

二、分布式事务
1.认识分布式事务


2.Seata

分布式事务解决思路

TM会告诉TC全局事务开始和结束,到结束RM会报告状态,只有全部正常才会提交

3.部署TC服务
day05-服务保护和分布式事务 - 飞书云文档 (feishu.cn)
部署需要准备tc数据库,准备配置文件,然后下载镜像,docker再部署
4.微服务集成Seata

由于Seata不知道你是否是Spring项目,就必须根据nacos一个服务放置规则去写配置,来找到TC服务地址

将这个配置文件发布到nacos
然后让需要分布式事务的微服务拉取这个共享配置

引入依赖:
5.XA模式

sql等待提交会有性能的问题

修改配置,这个配置在nacos中

6.AT模式
是直接提交,但是在提交前会快照,保存提交前的数据库内容,如果失败从快照中回滚

会出现短暂的数据不一致,在回滚前

实现步骤:

添加注释在前面已经加了
三、RabbitMQ

同步通信,要一步一步等待上一步完成才能开始
1.初识MQ
①同步调用

同步调用存在一些问题
这里用户服务扣减余额到下面的服务应该得同步调用,只有扣减余额成功才能有后续操作,后续操作的前提都是只要余额扣除成功就可以执行,所以应该都异步调用,让他们可以一起工作。
②异步调用

发送者发送消息交给消息代理就可以不管了

故障隔离的原理是我把消息给消息代理了就不管了,消息代理会一直发送消息给你,你出现故障了,也会一直给你发消息,直到你能处理好之后停止。
流量削峰是说我消息代理可以把所有请求拦截住,后续微服务可以根据自己的能力去消息代理那里取多少来进行处理。

时效性要求高,需要拿到结果才能处理就使用同步调用
对调用后的结果不关心,性能要求高就采用异步调用
③MQ技术选型
Kafka大数据采用

2.RabbitMQ
①安装部署
day06-MQ基础 - 飞书云文档 (feishu.cn)
只需要拉取镜像,部署容器

②快速入门

创建队列,填名字就可以;让交换机和队列绑定关系,才能投递消息
③数据隔离
虚拟主机可以让不同MQ隔离开
创建用户:
登录自己的用户后不能操作别的用户创建的交换机和队列
创建虚拟主机:就可以在这个属于该用户的虚拟主机中进行创建交换机和队列了
3.Java客户端
①快速入门

Rabbit可以使用AMQP消息协议




②Work Queues

多个消费者怎么消费队列的消息?
队列中的一个消息只能被一个消费者消费,很多消息的时候就会均匀分配给消费者,类似轮询的规则
这种规则但是没有考虑消费者处理消息的速度,可能A消费者处理完了,B消费者还没处理完导致整体速度降低
所以可以设置:


③Fanout交换机


交换机的存在可以让发布者发送一次消息,调用不同的微服务,只需要每个微服务去绑定一个队列,然后这些队列去绑定交换机


这里发送的API有三个参数,第二个队列填空或空字符
④Direct交换机

类似于给队列添加标签,发送者添加第二个参数,标签对应的队列才会接收到交换机的消息

一个队列可以添加多个标签

发送红色都收得到,发黄色只有二能收到

⑤Topic交换机

队列1只关注以china.开头的消息,队列2只关注以japan.开头的消息,一个队列就可以绑定多个消息


⑥声明队列交换机
手工添加交换机和队列会出现错误

这个configuration配置类编写在消费者中,因为发送者只关心发送消息与否,消费者关心从哪里拿消息。


这里要绑定多个routingKey的话,就要返回多个bean。

Javabean绑定方式代码冗杂
注解:就很方便

⑥消息转换器


这样使用Json序列化的话传入一个对象,监听也可以拿到这个对象。
4.业务改造

支付服务是发送者,交易服务是消费者
步骤:
1.引入依赖

2.设置MQ地址配置

3.设置转换器配置,由于这个配置类所有需要MQ的都会需要,所以设置在common中

让可以被扫描到

4.在消费者中编写监听代码

5.在发送者编写发送代码

使用try/catch就不会影响主程序了

四、MQ高级
MQ高级功能就是确保消息能够正确收发
1.发送者的可靠性
①发送者重连

以上配置是关于使用Spring Boot连接到RabbitMQ消息队列的设置。让我用通俗易懂的语言解释一下:
1. `connection-timeout: 1s`: 这是设置与 RabbitMQ 的连接超时时间。也就是说,如果在1秒内无法连接到 RabbitMQ,系统会超时并停止尝试连接。
2. `retry` 重试机制:
- `enabled: true`: 这表示开启了消息发送失败后的重试机制。也就是说,如果发送消息失败,系统会尝试重新发送消息,直到达到最大重试次数或成功为止。
- `initial-interval: 1000ms`: 这是在第一次失败后等待重新尝试的时间间隔。在第一次失败后,系统会等待1秒,然后再次尝试发送消息。
- `multiplier: 1`: 这是一个倍数,用于计算下一次重试的等待时间。每次失败后,系统会将 `initial-interval` 乘以这个倍数,以确定下一次等待的时间间隔。在这种情况下,下一次等待时间间隔仍然是1秒。
- `max-attempts: 3`: 这是设置的最大重试次数。如果消息发送失败并且重试次数已达到这个限制,则系统将停止尝试发送消息,并且可能需要采取其他措施来处理消息发送失败的情况。
②发送者确认

持久消息只有保存到磁盘中才算成功
只要配置正确,exchange和queue正确,nack只会MQ错误才会出现



一般不开启。
2.MQ的可靠性

①数据持久化
1.持久化就是放入磁盘中,内存中的内容会消息重启后
2.内存的空间有限,如果瞬间来了很多消息,它会满了后再向磁盘写入,这样会造成阻塞,如果是持久化消息,来一个会先进入内存然后写入磁盘一个,不会造成阻塞,效率更高。
交换机持久化,队列持久化,消息持久化


消息设置为PERSISTENT

②Lazy Queue
数据持久化会造成并发,同一时间处理消息量很高,Lazy Queue会降低同一时间处理消息量

不会存入内存中,直接到磁盘
会监控消费者处理消息的快慢,快就会提前缓存

声明队列可以配置configuration也可以加注解。


3.消费者的可靠性
①消费者确认机制

发现消息的内容有问题导致运行失败就返回reject

②失败重试机制

失败重试次数耗尽后策略有三种,默认第一种,不合适。


③业务幂等性
消费者处理好后返回ack中断开了和MQ的连接,会造成再次接受消息处理

一些任务是幂等的,多次接受消息不会有影响。
策略:发送者给消息添加id

消费者可以用message来监听消息

还要处理id的逻辑与业务无关,麻烦且影响性能



4.延迟消息
兜底方案

①死信交换机
利用死信交换机的机制实现了延迟消息的效果

创建normal.direct和normal.queue,并声明死信交换机

创建死信交换机和队列绑定

发送者这里设置了延迟时间,时间到未处理就会进入死信交换机

②延迟消息插件

部署过程:下载插件,上传插件,挂载到数据卷(进入数据卷的位置后执行命令)
day07-MQ高级 - 飞书云文档 (feishu.cn)
声明延迟交换机的方式:

发消息:
避免同一个时刻存在大量延迟消息,延迟依赖cpu中的时钟计时,过多会给CPU压力。
让延迟时间不要过长
③取消超时订单
原本程序创建订单功能,和支付功能在两个不同微服务:交易服务,支付服务
当用户下单后会生成订单,并且清理购物车,扣减库存。
之后会弹出等待用户支付的页面,用户支付成功后会调用交易服务中修改订单状态为已支付。
这就存在一个问题:如果用户一直未支付,交易服务处理失败,此时库存已经扣减,但未卖出,存在数据不一致。如果支付服务发送修改订单状态出现问题,已支付但未修改订单状态存在数据不一致。
此时使用延迟消息,交易服务生成订单后,会向自己发送延迟消息,查看订单状态,为未支付会修改库存等。


相关文章:
SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级
一、微服务保护 1.雪崩问题 如何做好后备方案就是后续: 2.雪崩解决方案 某一个服务的线程是固定的,出现故障线程占满后,就不会让取调用这个服务,对其他服务就没有影响。 3.Sentinel ①初识Sentinel 配置过程:day05-服…...
住宅IP?
住宅IP是由主要运营商(如电信、移动、联通等)为用户开通的宽带业务所分配的IP地址。这些IP地址是真实的、具有实际位置的IP,与普通用户的设备IP和宽带网络IP一致。它们不是连续的,而是散点分布,这使得它们在使用时更加…...
SpringBoot实现邮箱验证码
自行创建一个SpringBoot项目 导入SpringBoot所需要的邮箱验证码的包 <!--邮件发送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.6.1</version>…...
GPT提示词技巧,使用教程,国内版官网直达,非套壳
GPT提示词技巧,使用教程,国内版官网直达,非套壳 主站点:https://chatgpt-plus.top(江苏福建地区打不开,需要魔法) 店铺地址:https://buy.chatgpt-plus.top/ 选择plus账号进入&…...
MySQL多表关联查询习题
一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…...
Android正向开发实现客户端证书认证
前言 如果第三方模块被混淆,那hook方式均不能生效。这时就需要根据系统包去定位校验的函数,因此需要对安卓开发者是如何实现客户端证书校验的有一定了解,接下来就介绍这部分内容。 开发者实现客户端证书校验的本质是:证书/密钥 + 代码。 在形式上有:证书校验、公钥校验和…...
【Kubernetes】Pod无法访问Service域名问题排查
背景 部署过多套k8s集群,发现在其中一套k8s环境中,在Pod内无法访问Service Name,访问了很多次,偶尔又能通,使用Service的IP能正常访问,域名解析的问题基本确定与CoreDNS有关系,于是开始了一系列…...
【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程
🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1. 网络编程 1.1 概述 1.2 网络编程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和协议 1.3 UDP协议 1.3.1 UDP发送数据 1.3.2 UDP接收数据 1.4…...
基于python+Django大数据的电影市场预测分析系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
消息传递与集成:使用Springboot进行异步通信
消息传递与集成:使用Spring Boot进行异步通信 在现代的分布式系统中,异步通信已经成为了一种常见的设计模式。通过使用消息队列和事件驱动架构,我们可以实现系统之间的解耦,提高系统的可扩展性和可靠性。本文将介绍如何使用Sprin…...
【论文速读】Transformer:Attention Is All You Need
Transformer:Attention Is All You Need 摘要模型架构注意力模型Scaled Dot-ProductMulti-Head Attention Position-wise Feed-Forward NetworksEmbeddings and SoftmaxPositional Encoding 摘要 我们提出了一种新的简单的网络架构,Transformer…...
小短片创作-组装场景(一)
1、项目基础设置 通过第三人称模板,创建1个项目 1.自动曝光:关闭,因为要做专业的小短片,曝光需要手动控制。 2.扩展自动曝光中的默认亮度范围:启用 3.全局光照系统:选择屏幕空间光照(SSGI&am…...
二元关系表示
一、二元关系的定义和表示 什么是二元关系?对集合A和B,A\timesB的任意子集R为A到B的一个二元关系。当AB时,A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下,二元关系可简称关系。 若|A|m,|B|n,则A到…...
Android Audio基础——AudioFlinger音频流管理(八)
从前面 AudioTrack、PlaybackThread、输出流设备三者的关系中,我们看到 AudioTrack 把音频流数据送入到对应的 PlaybackThread 中,那么应用进程是如何控制音频流的开始播放 start()、停止播放 stop()、暂停播放 pause()。这一章节我们就来继续分析。 一、音频流管理 应用进程…...
二进制部署k8s集群 部署高可用master节点
目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 (1)k8s的数据存储中中心的搭建 etcd &…...
linux创建私有docker仓库以及推拉
创建私有仓库: 1.下载 registry镜像。 2.执行 registry 镜像(#为注释内容,\为换行): docker run -d \# --restartalways每次都是开机自动启动--restartalways \# --name registry 表示容器名--name registry \# 表示…...
如何将照片从 iPhone 传输到闪存驱动器【无质量损坏】
概括 人们喜欢用 iPhone 拍照,因为照片通常都很漂亮,这都要归功于 iPhone 令人惊叹的技术。但照片更新后会占用更多空间,并且您可能会开始收到没有存储空间的通知。因此,您可以将照片传输到 USB 驱动器,然后从 iPhone…...
【MySQL精通之路】InnoDB(7)-锁和事务模型(2)-事务模型
主博客: 【MySQL精通之路】InnoDB(7)-锁和事务模型-CSDN博客 上一篇: 【MySQL精通之路】InnoDB(7)-锁和事务模型(1)-锁-CSDN博客 下一篇: 目录 1.事务隔离级别 2.1 可重复读 2.2 读已提交 2.3 读取未提交 2.4 序列化读 2.自动提交、…...
python中的可哈希和不可哈希
python 中的每一个对象都有一个哈希值,哈希值是一个固定长度的整数,它通常用于快速比较对象的相等性。 如果在对象的生命周期里该对象的哈希值从未改变,那么这个对象是可哈希的(hashable),也称为不可变的。…...
docker命令详解大全
Docker是一种流行的容器化平台,用于快速部署应用程序并管理容器的生命周期。以下是一些常用的Docker命令及其用途的概述: docker run:创建一个新容器并运行一个命令。docker ps:列出当前运行的容器。docker stop:停止…...
PyCharm中如何快速取消pytest测试模式?5步搞定直接运行Python脚本
PyCharm中如何快速取消pytest测试模式?5步搞定直接运行Python脚本 作为Python开发者,我们经常需要在PyCharm中切换不同的运行模式。有时候,你可能只是想快速运行一个Python脚本,却发现PyCharm固执地以pytest模式执行,…...
React-Grid-Layout外部拖拽:从零构建可视化编辑体验
React-Grid-Layout外部拖拽:从零构建可视化编辑体验 【免费下载链接】react-grid-layout A draggable and resizable grid layout with responsive breakpoints, for React. 项目地址: https://gitcode.com/gh_mirrors/re/react-grid-layout 在构建现代Web应…...
如何用FanControl彻底告别电脑噪音?Windows风扇控制终极解决方案
如何用FanControl彻底告别电脑噪音?Windows风扇控制终极解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_T…...
PID调参翻车实录:STM32驱动编码电机时,P值过大为何电机啸叫还振荡?
PID调参实战:STM32编码电机啸叫与振荡问题深度解析 当你在深夜实验室里第一次听到电机发出刺耳的啸叫声,同时观察到示波器上速度曲线像过山车一样上下震荡时,那种既困惑又兴奋的感觉,相信每个做过电机控制的工程师都深有体会。这不…...
Qwen3.5-4B模型Matlab数据分析加速:模型调用与结果可视化
Qwen3.5-4B模型Matlab数据分析加速:模型调用与结果可视化 1. 引言:当科研遇上大模型 科研工作中最耗时的环节往往不是实验本身,而是数据处理和报告撰写。想象一下这样的场景:你刚完成一组复杂的实验,面对几十页的仪器…...
Pyrene-PEG-Sil,芘丁酸酯聚乙二醇三乙氧基硅烷,荧光特性对微环境变化高度敏感
一.名称英文名称:Pyrene-PEG-Silane,Pyrene-PEG-Sil,Py-PEG-Silane,Py-PEG-Sil中文名称:芘丁酸酯聚乙二醇三乙氧基硅烷,芘丁酸酯-PEG-三乙氧基硅烷分子量:1k,2k,3.4k&…...
从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能
从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端,目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwil…...
【回归儿童本位,重构专业底色】学前教育行业的深度思辨与价值坚守(二)
吕坤阳亲笔二、行业高质量发展的核心:回归儿童,摒弃功利化教育随着学前教育普惠政策的推进,行业规范化程度不断提升,但功利化、形式化的教育倾向依然存在,成为高质量发展的阻碍。部分幼儿园为迎合家长“抢跑”需求&…...
UDOP-large算力优化:FP16推理+FlashAttention加速UDOP-large响应速度
UDOP-large算力优化:FP16推理FlashAttention加速UDOP-large响应速度 1. 为什么你的UDOP-large模型跑得不够快? 如果你用过UDOP-large这个文档理解模型,可能会发现一个问题:处理文档图片的时候,有时候响应速度不够理想…...
千问3.5-2B快速部署:Docker镜像一键run,7860端口自动监听,无需端口映射配置
千问3.5-2B快速部署:Docker镜像一键run,7860端口自动监听,无需端口映射配置 1. 千问3.5-2B模型介绍 千问3.5-2B是Qwen系列的小型视觉语言模型,它能够同时理解图片和生成文本。这个模型特别适合需要结合视觉和语言理解的任务场景…...
