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压力。

让延迟时间不要过长

③取消超时订单

原本程序创建订单功能,和支付功能在两个不同微服务:交易服务,支付服务

当用户下单后会生成订单,并且清理购物车,扣减库存。
之后会弹出等待用户支付的页面,用户支付成功后会调用交易服务中修改订单状态为已支付。
这就存在一个问题:如果用户一直未支付,交易服务处理失败,此时库存已经扣减,但未卖出,存在数据不一致。如果支付服务发送修改订单状态出现问题,已支付但未修改订单状态存在数据不一致。

此时使用延迟消息,交易服务生成订单后,会向自己发送延迟消息,查看订单状态,为未支付会修改库存等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/330499.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小短片创作-组装场景(一)

1、项目基础设置 通过第三人称模板,创建1个项目 1.自动曝光:关闭,因为要做专业的小短片,曝光需要手动控制。 2.扩展自动曝光中的默认亮度范围:启用 3.全局光照系统:选择屏幕空间光照(SSGI&am…

P2P服务端模型配合 Tool.net P2pServerAsync 类使用

Tool.Net 支持的 P2P 服务器模型实例 说明服务器部分相关代码相关调用实例Tcp版本Udp版本 最后附一张思维图 说明 当前文章,仅是Tool.Net 开源库的一个缩影。本次更新V5.0版本以上提供支持。可以提供简单实现P2P功能用于业务开发。 服务器部分相关代码 完整代码&…

远程PLC、工控设备异地调试,贝锐蒲公英异地组网方案简单高效

北京宇东宁科技有限公司专门提供非标机电设备,能够用于金属制品的加工制造。设备主要采用西门子的PLC作为控制系统,同时能够连接上位机用于产量、温度、压力、电机运行数据的监控,以及工厂的大屏呈现需求。目前,客户主要是市场上的…

画图工具之PlantUML插件使用

文章目录 1 PlantUML插件1.1 引言1.2 什么是PlantUML1.3 PlantUML插件1.3.1 IntelliJ IDEA中插件1.3.2 VS Code中插件1.3.3 使用例子 1.4 PlantUML时序图语法1.4.1 声明参与者1.4.2 消息传递1.4.2.1 同步消息1.4.2.2 异步消息1.4.2.3 返回消息1.4.2.4 自调用 1.4.3 生命线&…

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后,再生成网表,导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中, 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…

自动化测试--利用pytest实现整条业务链路测试

​ 概述 前面一章讲解了单个接口的测试,但是实际项目中,因为权限和登录状态的限制,大部分接口没办法直接访问到,这时候我们想访问到一个系统的接口,就需要模拟用户登录拿到用户的token和所拥有的权限之后再将这些信息…

信号:MSK调制和GMSK调制

目录 一、MSK信号 1. MSK信号的第k个码元 2.MSK信号的频率间隔 3.MSK信号的相位连续性 3.1 相位路径 3.2初始相位ψk 4.MSK信号的产生 原理框图 5.MSK信号的频谱图 二、高斯最小频移键控(GMSK) 1.频率响应 2.GMSK调制产生方式 2.1 高斯滤波器法 2.2 正交调制器法…

Linux x86_64 UEFI 启动

文章目录 前言一、UEFI二、Disk device compatibility2.1 GPT 磁盘分区表2.1.1 简介2.1.2 Linux 2.2 ESP(EFI) 文件系统2.2.1 简介2.2.2 LinuxLinux Kernel EFI Boot Stub 三、UEFI GPT grub23.1 简介3.2 引导方式 3.3 BOOTX64.EFI3.4 shimx64.efi3.5 …

OpenMV学习笔记1——IDE安装与起步

目录 一、OpenMV IDE下载 二、OpenMV界面 三、Hello World! 四、将代码烧录到OpenMV实现脱机运行 五、插SD卡(为什么买的时候没送?) 一、OpenMV IDE下载 浏览器搜索OpenMV官网,进入后点击“立即下载”&#xff0…

市面上前 11 名的 Android 数据恢复软件

Android数据恢复软件是恢复无意中删除的文件或文件夹的必要工具。该软件还将帮助您恢复丢失或损坏的信息。本文介绍提供数据备份和磁盘克隆选项的程序,这些选项有助于在Android设备上恢复文件的过程。 如果您正在寻找一种有效的方法来恢复图像,文档&…

day16|二叉树的属性

相关题目 ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数 二叉树的深度与高度 如图, 二叉树的深度表示:任意一个叶子节点到根节点的距离,是从上往下计数的,因此使用前序遍历…

2024-5-24 石群电路-15

2024-5-24,星期五,22:15,天气:晴,心情:晴。今天最后一天上班,终于要放返校假啦,开心!!!!!!不过放假也不能耽误…

第2天 搭建安全拓展_小迪网络安全笔记

1.常见搭建平台脚本使用: 例如 phpstudy IIS Nginx(俗称中间件): 什么是中间件: 中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用&#…

汇编语言(STC89C52)

指令是计算机计算CPU根据人的意图来执行某种操作的命令。一台计算机所执行的全部指令的集合,称为这个CPU的指令系统。而想要使计算机按照人们的要求完成一项工作,就必须让CPU按顺序执行预设的操作,即逐条执行人们编写的指令。这种按照人民要求…

【vue部署】Apache部署vue项目

Apache部署vue项目 Apache 下载安装(windows)1. 下载2. 安装3. 启动服务 vue 部署配置1. 基础配置2. 解决页面刷新问题 Apache 下载安装(windows) 1. 下载 Apache 2.4.59 下载地址:httpd-2.4.59-240404-win64-VS17.zip Visual C Redistributable for Visual Studi…

Python-3.12.0文档解读-内置函数hash()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 功能描述 参数 返回值 特性 使用示例 注意事项 记忆策略 常用场景 …

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins,直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

掌握代码注释:提升代码可读性的秘密武器

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、为什么我们需要注释? 二、如何添加单行注释? 使用井号 # 添加单…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步(Master-Slave Replication)是一种常用的解决方案,它允许一个主服…

面试框架【面试准备】

前言 2023-9-12 12:12:04 2023-09-14 16:13:04 公开发布于 2024-5-22 00:16:21 以下内容源自《【面试准备】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平…