SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级”
目录
一、FeignClient 整合 Sentinel
1.1、整合原因
1.2、实现步骤
1.2.1、修改 OrderService 中的 application.yml 文件
1.2.2、给 FeignClient 编写失败后的降级逻辑
二、线程隔离
2.1、线程隔离的两种方式
2.1.1、线程池隔离
2.1.2、信号量隔离(Sentinel 默认采用方式)
2.2、实现线程隔离(舱壁模式)
a)添加流控规则
b)使用 JMeter 进行测试
c)分析结果
三、熔断降级
3.1、什么是熔断降级
3.2、熔断策略——慢调用
a)在 Sentinel 上给远程调用添加降级规则
b)在浏览器中连续刷新,分析结果
3.3、熔断策略——异常比例、异常数
a)在 Sentinel 上给远程调用添加降级规则
b)在浏览器中连续刷新,分析结果
一、FeignClient 整合 Sentinel
1.1、整合原因
前面我们学习到的限流虽然可以避免因高并发引起的服务故障,但是服务还是可能会因为其他原因故障. 如果要将这些故障控制住,避免雪崩,就需要靠线程隔离和熔断降级的了.
但不管是线程隔离还是熔断降级,都是对 客户端(调用方)的保护,避免服务的调用者被故障的服务拖垮,因此我们要就需要在微服务发起远程调用的时候去做隔离和降级,也就是说通过 Feign 整合 Sentinel 去做 隔离和降级.
1.2、实现步骤
1.2.1、修改 OrderService 中的 application.yml 文件
在 application.yml 中开启 Feign 的 Sentinel 功能.
feign:sentinel:enabled: true # 开启Feign的Sentinel功能
1.2.2、给 FeignClient 编写失败后的降级逻辑
这里有一下两种方式实现降级逻辑.
- FallbackClass:无法对远程嗲用的异常做处理.
- FallbackFactory:可以对远程调用的异常做处理.
这里我们选择第二种方式,具体实现如下:
a)在 feign-api 项目中自定义类 UserClientFallbackFactory ,实现 FallbackFactory 接口
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable throwable) {return new UserClient() {@Overridepublic User findById(Long id) {//记录异常信息log.error("查询用户失败!");//根据业务需求返回数据,这里返回一个空对象return new User();}};}
}
b)在 feign-api 项目的 配置类 中,将 UserClientFallbackFactory 注册为一个 Bean
@Beanpublic UserClientFallbackFactory userClientFallbackFactory() {return new UserClientFallbackFactory();}
c)在 feign-api 项目中的 UserClient 接口(feign 远程调用接口)中使用 UserClientFallbackFactor.
@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);}
二、线程隔离
2.1、线程隔离的两种方式
2.1.1、线程池隔离
线程隔离就是给每个业务划分独立的线程池,实现隔离.
比如说,我现在有 a、b、c 三个服务,而 a 依赖 b 形成一个业务,a 依赖 c 形成一个业务,那么线程池隔离就会给每个业务所依赖的服务都创建一个线程池,也就说这里创建两个线程池,一个给b,一个给 c. 当有请求到达 a 的时候,不会去使用请求本身的这个线程,而是去这两个池子里分别去取线程,此时这个线程就可以去调用 feign 的客户端,发起远程调用.
这样就把两个服务给隔离开了.如果服务 b 出现了故障,那么最多也就是把他这边池子里的线程给用完,如果还有新的请求还想访问这个服务,但是池子满了,他还能进来了吗?这样一来就不会把服务 a 里面的资源给耗尽了.
优点
1. 支持主动超时:线程池模式会给每一个远程调用分配一个独立的线程,也就意味着可以通过线程池来控制他. 如果发现有一个请求耗时久了,就可以立即终止这个线程.
2. 支持异步调用:每次调用都是线程池分配的一个独立的线程,不是原来处理 tomcat 请求的线程,而不同的服务又是不同的线程池,因此可以在给某一个服务处理的请求的同时,再给其他服务处理远程调用.
缺点
1. 线程的额外开销比较大:每次调用都有独立的线程,线程越多,开销越大,别的不说,光是 cpu 上下文切换也是比较耗时的.
适用场景
1.适用于 “低扇出”:低扇出就是指,我这里有一个服务依赖于其他服务,依赖的服务越多,扇出越高. 每次远程调用都有独立的线程,因此为了避免多线程开销问题,更适用于低扇出场景.
2.1.2、信号量隔离(Sentinel 默认采用方式)
信号量就相当于之前所讲到过的 Semaphore.
比如说我有服务a 和 服务b,服务a 依赖于 服务b. 现在又请求到 a 了,那么信号量不会去创建独立的线程,而是去使用你原本处理请求的线程,直接去调用 Feign 客户端,那他是怎么做到隔离的呢?他维持了一个计数器,每次请求来了都做一个判断,判断计数器里还有没有.
比如计数器总量是 10,每进入一个请求,计数器都会减一,请求处理完了都会加一. 如果当有 10 个请求同时来访问的的时候,那么10 个信号都被取完了,此时如果再来新的请求,就会直接拒绝,因此也能起到故障隔离的作用.
优点
1. 轻量级,没有额外开销:实际上就是给线程池做了一个弥补,因为他只是一个计数器,不需要开启线程.
缺点
1. 不支持主动超时:请求来了以后,只是判断一下信号量有没有,如果就给你分配一个,但是信号量就不受控制了,没法中途停掉,只能依赖于 Feign 本身的超时时间,所有不能做主动超时.
2. 不支持异步调用:都没有独立的线程,更不用提异步调用了.
适用场景
1. 高频调用,高扇出:因为 信号量 开销低. 网关 就是一个高扇出的场景 ,他把请求路由到你的各个微服务当中,扇出相当的庞大,因此网关也基本上都是用的是 信号量模式(也是 sentinel 为什么适用信号量模式的原因).
2.2、实现线程隔离(舱壁模式)
在 Sentinel 控制台中,添加先流规则时,可以选择两种阈值类型:
- QPS:每秒请求数,之前演示过了.
- 线程数:该资源能使用的 tomcat 线程数的最大值. 通过限制线程数,实现舱壁模式.
这里通过一个案例演示:给 UserClient 的查询用户接口设置流控规则,线程数不能超过 2.
由于前面已经配置 FeignClient 整合 Sentinel,访问查询订单资源,就可以在 Sentinel 中看到如下远程调用资源.
a)添加流控规则
b)使用 JMeter 进行测试
c)分析结果
在结果树中可以看到所有请求成功了,这是因为我们基于 Feign 整合了 Sentinel 保护机制,而保护的策略就是“打印异常日志,返回空对象”.
可以看到前面几个请求时成功返回信息,而后面的请求都返回的是空对象,是因为触发了 Sentinel 的刚刚配置的流控机制.
也可以在 IDEA 上看到日志的打印
三、熔断降级
3.1、什么是熔断降级
熔断降级就是通过一个短路器取统计服务调用的时候 “异常比例、慢调用比例、异常数量”,比如说统计的是异常比例,那么如果异常比例过高,触发了阈值就会熔断该服务,这样就把故障的服务隔离开了.
这就像是古代的武侠人士,手被毒蛇咬了,赶紧手起刀落,把手砍断,防止毒扩散到全身,但是这把手砍了算不了什么本事啊,能接回来才是真本事.
而 Sentinel 就可以在服务恢复时,让熔断器放行访问该服务的请求.
具体的,熔断器有以下三种状态:
3.2、熔断策略——慢调用
慢调用就指看你的响应时间如果过长,超过了指定的时间,那么就认为你这个请求的很慢,占用额外资源,会拖慢整个服务.
因此,如果慢调用的比例达到阈值,也就是说每次服务调用你都很慢,那就会触发熔断.
在 Sentinel 的控制台中可有新增降级规则,这里就描述了,何时触发熔断,例如
解读:RT(ResponseTIme 响应时间)超过 500ms 就是慢调用,统计最近 10000ms 内的请求,如果慢调用的比例超过 0.5,就会触发熔断,熔断时常为 5s. 之后进入 half-open(半打开)状态,放行一次请求做测试.
这里我用一个案例来演示:给 UserClient 查询用户接口设置降级规则,RT为 50ms,统计时间 1s,最小请求数量为 5,失败阈值比例为 0.4,熔断时长为 5s.
注意:这里为了触发慢调用规则,我修改了 UserService 中的业务,增加业务耗时.
a)在 Sentinel 上给远程调用添加降级规则
在簇点链路中即可配置
规则如下
b)在浏览器中连续刷新,分析结果
快速刷新几次之后,就可以看到已经发生熔断,触发降级策略,也就是返回空用户信息.
随后,过 5 秒后,在发送一次请求,就会发现进入 half-open 模式,给你一次测试的机会.
3.3、熔断策略——异常比例、异常数
异常比例:就是统计在指定之间内,调用的次数到达指定的请求数,并且出现的异常超过设置的比例,那么就会触发熔断.
异常数(和异常比例差不多,这里就不演示了):顾名思义就是统计指定时间内,调用的次数到达指定请求数,并且超过异常数阈值,就会触发熔断.
例如:
解读:统计最近 1000 ms 内请求,如果请求量超过 10 次,且异常比例不低于 0.5,则触发熔断,熔断的时间为 5s.
这里我用一个案例来演示 异常比例:给 UserClient的查询用户接口设置降级规则,统计时间为 1 秒,最小请求数量为 5 ,失败阈值比例为 0.4 ,熔断时长为 5 s
注意,为了触发异常统计,我修改了 UserService 中的业务,抛出异常.
a)在 Sentinel 上给远程调用添加降级规则
b)在浏览器中连续刷新,分析结果
连续刷新 5 次,就可以观察到,触发熔断.
5 秒后恢复,这里需要在换成 /order/101 的请求,这样远程调用的也是获取 id = 1 的用户,否则继续使用 /order/102 请求,远程调用 id = 2 的用户会继续引发异常,而当前还处于 half-open 状态,就有又回到 open 熔断状态了.
相关文章:
SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级”
目录 一、FeignClient 整合 Sentinel 1.1、整合原因 1.2、实现步骤 1.2.1、修改 OrderService 中的 application.yml 文件 1.2.2、给 FeignClient 编写失败后的降级逻辑 二、线程隔离 2.1、线程隔离的两种方式 2.1.1、线程池隔离 2.1.2、信号量隔离(Sentin…...
Acwing 906. 区间分组
Acwing 906. 区间分组 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 这段代码是用来维护一个最小堆,以确保右边界不相交的区间被正确地保留在堆中。让我详细解释这段代码: heap.empty():这个条件检查最小堆 heap 是否为…...
阿里云 Oss 权限控制
前言 最近公司的私有 Oss 服务满了,且 Oss 地址需要设置权限,只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着,Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去,但是紧…...
CSS详细基础(六)边框样式
本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …...
支持向量机SVM:从数学原理到实际应用
目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量?超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法(Lagrange Multipliers)KKT条件核技巧(Kernel Trick)双重问题和主问题&…...
【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
第三章:最新版零基础学习 PYTHON 教程(第十一节 - Python 运算符—Python 中的any与all)
Any 和 All 是 python 中提供的两个内置函数,用于连续的与/或。Any如果任何一项为 True,则返回 true。如果为空或全部为 false,则返回 False。Any 可以被认为是对所提供的可迭代对象进行 OR 操作的序列。它会短路执行,即一旦知道结果就停止执行。 句法: any(iterable) 函…...
Pytorch单机多卡分布式训练
Pytorch单机多卡分布式训练 数据并行: DP和DDP 这两个都是pytorch下实现多GPU训练的库,DP是pytorch以前实现的库,现在官方更推荐使用DDP,即使是单机训练也比DP快。 DataParallel(DP) 只支持单进程多线程…...
asp.net coremvc+efcore增删改查
下面是一个使用 EF Core 在 ASP.NET Core MVC 中完成增删改查的示例: 创建一个新的 ASP.NET Core MVC 项目。 安装 EF Core 相关的 NuGet 包。在项目文件 (.csproj) 中添加以下依赖项: <ItemGroup><PackageReference Include"Microsoft…...
Java基础面试,什么是面向对象,谈谈你对面向对象的理解
前言 马上就要找工作了,从今天开始一天准备1~2道面试题,来打基础,就从Java基础开始吧。 什么是面向对象,谈谈你对面向对象的理解? 谈到面向对象,那就不得不谈到面向过程。面向过程更加注重的是完成一个任…...
Ubuntu系统初始设置
更换国内源 安装截图工具 安装中文输入法 安装QQ 参考: 安装双系统win10Ubuntu20.04LTS(详细到我自己都害怕) 引导方式磁盘分区方法UEFIGPTLegancyMBR 安装网络助手 sudo apt install net-tools 安装VS Code 使用从官网下载.deb安装包…...
焕新古文化传承之路,AI为古彝文识别赋能
目录 1 古彝文与古典保护 2 古文识别的挑战 2.1 西文与汉文OCR 2.2 古彝文识别难点 3 合合信息:古彝文保护新思路 3.1 图像矫正 3.2 图像增强 3.3 语义理解 3.4 工程技巧 4 总结 1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&am…...
毛玻璃动画交互效果
效果展示 页面结构组成 从上述的效果展示页面结构来看,页面布局都是比较简单的,只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…...
Audio2Face的工作原理
预加载一个3D数字人物模型(Digital Mark),该模型可以通过音频驱动进行面部动画。 用户上传音频文件作为输入。 将音频输入馈送到预训练的深度神经网络中。 Audio2Face加载预制的3d人头mesh 3D数字人物面部模型由大量顶点组成,每个顶点都有xyz坐标。 深度神经网络输入音频特征,…...
【面试题】2023前端面试真题之JS篇
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 世界上只有一种真正的英雄主义,那就是看清生活的真相之后,依然热爱生活。…...
Mysql 分布式序列算法
接上文 Mysql分库分表 1.分布式序列简介 在分布式系统下,怎么保证ID的生成满足以上需求? ShardingJDBC支持以上两种算法自动生成ID。这里,使用ShardingJDBC让主键ID以雪花算法进行生成,首先配置数据库,因为默认的注…...
Windows/Linux双系统卸载Ubuntu
参考:双系统下完全卸载ubuntu...
asp.net core mvc 视图组件viewComponents
ASP.NET Core MVC 视图组件(View Components)是一种可重用的 UI 组件,用于在视图中呈现某些特定的功能块,例如导航菜单、侧边栏、用户信息等。视图组件提供了一种将视图逻辑与控制器解耦的方式,使视图能够更加灵活、可…...
如何保持终身学习
文章目录 2.1. 了解你的大脑2.2 学习是对神经元网络的塑造2.3 大脑的一生 3.学习的心里基础3.1 固定思维与成长思维3.2 我们为什么要学习 4. 学习路径4.1 构建知识模块4.2 大脑是如何使用注意力的4.3 提高专注力4.4 放松一下,学的更好4.5 巩固你的学习痕迹4.6 被动学…...
【RV1103】RTL8723bs (SD卡形状模块)驱动开发
文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一:修改二: SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…...
LeetCode 周赛上分之旅 #49 再探内向基环树
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...
kubernetes-v1.23.3 部署 kafka_2.12-2.3.0
文章目录 [toc]构建 debian 基础镜像部署 zookeeper配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc配置 configmap配置 service配置 statefulset 部署 kafka配置 configmap配置 service配置 statefulset 这里采用的部署方式如下: 使用自定义的 debian 镜像作为…...
位置编码器
目录 1、位置编码器的作用 2、代码演示 (1)、使用unsqueeze扩展维度 (2)、使用squeeze降维 (3)、显示张量维度 (4)、随机失活张量中的数值 3、定义位置编码器类,我…...
Lua多脚本执行
--全局变量 a 1 b "123"for i 1,2 doc "Holens" endprint(c) print("*************************************1")--本地变量(局部变量) for i 1,2 dolocal d "Holens2"print(d) end print(d)function F1( ..…...
Spirng Cloud Alibaba Nacos注册中心的使用 (环境隔离、服务分级存储模型、权重配置、临时实例与持久实例)
文章目录 一、环境隔离1. Namespace(命名空间):2. Group(分组):3. Services(服务):4. DataId(数据ID):5. 实战演示:5.1 默…...
26663-2011 大型液压安全联轴器 课堂随笔
声明 本文是学习GB-T 26663-2011 大型液压安全联轴器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了大型液压安全联轴器的分类、技术要求、试验方法及检验规则等。 本标准适用于联接两同轴线的传动轴系,可起到限制…...
ChatGPT架构师:语言大模型的多模态能力、幻觉与研究经验
来源 | The Robot Brains Podcast OneFlow编译 翻译|宛子琳、杨婷 9月26日,OpenAI宣布ChatGPT新增了图片识别和语音能力,使得ChatGPT不仅可以进行文字交流,还可以给它展示图片并进行互动,这是一次ChatGPT向多模态进化的…...
二、VXLAN BGP EVPN基本原理
VXLAN BGP EVPN基本原理 1、BGP EVPN2、BGP EVPN路由2.1、Type2路由——MAC/IP路由2.2、Type3路由——Inclusive Multicast路由2.3、Type5路由——Inclusive Multicast路由 ————————————————————————————————————————————————…...
Evil.js
Evil.js install npm i lodash-utils什么?黑心996公司要让你体统跑路了? 想在离开前给你们的项目留点小礼物? 偷偷地把本项目引入你们的项目吧,你们的项目会有但不仅限于如下的神奇效果: 仅在周日时: 当…...
使用sqlmap的 ua注入
文章目录 1.使用sqlmap自带UA头的检测2.使用sqlmap随机提供的UA头3.使用自己写的UA头4.调整level检测 测试环境:bWAPP SQL Injection - Stored (User-Agent) 1.使用sqlmap自带UA头的检测 python sqlmap.py -u http://127.0.0.1:9004/sqli_17.php --cookie“BEEFHOO…...
购物系统顺序图/北京谷歌seo公司
如果觉得我的算法分享对你有帮助,欢迎关注我的微信公众号“圆圆的算法笔记”,更多算法笔记、算法交流,以及世间万物的学习记录~ NLP中,预训练大模型Finetune是一种非常常见的解决问题的范式。利用在海量文本上预训练得到的Bert、GPT等模型,在下游不同任务上分别进行finet…...
校园门户网站系统建设/网络引流怎么做啊?
概述 相信大家都知道怎么在vSphere环境中配置HA功能,知道HA故障切换时间为VM系统启动时间应用启动时间15秒左右的心跳检测时间,知道HA不受DRS和vMotion影响,知道HA不需要依赖vCenter(vCenter挂了,License授权ESXi主机只…...
有没有专门帮人做图的网站/网站模板平台
Community over Code http://theapacheway.com/ “一片羽毛的故事”:Apache软件基金会成立15年 今年是Apache软件基金会成立15周年纪念!Apache软件基金会成立于1999年,非盈利组织,英文名称Apache Softw…...
深圳做网站乐云seo费用优惠/山西seo和网络推广
一、深度遍历和广度遍历原理及实现1、深度优先英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节…...
淄博网站建设网站推广优化/seo网站推广怎么做
subprocess的目的就是启动一个新的进程并且与之通信。 subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下: subprocess.Popen(args, bufsize0, executableNone, stdinNone, stdoutNone, stderr…...
dw做网站导航条/市场调研流程
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种…...