Sentinel 学习02-隔离降级

隔离和降级

虽然限流可以尽量避免因高并发引起的服务·故障,但服务还会因为其他原因而故障。如果要将这些故障控制在一定的范围内,避免雪崩,就要靠线程隔离(舱壁模式)熔断降级来实现了。
在这里插入图片描述
不管是线程隔离还是熔断降级,都是对**客户端(调用方)**的保护
由于微服务中的服务远程调用,是通过Feign来实现的,由此引出Feign整合Sentinel

Feign整合Sentinel
相关依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

1.配置文件application.yml添加配置,开启feign的sentinel功能

feign:httpclient:enabled: true # 支持HttpClient的开关max-connections: 200 # 最大连接数max-connections-per-route: 50 # 单个路径的最大连接数sentinel:enabled: true # 开启feign对于sentinel的支持

2.给FeignClient的客户端,编写请求失败后的降级逻辑
FallbackClass,无法对远程调用的异常做处理
FallbackFactory,可以对远程调用的异常做处理,选择这种

实现FallbackFactory接口


@Slf4j
//实现FallbackFactory 接口,指定关联的客户端接口
public class UserClientFallBackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable throwable) {return new UserClient() {@Overridepublic User findById(Long id) {log.error("查询用户异常",throwable);return new User();}};}
}

配置类中注入bean

public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}//bean的注册@Beanpublic UserClientFallBackFactory userClientFallBackFactory(){return new UserClientFallBackFactory();}
}

@FeignClient注解中指定实现类

// 注解中指定
@FeignClient(value = "userservice",fallbackFactory = UserClientFallBackFactory.class)
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

重启服务,调用后,查看相关链路
在这里插入图片描述

线程隔离

线程隔离的两种方式实现:
线程池隔离与信号量隔离(Sentinel默认采用)
在这里插入图片描述
线程池隔离
优点:支持主动超时、支持异步调用
缺点:线程的额外开销比较大
场景:低扇出
什么是扇出?一个服务依赖于N个服务,N越多,扇出越高

信号量隔离
优点:轻量级、无额外的开销
缺点:不支持主动超时、不支持异步调用
场景:高频调用、高扇出

线程隔离(舱壁模式)
在添加限流规则时,选择线程数的阈值类型
在这里插入图片描述
线程数:该资源能够使用的tomcat线程数的最大值,也就是通过限制线程数量,实现舱壁模式。
功能演示
给 UserClient的查询用户接口设置流控规则,线程数不能超过 2。然后利用jemeter测试
控制台输出:
在这里插入图片描述
jemeter中没有异常,因为会走前面返回空用户的降级逻辑,所以没有抛出相关的异常
在这里插入图片描述

熔断降级

	熔断降级时解决雪崩问题的重要手段,其思路时由**断路器**统计服务调用的异常比例,慢请求的比例,如果超出阈值则会**熔断**该服务。即拦截访问该服务的一切请求,而**当服务恢复时,断路器会放行访问该服务的请求**。**实现原理:状态机**

在这里插入图片描述

熔断策略-慢调用
断路器熔断策略有三种:慢调用、异常比例、异常数
慢调用:业务的响应时长(RT) 大于指定时长的请求认定为慢调用请求。在指定的时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。
在这里插入图片描述
RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

演示
给 UserClient的查询用户接口设置降级规则**,慢调用的RT阈值为50ms**,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4熔断时长为5
增加业务耗时

    @GetMapping("/{id}")public User queryById(@PathVariable("id") Long id,@RequestHeader(value = "Truth", required = false) String truth)throws InterruptedException {System.out.println("truth: " + truth);if(id==1){//id=1 触发慢调用Thread.sleep(60);}return userService.queryById(id);}
}

降级规则
在这里插入图片描述

熔断后,去查询order为102的服务,查询用户返回空
在这里插入图片描述
超过熔断时长的时间范围后,又恢复
在这里插入图片描述
异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或者超过指定异常数),则触发熔断。

在这里插入图片描述
统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.4,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。
按照异常数的次数,设置熔断规则
在这里插入图片描述
演示
给 UserClient的查询用户接口设置降级规则,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4,熔断时长为5s
模拟异常

 @GetMapping("/{id}")public User queryById(@PathVariable("id") Long id,@RequestHeader(value = "Truth", required = false) String truth)throws InterruptedException {System.out.println("truth: " + truth);if(id==1){//id=1 触发慢调用Thread.sleep(60);}if(id==2){throw new RuntimeException("熔断策略--异常比例");}return userService.queryById(id);}

配置规则
在这里插入图片描述
访问order 103 触发熔断,返回空User
在这里插入图片描述

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

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

相关文章

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

详细分析Python中的read()、readline、readlines()方法

目录 前言1. read()2. readline()3. readlines()4. 彩蛋 前言 在Python中&#xff0c;可以使用open()函数来打开文件并读取其中的内容&#xff0c;然后使用不同的方法来处理文件内容 文件内容如下&#xff1a; This is a sample file. It contains some text. 码农研究僧1. …

shell基础实验(1)

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 1.1.安装邮件服务,配置邮件服务 [rootserver ~]# yum install mailx -y[rootserver ~]# vim /etc/mail.rc set from1580540058qq.com …

VB.NET常用的函数

常用的日期和时间函数 常用的转换函数 常用的字符串函数 如何连接数据库 在 VB.NET 中连接数据库&#xff0c;需要使用一个数据库连接对象&#xff0c;这个对象负责建立和管理与数据库的连接。最常见的数据库连接对象是 SqlConnection&#xff0c;它用于连接 SQL Server 数据库…

C#,入门教程(29)——修饰词静态(static)的用法详解

上一篇&#xff1a; C#&#xff0c;入门教程(28)——文件夹&#xff08;目录&#xff09;、文件读&#xff08;Read&#xff09;与写&#xff08;Write&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124231282 static 是编程高频词之一。 读了一…

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &#xff08;他们的视频后面一部分没再更新&#xff0c;看看前面也…

贝叶斯核机回归估计混合物健康效应 【BKMR包】——理论篇

贝叶斯核机器回归的简介 Bayesian Kernel Machine Regression (BKMR) 是一种贝叶斯非参数回归方法&#xff0c;用于建模和预测响应变量与预测变量之间的关系。在传统的回归模型中&#xff0c;通常假设响应变量与预测变量之间的关系是线性的&#xff0c;然而这种假设在实际问题中…

如何在 CentOS 上安装 ONLYOFFICE 文档 8.0

使用社区版&#xff0c;您可以在本地服务器上安装 ONLYOFFICE 文档&#xff0c;并将在线编辑器与 ONLYOFFICE 协作平台或其他热门系统集成在一起。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写…

嵌入式产品开发流程全解析

&#xff08;本文为简单介绍&#xff0c;内容来源于网络&#xff09; 嵌入式产品开发是一个涵盖硬件和软件的综合系统工程,其开发流程可以概括为需求分析、系统设计、软硬件开发与调试、产品验证和批量生产几大阶段。 需求分析阶段是开发流程的基础,主要对产品的硬件资源、软…

ElasticSearch之聚合aggs

写在前面 本文看下es的聚合相关内容。 1&#xff1a;什么是聚合 即&#xff0c;数据的统计分析。如sum&#xff0c;count&#xff0c;avg&#xff0c;min&#xff0c;max&#xff0c;分组等。 2&#xff1a;支持哪些聚合类型 2.1&#xff1a;bucket aggregation 对满足特…

C语言菜鸟入门·数组简介

目录 1. 简介 2. 声明数组 3. 初始化数组 3. 访问数组元素 4. 获取数组长度 5. 数组名 1. 简介 在 C 语言中&#xff0c;数组是一种用来存储相同类型数据元素的集合。数组提供了一种便捷的方式来管理一系列相同类型的数据&#xff0c;可以按照索引来访问和操作数组…

纯血鸿蒙来画龙!基于HarmonyOS ArkTS来操作SVG图片

大家好&#xff0c;龙年报喜&#xff0c;大地回春&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于龙年的祝福。本节将演示如何在基于HarmonyOS ArkTS的Image组件来实现画一条中国龙&#xff0c;祝大家“码”上“鸿”福到&#xff01; 本文涉及的所有源码&a…

船运物流管理系统|基于springboot船运物流管理系统设计与实现(源码+数据库+文档)

船运物流管理系统目录 目录 基于springboot船运物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、货运单管理 3、公告管理 4、公告类型管理 5、新闻管理 6、新闻类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 …

C++面试宝典第31题:有效的数独

题目 判断一个9 x 9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 1、数字1-9在每一行只能出现一次。 2、数字1-9在每一列只能出现一次。 3、数字1-9在每一个以粗实线分隔的3 x 3宫内只能出现一次。 下图是一个部分填充的有效的数独,数独部分空格内已…

基于深度学习的红肉新鲜过期判决系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 系统构成与流程 4.2 模型训练与优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...............................................…

Eclipse中项目(Project)和工作空间(WorkSpace)

一、概念 工作空间-是项目的集合 项目-是源代码文件的集合 二、工作空间 Workspace “工作空间”包含了当前工作空间的所有项目和设置&#xff0c;例如用于语法高亮显示的颜色、字体大小等。工作空间目录下的 .metadata 目录存储了该工作空间中项目和插件的配置信息。此目录…

FPGA模块——IIC接口设计

FPGA模块——IIC接口设计 IIC协议IIC接口代码应用IIC接口的代码 IIC协议 IIC接口代码 module iic_drive#(parameter P_ADDR_WIDTH 16 )( input i_clk ,//模块输入时钟input i_rs…

界面控件DevExpress ASP.NET Spreadsheet组件 - 轻松集成电子表格功能!(二)

DevExpress ASP. NET Spreadsheet组件允许您轻松地将电子表格功能合并到任意ASP. NET应用程序&#xff0c;它可以加载、转换和保存工作簿到XLS-XLSx二进制文件格式&#xff0c;还可以导出和导入XLSX、CSV和TXT文件。在上文中&#xff08;点击这里回顾>>&#xff09;&…

量化方式的选择

量化方式主要有以下两种&#xff1a; 训练后量化&#xff08;Post-Training Quantization, PTQ&#xff09;&#xff1a;在模型训练完成后对模型进行量化。 量化感知训练&#xff08;Quantization Aware Training, QAT&#xff09;&#xff1a;在模型训练过程中加入量化感知节…

2023年09月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(共15题,共30分) 第1题 人们所使用的手机上安装的App通常指的是( )。 A:一款操作系统 B:一款应用软件 C:一种通话设备 D:以上都不对 答案:B 第2题 下列流程图的输出结果是?( ) A:9 B:7 C:5 D:11 答案:A 第3题 对包含 n 个元素的数组进行冒…