微服务雪崩问题、Sentinel(请求限流、线程隔离、服务熔断)、Seata分布式事务

news2024/12/25 9:06:26

文章目录

  • 前言
  • 一、微服务保护
  • 二、Sentinel
    • 2.1 微服务整合
    • 2.2 簇点链路
    • 2.3 请求限流
    • 2.4 线程隔离
    • 2.5 服务熔断
  • 三、分布式事务
    • 3.1 Seata
      • 3.1.1 Seata架构
      • 3.1.2 部署TC服务
      • 3.1.3 微服务集成Seata
    • 3.2 XA模式
    • 3.3 AT模式


前言

微服务之间为什么会雪崩?怎么解决雪崩问题?
如何采用Sentiel整合微服务实现请求限流、线程隔离以及服务熔断问题。
怎么集成Seata解决微服务之间引发的分布式事务问题?


一、微服务保护

在这里插入图片描述
在这里插入图片描述
1、请求限流
限制访问微服务的请求的并发量,避免服务因流量激增出现故障。
在这里插入图片描述
2、线程隔离
舱壁模式,模拟船舱隔板的防水原理。通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散。
例如:查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致购物车服务级联失败,我们可以把购物车业务中查询商品的部分隔离起来,限制可用的线程资源,即便商品服务出现故障,最多导致查询购物车业务故障,并且可用的线程资源也被限定在一定范围,不会导致整个购物车服务崩溃。
在这里插入图片描述

3、服务熔断
由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。
熔断期间,所有请求快速失败,全都走fallback逻辑。
在这里插入图片描述

4、失败处理
给业务编写一个调用失败时的处理的逻辑,称为fallback。当调用出现故障(比如无线程可用)时,按照失败处理逻辑执行业务并返回,而不是直接抛出异常。
在这里插入图片描述

二、Sentinel

Sentinel是阿里巴巴开源的一款服务保护框架。
在这里插入图片描述

2.1 微服务整合

1、引入sentinel依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置控制台。

spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8090  #访问地址

3、访问微服务块的任意断点,如访问查询购物车接口,sentinel的客户端就会将服务访问的信息提交到sentinel-dashboard控制台

2.2 簇点链路

单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径。
打开Sentinel的请求方式前缀,把请求方式 + 请求路径作为簇点资源名。
在这里插入图片描述

2.3 请求限流

在簇点链路后面点击流控按钮,即可对其做限流配置。
簇点资源的流量限制在了每秒6个,也就是最大QPS为6.在这里插入图片描述

2.4 线程隔离

解决服务故障
实现步骤
1、OpenFeign整合Sentinel,为了开启远程调用feignclient作为簇点,可以被流量监控。

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

2、配置线程隔离
在这里插入图片描述

2.5 服务熔断

请求失败不应该抛异常,为了让用户体验更好,可以返回一些默认数据或者友好提示,查询失败设置一个降级处理逻辑。
对于这种不太健康的接口,应该直接停止调用,避免影响到当前服务。也就是将接口熔断。
实现步骤
1、编写降级逻辑
给FeignClient编写失败后的降级逻辑两种方式:

  • 方式一:FallbackClass,无法对远程调用的异常做处理
  • 方式二:FallbackFactory,可以对远程调用的异常做处理,我们一般选择这种方式。
    步骤1:定义一个降级处理类ItemClientFallback,实现FallbackFactory。
@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);
                // 查询购物车允许失败,查询失败,返回空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                // 库存扣减业务需要触发事务回滚,查询失败,抛出异常
                throw new BizIllegalException(cause);
            }
        };
    }
}

步骤2:编写一个配置类,在配置类中将ItemClientFallback注册为一个Bean。

public class DefaultFeignConfig {
    @Bean
    public Logger.Level feginLogLevel(){
        return Logger.Level.FULL;
    }
    @Bean
    public ItemClientFallbackFactory itemClientFallbackFactory(){
        return new ItemClientFallbackFactory();
    }
}

步骤3:在ItemClient接口中使用ItemClientFallbackFactory

@FeignClient(value = "item-service",
        fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {...}

2、服务熔断
由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
断路器的工作状态切换有一个状态机来控制
在这里插入图片描述

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态持续一段时间后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
    • 请求成功:则切换到closed状态
    • 请求失败:则切换到open状态
      点击控制台中簇点资源后的熔断按钮,即可配置熔断策略
      在这里插入图片描述
  • RT超过200毫秒的请求调用就是慢调用
  • 统计最近1000ms内的最少5次请求,如果慢调用比例不低于0.5,则触发熔断
  • 熔断持续时长20s

三、分布式事务

如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。
在这里插入图片描述

3.1 Seata

参与事务的多个分支事务互相无感知,不知道彼此的执行状态。找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。
在这里插入图片描述

3.1.1 Seata架构

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
    在这里插入图片描述

3.1.2 部署TC服务

TC服务是事务协调中心,是一个独立的微服务,需要单独部署。
基于数据库持久化存储,采用docker部署seata
具体部署不做说明。

3.1.3 微服务集成Seata

参与分布式事务的每一个微服务都需要集成Seata
实现步骤
1、引入依赖
为了方便各个微服务集成seata,需要把seata配置共享到nacos

<!--统一配置管理-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <!--读取bootstrap文件-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <!--seata-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  </dependency>

2、在nacos中配置seata
在这里插入图片描述
3、在微服务中添加bootstrap.yaml文件,定义nacos配置信息。
4、添加数据库表。seata的客户端在解决分布式事务的时候需要记录一些中间数据,保存在数据库中。要讲数据库表分别导入不同的微服务当中。
5、测试分布式事务
在订单业务方法上的@Transactional注解改为Seata提供的**@GlobalTransactional**
@GlobalTransactional注解就是在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。

3.2 XA模式

Seata支持四种不同的分布式事务解决方案: XA、TCC、 AT、SAGA
XA 规范描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范提供了支持。
A是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。
在这里插入图片描述优点

  • 事务的强一致性,满足ACID原则
  • 常用数据库都支持,实现简单,并且没有代码侵入

缺点:

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

seata中实现XA
1、Nacos中的共享shared-seata.yaml配置文件中设置

seata:
  data-source-proxy-mode: XA

2、@GlobalTransactional标记分布式事务的入口方法

3.3 AT模式

Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。
在这里插入图片描述
流程图
在这里插入图片描述AT模式与XA模式最大的区别是什么?
XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
XA模式强一致;AT模式最终一致

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 &#xff08;一&#xff09;Supabase&#xff08;二&#xff09;Realtime&#xff08;消息&#xff09;&#xff08;2.1&#xff09;Python 消息订阅&#xff08;2.2&#xff09;JavaScript 消息订阅 &#xff08;三&#xff09;Storage&#xff08;存储&#xff09;&…

如何撰写EI会议的投稿信?

撰写EI会议的投稿信&#xff08;Cover Letter&#xff09;是向会议组织者介绍你的论文和研究工作的一个重要环节。以下是撰写投稿信的一些关键步骤和建议&#xff1a; 投稿信的结构 信头 你的信息&#xff1a;包括姓名、职位、单位名称、通讯地址、电子邮件和电话号码。日期&am…

LeetCode198:打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存…

【论文笔记】Layer-Wise Weight Decay for Deep Neural Networks

Abstract 本文为了提高深度神经网络的训练效率&#xff0c;提出了逐层权重衰减(layer-wise weight decay)。 本文方法通过逐层设置权重衰减稀疏的不同值&#xff0c;使反向传播梯度的尺度与权重衰减的尺度之比在整个网络中保持恒定。这种设置可以避免过拟合或欠拟合&#xff0…

完全匹配企业需求的替代FTP升级软件怎么找

企业在处理数据传输时&#xff0c;效率和安全性是关键。尽管传统的FTP曾被广泛采用&#xff0c;但因其传输慢、安全性不足和难以管理等问题&#xff0c;已不再满足现代企业的需求。许多企业正在寻找能够满足其需求的FTP替代方案&#xff0c;但市场上选择众多&#xff0c;找到合…

设计模式使用(成本扣除)

前言 名词解释 基础名词 订单金额&#xff1a;用户下单时支付的金额&#xff0c;这个最好理解 产品分成&#xff1a;也就是跟其他人合做以后我方能分到的金额&#xff0c;举个例子&#xff0c;比如用户订单金额是 100 块&#xff0c;我方的分成是 80%&#xff0c;那么也就是…

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

小恐龙跳一跳源码

小恐龙跳一跳源码是前两年就火爆过一次的小游戏源码&#xff0c;不知怎么了今年有火爆了&#xff0c;所以今天就吧这个源码分享出来了&#xff01;有喜欢的直接下载就行&#xff0c;可以本地单机直接点击index.html进行运行&#xff0c;又或者放在虚拟机或者服务器上与朋友进行…

基于RV1126的AI网络摄像机AHD、CVBS、HDMI接口的区别有哪些?支持8路AHD摄像头,支持AI实时分析

网络摄像机AHD、CVBS、HDMI接口的区别有哪些&#xff1f;应用场景有哪些&#xff1f; AHD、CVBS和HDMI是不同的视频传输接口&#xff0c;分别适用于不同的应用场景。下面是它们的主要应用场景&#xff1a; 1.AHD&#xff08;Analog High Definition&#xff09;&#xff1a;A…

Nextjs 动态路由获取参数

目录 一、创建page目录下的路由文件 二、通过useRouter来获取动态参数 先看官方文档&#xff1a;Routing: Dynamic Routes | Next.js 使用Nextjs13版本参考官方文档后实现仍有问题&#xff0c;网上的材料大多和官网一致&#xff0c;经过测试后&#xff0c;我找到了这个解决方…

【Linux】用户级缓冲区

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【linux】详解linux权限

目录 用户 文件属性 更改文件权限 更改文件拥有者 更改文件所属组 用户的权限 文件掩码 粘滞位 总结 基本指令可参考&#xff1a; 【linux】详解linux基本指令-CSDN博客 【linux】详解linux基本指令-CSDN博客 用户 超级用户&#xff08;root&#xff09;&#xff…

【C++算法】BFS解决多源最短路问题相关经典算法题

1.01矩阵 既然本章是BFS解决多源最短路问题&#xff0c;也就是说有若干个起点&#xff0c;那我们就可以暴力一点&#xff0c;直接把多源最短路径问题转化成若干个单源最短路径问题&#xff0c;然后将每次的步数比较一下&#xff0c;取到最短的就是最短路径的结果&#xff0c;这…

安卓部署ffmpeg全平台so并实现命令行调用

安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so 第四章 部署ffmpeg安卓全平台so并使用&#xff08;本章&#xff09; 文章目录 安卓 FFmpeg系列前言一、添加so1、拷贝ffmpeg到项目2、bu…

华为CE6851-48S6Q-HI升级设备版本及补丁

文章目录 升级前准备工作笔记本和交换机设备配置互联地址启用FTP设备访问FTP设备升级系统版本及补丁 升级前准备工作 使用MobaXterm远程工具连接设备&#xff0c;并作为FTP服务器准备升级所需的版本文件及补丁文件 笔记本和交换机设备配置互联地址 在交换机接口配置IP&#…

文件传输服务应用1——java集成smb2/3实现文件共享方案详细教程和windows共享服务使用配置

在实际项目开发过程中&#xff0c;读取网络资源或者局域网内主机的文件是必要的操作和需求。而FTP&#xff08;文件传输协议&#xff09;和SMB&#xff08;服务器消息块&#xff09;是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点&#xff0c;但同…

3DMax

先转换为可编辑多边形 按“1”选择为点&#xff0c;点击目标焊接&#xff08;CtrlShiftw&#xff09;&#xff0c;然后点击一个顶点拉到另一个定点上&#xff1b; 选择一个面&#xff0c;点击塌陷&#xff08;CtrlAltC&#xff09;&#xff0c;四点合并为一个点&#xff1b; …

Ai指令-公众号内训课:学会ai指令+公众号的底层逻辑(7节课)

课程目录 第一课:详解公众号的流量机制.mp4 第二课:快速搞定公众号号设化装修.mp4 第三课:一期学员直呼牛X的课程&#xff0c;正确的爆文利用姿势.mp4 第五课:颗粒度级别拆解AI公众号爆文.mp4 第六课:AI提示词进阶技巧课。提示词自动化.mp4 第七课.实操演示提示词撰写工作…

element-ui输入框和多行文字输入框字体不一样解决

element-ui的type"textarea"的字体样式与其他样式不同 <el-input type"textarea"></el-input> <el-input ></el-input>设置&#xff1a; .el-textarea__inner::placeholder {font-family: "Helvetica Neue", Helvetic…

GPIO模拟spi时序点亮数码管

目录 spi.h spi.c main.c 实验效果 spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"//spi初始化 void spi_init(); //spi写入数据 void spi_write(unsigned char data);#endif spi.c #include…