Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

19 | Sentinel 实战:如何为项目添加异常降级方案?

你好,我是姚秋辰。
上节课我们学习了如何将应用接入 Sentinel 实现不同的流控效果,今天我们来学习 Sentinel 组件另一个重要功能:降级熔断。通过这节课,你可以知道如何通过 Sentinel 的熔断策略处理各种调用异常。除此之外,我还会讲解 Sentinel 熔断器开关的状态变化过程。
第 17 课中我们学习过降级和熔断的作用,今天我们就先从降级开始,了解一下如何利用 Sentinel 的注解指定降级方法。
这里我将以 Template 服务的模板批量查询接口为例,向你演示如何设置降级方法。为什么我会选择这个接口?因为券模板查询是一个基础服务,很多上游的业务场景都依赖这个接口获取模板信息,所以它的访问压力相比于其它接口就大得多了,也更容易发生各种服务超时之类的异常情况。
如果你已经准备好了,我们就从编写降级逻辑开始吧。

编写降级逻辑

上一节课中,我们在 Template 服务的批量领劵接口之上添加了一个 SentinelResource 注解,并在其中使用 blockHandler 属性指定了降级方法的名称。不过呢,这个注解可不是一个万金油注解,它只能在服务抛出 BlockException 的情况下执行降级逻辑。
什么是 BlockException 呢?这个异常类是 Sentinel 组件自带的类,当一个请求被 Sentinel 规则拦截,这个异常便会被抛出。比如请求被 Sentinel 流控策略阻拦住,或者请求被熔断策略阻断了,这些情况下你可以使用 SentinelResource 的 blockHandler 注解来指定降级逻辑。但是对于其它 RuntimeException 的异常类型它就无能为力了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何在项目中使用Sentinel组件的降级熔断功能来处理各种调用异常。作者首先讲解了通过Sentinel的注解指定降级方法,并提供了编写降级逻辑的示例代码。接着,文章详细介绍了在Sentinel控制台添加熔断策略的步骤,包括异常比例、异常数和慢调用比例三种熔断规则的设置方法。此外,还强调了慢调用作为一个关键侦测指标在业务监控中的重要性。最后,作者带领读者了解了Sentinel的熔断状态转换规则,解释了熔断开关的开启、关闭和半开状态之间的转换规则。通过本文,读者可以全面了解Sentinel的降级熔断功能及其在实际项目中的应用,以及如何在Sentinel控制台中设置不同类型的熔断规则,为项目添加异常降级方案提供了实用的指导和示例。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring Cloud 微服务项目实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • peter
    Q1:Sentinel的实现原理是filter还是代理? 在服务调用过程中,sentinel是以filter方式对请求进行处理吗?不过,sentinel能中断正常的调用逻辑,所以感觉也不像是filter。那么,sentinel是通过代理实现的吗? Q2:能增加自定义的熔断规则吗? 除了自带的三种熔断规则,是否能够增加自定义的熔断规则?如果能增加,有哪些常见的自定义规则?(同样地,对于流控,除了自带的三种流控方法,还可以自定义流控规则吗?) Q3:服务出错最终是怎么解决的? 降级和熔断只是暂时的处理方法,最终是怎么处理的?最终是要靠人工处理吗? 比如重启应用、重启机器等。在实际运营中,系统从错误恢复正常,是系统自我调整居多? 还是人工干预居多?

    作者回复: 1:slot可以认为是类似filter的模式; 2:可以添加自定义规则,定义新的slot即可; 3:异常处理要case by case,没有万金油方案。但很多异常是突发流量导致的,等水位下来之后就解决了

    2022-01-24
    6
  • so long
    老师,请教一个问题,代码中抛出自己封装的业务异常RuntimeException,不想被sentinel的熔断规则统计进去,应该如何处理?

    作者回复: 如果某个异常是可以被接受的,其实就不算做异常了,应用层加个handler统一处理一下把特定异常吞掉,曲线救国:)

    2022-01-24
    5
  • 西门吹牛
    熔断,首先要进行依赖隔离,只要分出了那些是核心的,那些非核心的,才能做好隔离,Hystrix 记得好像是采用线程池和信号量的方式进行隔离,采用线程池需要会增加线程切换的成本。Sentinel 基于信号量进行隔离,对依赖的某个资源的进行并发数量限制。 俩者都可以采用信号量的方式,但是 Hystrix 好像对于慢调用处理不够及时。

    作者回复: 我其实蛮喜欢用hystrix的,但它的源码里用函数式编程用魔障了,代码非常难debug跟,开源团队的维护成本肯定贼大

    2022-01-30
    2
    1
  • 紫霞仙子意中人
    姚老师,请教一个问题。我配置了异常比列降级熔断,在代码中 throw new RuntimeException("异常");问题是没有达到我配置的条件,只要代码走抛出异常的那一步,就会直接降级。另外慢调用也不生效。我的限流策略是可以正常执行的。

    作者回复: 代码走到异常的部分确实会执行降级方法,这个是正确的行为。sentinel的阈值控制的是“熔断”,比如说你达到阈值之后,方法就直接走到降级逻辑里,而不会通过“执行原方法->降级逻辑”的顺序来走

    2022-11-14归属地:贵州
  • 海阔天空
    照着代码写的,配置也是一样的(我习惯用properties格式)。服务启动的时候控制台日志 dataid为null.properties。断点进去看的的时候第一遍dataid是显示的有我配置的值,后面再获取的时候却是null.properties。。。然后又原模原样换成老师的配置,dataid也是显示null.yml。。这是为啥呢?

    作者回复: 同学可以把配置代码和日志发出来看下,只看描述我没太明白“后面再获取dataid”是哪个场景

    2022-01-24
    2
  • 6点无痛早起学习的和尚
    日常追更,每次做第一个打卡留言的人

    作者回复: 感谢老铁的支持,双击666

    2022-01-24
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部