当SpringCloud微服务发生线程隔离(舱壁模式)和熔断降级时(微服务失败的回调),利用FeignClient整合Sentinel,返回用户一个友好提示或者默认结果

2023-11-16

目录

一.线程隔离

1.1线程隔离的两种实现方式

 二、熔断降级

2.1慢调用

2.2异常比例

2.3异常数

三、FeignClient整合Sentinel 

3.1修改配置,开启sentinel功能

3.2编写失败降级逻辑

3.2.1利用FallbackClass回调失败处理

3.2.2利用FallbackFactory回调失败处理

 四、总结

4.1线程隔离(舱壁模式)和熔断降级的区别

4.2断路器熔断的三种策略:慢调用、异常比例、异常数的区别

4.3@FeignClient注解中的FallbackClass和FallbackFactory的区别


        服务如果因为各种原因而故障, 而我们要将这些故障控制在一定范围,避免全部服务器雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了

一.线程隔离

        调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。

1.1线程隔离的两种实现方式

  • 信号量隔离(Sentinel默认采用):不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求

  • 线程池隔离(这里不过多介绍):给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果。

       在Sentinel控制台里的簇点链路,选择自己的资源名,点击流控

  • QPS:就是每秒的请求数。

  • 线程数:是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量,实现线程隔离(信号量隔离)

 上图表示的是:给provide/user接口设置流控规则,线程数不能超过5。

 二、熔断降级

        是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。

         熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。断路器熔断策略有三种:慢调用、异常比例、异常数

2.1慢调用

        业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

 单位时间1s内通过的线程数量>=5, 且平均响应时间(秒级)超出RT阈值200ms时, 触发熔断器。

2.2异常比例

        统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值,则触发熔断。

  单位时间1s内通过的线程数量的异常比例超过0.5时时, 触发熔断器。

2.3异常数

        统计指定时间内的调用,如果调用次数超过指定请求数,并且出现超过指定异常数 ,则触发熔断。 

   单位时间1s内通过的线程数量的异常数量超过5时时, 触发熔断器。

三、FeignClient整合Sentinel 

        SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。 业务失败后,不能直接报错,而应该返回用户一个友好提示或者默认结果,而我们利用FeignClient整合Sentinel的目的就是为了达到这个效果。

3.1修改配置,开启sentinel功能

        修改消费者微服务的application.yml文件,开启Feign的Sentinel功能:

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

3.2编写失败降级逻辑

        业务失败后,不能直接报错,而应该返回用户一个友好提示或者默认结果,这个就是失败降级逻辑。

        给FeignClient编写失败后的降级逻辑

        ①方式一:FallbackClass,无法对远程调用的异常做处理

        ②方式二:FallbackFactory,可以对远程调用的异常做处理

3.2.1利用FallbackClass回调失败处理

        (1)目录结构

        (2)UserClientFeignFallBack 类代码的实现过程

        该类需要继承FeignClient远程调用的接口UserClient,并且重写该接口的方法的业务失败后需要实现的逻辑。

@Service
public class UserClientFeignFallBack implements UserClient {
    @Override
    public UserBean getOne() {
        UserBean userBean = new UserBean();
        userBean.setUserName("服务器正忙,请稍后重试");
        return userBean;
    }
}

        (3) UserClient 接口类代码的编写

        这里使用到了@FeignClient注解,里面的value的值是调用的微服务的名称,fallback的值是我们的UserClientFeignFallBack 类。

@FeignClient(value = "provider",fallback = UserClientFeignFallBack.class)//调用的服务名称
public interface UserClient {
    @GetMapping("user")
    UserBean getOne();

}

        (4)测试结果

 

3.2.2利用FallbackFactory回调失败处理

        (1)目录结构

        (2)UserClientFallbackFactory 类代码的实现过程

        UserClientFallbackFactory需要继承的是 FallbackFactory并且里面的参数是我们的FeignClient远程调用的接口UserClient,然后需要重写我们FallbackFactory里面的create方法,并且抛出异常,我们这里利用@Slf4j的log.error()方法在控制台输出这个异常。还需要加上Component注解给该类的方法创建bean对象,以便可以被调用。

@Component
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        return new UserClient() {
            @Override
            public UserBean getOne() {
                log.error("查询用户异常",throwable);
                return new UserBean();
            }
        };
    }
}

        (3) UserClient 接口类代码的编写

        这里使用到了@FeignClient注解,里面的value的值是调用的微服务的名称,fallbackFactory(注意不是fallback)的值是我们的UserClientFallbackFactory 类。

@FeignClient(value = "provider",
fallbackFactory = UserClientFallbackFactory.class)//调用的服务名称
public interface UserClient {
    @GetMapping("user")
    UserBean getOne();

}

      (4)测试结果

 四、总结

4.1线程隔离(舱壁模式)和熔断降级的区别

         线程隔离(舱壁模式)和熔断降级是微服务架构中常用的两种保护机制,它们在实现方式和应用场景上有一些区别。

        线程隔离(舱壁模式):

        (1)线程隔离通过为每个服务请求分配独立的线程池或线程来实现,将不同的服务请求隔离在不同的线程中执行。

        (2)线程隔离可以避免由于某个服务请求的故障或高延迟影响其他服务请求的性能。

        (3)线程隔离适用于需要保护每个服务请求的性能和稳定性的场景,特别是在面对大量并发请求或请求处理时间不稳定的情况下。

        熔断降级:

        (1)熔断降级是一种服务保护机制,用于在面对故障或异常情况时临时停止对某个服务的请求,避免影响整体系统的性能和可用性。

        (2)熔断降级会根据预设的条件(例如错误率、响应时间等)监控服务请求的状态,并在达到阈值时触发熔断操作,停止向该服务发起请求。

        (3)熔断降级可以快速失败并返回预设的默认响应或错误信息,减少对不可用服务的依赖,保护系统的可用性和稳定性。

        区别:

        (1)线程隔离关注的是请求级别的隔离,将不同的服务请求分配到独立的线程中执行,以保护性能和稳定性。

        (2)熔断降级关注的是服务级别的保护,根据预设条件监控服务的状态,并在达到阈值时停止对该服务的请求,以保护整体系统的可用性。

        (3)两种机制可以结合使用,通过线程隔离来保护每个服务请求的执行,同时通过熔断降级来避免对不可用服务的继续请求,提高系统的稳定性和容错能力。

        两种机制可以结合使用,通过线程隔离来保护每个服务请求的执行,同时通过熔断降级来避免对不可用服务的继续请求,提高系统的稳定性和容错能力

4.2断路器熔断的三种策略:慢调用、异常比例、异常数的区别

        断路器熔断策略是在微服务架构中常用的一种保护机制,用于避免故障服务对整体系统的影响。在断路器熔断策略中,常见的三种策略是慢调用、异常比例和异常数。它们的区别如下:

        慢调用(Slow Call):

        (1)慢调用策略基于服务请求的响应时间来触发熔断。

        (2)当服务请求的响应时间超过预设的阈值,即被定义为慢调用,断路器将会打开,停止对该服务的请求。

        (3)慢调用策略关注的是服务请求的响应时间,当响应时间过长时,认为服务不可用,触发熔断保护。

        异常比例(Error Percentage):

        (1)异常比例策略基于服务请求中的异常比例来触发熔断。

        (2)当服务请求中的异常比例超过预设的阈值,即异常比例达到或超过一定百分比时,断路器将会打开,停止对该服务的请求。

        (3)异常比例策略关注的是服务请求中异常的比例,当异常比例超过阈值时,认为服务不可用,触发熔断保护。

        异常数(Error Count):

        (1)异常数策略基于服务请求中的异常数量来触发熔断。

        (2)当服务请求中的异常数量超过预设的阈值,即异常数量达到或超过一定数量时,断路器将会打开,停止对该服务的请求。

        (3)异常数策略关注的是服务请求中异常的数量,当异常数量超过阈值时,认为服务不可用,触发熔断保护。

        慢调用策略基于响应时间,异常比例策略基于异常比例,异常数策略基于异常数量。它们都是用于监控服务请求的状态,当达到预设的阈值时触发熔断操作,停止对服务的请求。选择适合的熔断策略需要根据具体的应用场景和需求进行判断和配置。

4.3@FeignClient注解中的FallbackClass和FallbackFactory的区别

        Feign的注解@FeignClient:fallbackFactory与fallback方法不能同时使用,这个两个方法其实都类似于Hystrix的功能,当网络不通时返回默认的配置数据。

        区别:

  • FallbackClass方式是直接创建一个降级逻辑实现类,而FallbackFactory方式通过工厂类创建降级逻辑实例。
  • FallbackFactory提供了更灵活的降级处理选项,可以根据异常信息动态创建不同的降级逻辑实例。
  • FallbackFactory可以在创建降级逻辑实例时获取到触发降级的异常信息,而FallbackClass方式无法直接获取异常信息。

        选择使用哪种方式取决于具体的业务需求和降级处理的复杂程度。如果需要根据异常信息动态创建降级逻辑或者实现更复杂的降级处理逻辑,建议使用FallbackFactory。如果降级逻辑比较简单且不需要动态处理,可以使用FallbackClass来实现服务降级

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当SpringCloud微服务发生线程隔离(舱壁模式)和熔断降级时(微服务失败的回调),利用FeignClient整合Sentinel,返回用户一个友好提示或者默认结果 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • ChatGPT 中文调教指南。各种场景使用指南。学习怎么让它听你的话

    ChatGPT是由OpenAI训练的一款大型语言模型 能够生成类人文本 您只需要给出提示或提出问题 它就可以生成你想要的东西 在此页面中 您将找到可与 ChatGPT 一起使用的各种提示 正经指南 写小说 写一本拥有出人意料结局的推理小说
  • 1.1关于数据挖掘

    一 数据挖掘是什么 从技术层面讲 数据挖掘指从大量数据中提取潜在有用的信息和知识的过程 从商业层面讲 数据挖掘是一种对大量业务数据进行抽取 转换 分析和建模处理 并从中提取辅助商业决策的关键数据的商业信息处理技术 二 数据挖掘与传统传统数据
  • 2021-5-13 爬虫之Xpath的下载与安装,简单教学!

    5 13学习日记之Xpath Xpath的安装 怎么安装Xpath 问题一 Xpath的安装 XPath 是一门在 XML 文档中查找信息的语言 XPath 可用来在 XML 文档中对元素和属性进行遍历 简单来说 在进行网页信息爬取时 Xp
  • 抖音新版本抓包(绕过sslpinning证书校验)

    目录 前言 方案 frida 替换so Xposed 前言 当我们想要分析较新版本的接口时 会发现一个有趣的现象 无论是用Charles还是Fiddler 都会出现抓不到包的情况 如下图 这是因为使用SSL Pinning证书锁定技术 是一
  • mysql性能优化

    1 表字段要选择合适的属性 邮政编码设置char 6 就可以了 文本字段如省份或者性别用enum enum被当做数值型数据来处理 比文本类型快 2 建立索引 3 优化查询语句 查询条件里最好用in替代on 条件列表值如果连续 用betwee
  • 注意力机制——CAM、SAM、CBAM、SE

    CAM SAM CBAM详见 CBAM 即插即用的注意力模块 附代码 目录 1 什么是注意力机制 2 通道注意力机制 SE 1 Squeeze 2 Excitation 3 SE Block 3 CAM 4 SAM 5 CBAM 6 代码
  • 一篇文章入门C/C++自动构建利器之Makefile

    更多博文 请看音视频系统学习的浪漫马车之总目录 C C 编译 浅析C C 编译本质 一篇文章入门C C 自动构建利器之Makefile 升级构建工具 从Makefile到CMake Makefile简介 上一篇浅析C C 编译本质已经比较详
  • UE4修改splitScreen layout方式

    UE4自身提供了分屏显示的方法 可以分成两个屏幕 也可以分成三个屏幕 但提供的分屏布局方式有限 包括两个玩家分屏布局 Vertical Horizontal 三个玩家分屏布局 Favor Top Favor Bottom 这里提供给大家一种
  • 华为OD机试真题 Java 实现【光伏场地建设规划】【2023Q1 100分】

    一 题目描述 祖国西北部有一片大片荒地 其中零星的分布着一些湖泊 保护区 矿区 整体上常年光照良好 但是也有一些地区光照不太好 某电力公司希望在这里建设多个光伏电站 生产清洁能源 对每平方公里的土地进行了发电评估 其中不能建设的区域发电量为
  • 【TS】联合类型

    文章目录 TS 联合类型 1 普通变量声明 2 数组声明使用 3 函数中使用 TS 联合类型 联合类型即通过管道 将变量设置多种类型 赋值时可以根据设置的类型来赋值 1 普通变量声明 let res number string boolea
  • MySQL中的事务、索引、锁机制

    目录 一 MySQL基础架构 二 MySQL中的索引 1 什么是索引 索引的作用 2 索引的类型 1 主键索引 Primary Key 2 二级索引 辅助索引 3 索引的底层数据结构 1 B 树 B 树 2 为什么选择B B 树 为什么要用
  • 图块引用、属性块引用、创建新层表、ObjectArx开发中静态变量和全局变量要点

    一 图块设计技术 在AutoCAD数据库中 以各图块实际上市存储在块表记录里的实体集合 每个图块从一格AcDbBlockBegin对象开始 紧接着是一个或多个AcDbEntity对象 最后以AcDbBolckEnd对象结束 按其所属关系得层
  • Googleplay从服务器检索信息时出错。[DF-DFERH-01]

    googleapis cn services googleapis cn 两个地址强制走代理就OK了 转载于 https www cnblogs com Devopser p 10269312 html
  • Linux下利用TCP的服务端和客户端实现简单收发消息

    服务端采用了线程 可以同时提供给多台客户端连接 TCP的服务端 tcp server c include
  • 每秒上万并发下的Spring Cloud性能优化之道

    本文为转载文章 作者 中华石杉 十余年BAT架构经验 倾囊相授 作者微信公众号 石杉的架构笔记 ID shishan100 一 写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构 毕竟现在这是非常火的一门技术
  • MySQL中的any_value()函数

    转载 MySQL中的any value 函数 小李小李彬彬有礼的博客 CSDN博客
  • 深入探索透视投影变换(续)

    潘宏 2009 4 14 本人水平有限 疏忽错误在所难免 还请各位数学高手 编程高手不吝赐教 email popyy netease com B站专栏 https b23 tv oWsl6PD 在上一篇文章中我们讨论了透视投影变换的原理 分
  • 涂鸦NBIOT OpenCPU开发快速入门(三)

    1 开发板选择 工欲善其事 必先利其器 我之前做了两款开发板 其实主要是为了我工作上开发的方便 第一款用来测试通用对接 的方式比较友好 第二个板子主要特色在于开发调试起来非常方便 涂鸦 模组多个平台的芯片都是默认三个串口的 烧录口 通讯口
  • 《算法导论》选择问题(找第K大的数)

    选择问题 Selection Problem 即在n个元素的集合中寻找第K小的元素的问题 第K小的元素又叫第K个顺序统计量 有以下几种变体 找最大值和最小值 同时找最大和最小值 找中位数 第n 2小 找任意第K小的元素 找Top K的元素
  • 当SpringCloud微服务发生线程隔离(舱壁模式)和熔断降级时(微服务失败的回调),利用FeignClient整合Sentinel,返回用户一个友好提示或者默认结果

    目录 一 线程隔离 1 1线程隔离的两种实现方式 二 熔断降级 2 1慢调用 2 2异常比例 2 3异常数 三 FeignClient整合Sentinel 3 1修改配置 开启sentinel功能 3 2编写失败降级逻辑 3 2 1利用Fa