当前位置: 首页 > news >正文

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提示词技巧&#xff0c;使用教程&#xff0c;国内版官网直达&#xff0c;非套壳 主站点&#xff1a;https://chatgpt-plus.top&#xff08;江苏福建地区打不开&#xff0c;需要魔法&#xff09; 店铺地址&#xff1a;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集群&#xff0c;发现在其中一套k8s环境中&#xff0c;在Pod内无法访问Service Name&#xff0c;访问了很多次&#xff0c;偶尔又能通&#xff0c;使用Service的IP能正常访问&#xff0c;域名解析的问题基本确定与CoreDNS有关系&#xff0c;于是开始了一系列…...

【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 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大数据的电影市场预测分析系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

消息传递与集成:使用Springboot进行异步通信

消息传递与集成&#xff1a;使用Spring Boot进行异步通信 在现代的分布式系统中&#xff0c;异步通信已经成为了一种常见的设计模式。通过使用消息队列和事件驱动架构&#xff0c;我们可以实现系统之间的解耦&#xff0c;提高系统的可扩展性和可靠性。本文将介绍如何使用Sprin…...

【论文速读】Transformer:Attention Is All You Need

Transformer&#xff1a;Attention Is All You Need 摘要模型架构注意力模型Scaled Dot-ProductMulti-Head Attention Position-wise Feed-Forward NetworksEmbeddings and SoftmaxPositional Encoding 摘要 我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xf…...

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

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

二元关系表示

一、二元关系的定义和表示 什么是二元关系&#xff1f;对集合A和B&#xff0c;A\timesB的任意子集R为A到B的一个二元关系。当AB时&#xff0c;A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下&#xff0c;二元关系可简称关系。 若|A|m,|B|n&#xff0c;则A到…...

Android Audio基础——AudioFlinger音频流管理(八)

从前面 AudioTrack、PlaybackThread、输出流设备三者的关系中,我们看到 AudioTrack 把音频流数据送入到对应的 PlaybackThread 中,那么应用进程是如何控制音频流的开始播放 start()、停止播放 stop()、暂停播放 pause()。这一章节我们就来继续分析。 一、音频流管理 应用进程…...

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd &…...

linux创建私有docker仓库以及推拉

创建私有仓库&#xff1a; 1.下载 registry镜像。 2.执行 registry 镜像&#xff08;#为注释内容&#xff0c;\为换行&#xff09;&#xff1a; docker run -d \# --restartalways每次都是开机自动启动--restartalways \# --name registry 表示容器名--name registry \# 表示…...

如何将照片从 iPhone 传输到闪存驱动器【无质量损坏】

概括 人们喜欢用 iPhone 拍照&#xff0c;因为照片通常都很漂亮&#xff0c;这都要归功于 iPhone 令人惊叹的技术。但照片更新后会占用更多空间&#xff0c;并且您可能会开始收到没有存储空间的通知。因此&#xff0c;您可以将照片传输到 USB 驱动器&#xff0c;然后从 iPhone…...

【MySQL精通之路】InnoDB(7)-锁和事务模型(2)-事务模型

主博客&#xff1a; 【MySQL精通之路】InnoDB(7)-锁和事务模型-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(7)-锁和事务模型(1)-锁-CSDN博客 下一篇&#xff1a; 目录 1.事务隔离级别 2.1 可重复读 2.2 读已提交 2.3 读取未提交 2.4 序列化读 2.自动提交、…...

python中的可哈希和不可哈希

python 中的每一个对象都有一个哈希值&#xff0c;哈希值是一个固定长度的整数&#xff0c;它通常用于快速比较对象的相等性。 如果在对象的生命周期里该对象的哈希值从未改变&#xff0c;那么这个对象是可哈希的&#xff08;hashable&#xff09;&#xff0c;也称为不可变的。…...

docker命令详解大全

Docker是一种流行的容器化平台&#xff0c;用于快速部署应用程序并管理容器的生命周期。以下是一些常用的Docker命令及其用途的概述&#xff1a; docker run&#xff1a;创建一个新容器并运行一个命令。docker ps&#xff1a;列出当前运行的容器。docker stop&#xff1a;停止…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...