19 | Sentinel 实战:如何为项目添加异常降级方案?
姚秋辰
你好,我是姚秋辰。
上节课我们学习了如何将应用接入 Sentinel 实现不同的流控效果,今天我们来学习 Sentinel 组件另一个重要功能:降级熔断。通过这节课,你可以知道如何通过 Sentinel 的熔断策略处理各种调用异常。除此之外,我还会讲解 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
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- peterQ1:Sentinel的实现原理是filter还是代理? 在服务调用过程中,sentinel是以filter方式对请求进行处理吗?不过,sentinel能中断正常的调用逻辑,所以感觉也不像是filter。那么,sentinel是通过代理实现的吗? Q2:能增加自定义的熔断规则吗? 除了自带的三种熔断规则,是否能够增加自定义的熔断规则?如果能增加,有哪些常见的自定义规则?(同样地,对于流控,除了自带的三种流控方法,还可以自定义流控规则吗?) Q3:服务出错最终是怎么解决的? 降级和熔断只是暂时的处理方法,最终是怎么处理的?最终是要靠人工处理吗? 比如重启应用、重启机器等。在实际运营中,系统从错误恢复正常,是系统自我调整居多? 还是人工干预居多?
作者回复: 1:slot可以认为是类似filter的模式; 2:可以添加自定义规则,定义新的slot即可; 3:异常处理要case by case,没有万金油方案。但很多异常是突发流量导致的,等水位下来之后就解决了
2022-01-246 - so long老师,请教一个问题,代码中抛出自己封装的业务异常RuntimeException,不想被sentinel的熔断规则统计进去,应该如何处理?
作者回复: 如果某个异常是可以被接受的,其实就不算做异常了,应用层加个handler统一处理一下把特定异常吞掉,曲线救国:)
2022-01-245 - 西门吹牛熔断,首先要进行依赖隔离,只要分出了那些是核心的,那些非核心的,才能做好隔离,Hystrix 记得好像是采用线程池和信号量的方式进行隔离,采用线程池需要会增加线程切换的成本。Sentinel 基于信号量进行隔离,对依赖的某个资源的进行并发数量限制。 俩者都可以采用信号量的方式,但是 Hystrix 好像对于慢调用处理不够及时。
作者回复: 我其实蛮喜欢用hystrix的,但它的源码里用函数式编程用魔障了,代码非常难debug跟,开源团队的维护成本肯定贼大
2022-01-3021 - 紫霞仙子意中人姚老师,请教一个问题。我配置了异常比列降级熔断,在代码中 throw new RuntimeException("异常");问题是没有达到我配置的条件,只要代码走抛出异常的那一步,就会直接降级。另外慢调用也不生效。我的限流策略是可以正常执行的。
作者回复: 代码走到异常的部分确实会执行降级方法,这个是正确的行为。sentinel的阈值控制的是“熔断”,比如说你达到阈值之后,方法就直接走到降级逻辑里,而不会通过“执行原方法->降级逻辑”的顺序来走
2022-11-14归属地:贵州 - 海阔天空照着代码写的,配置也是一样的(我习惯用properties格式)。服务启动的时候控制台日志 dataid为null.properties。断点进去看的的时候第一遍dataid是显示的有我配置的值,后面再获取的时候却是null.properties。。。然后又原模原样换成老师的配置,dataid也是显示null.yml。。这是为啥呢?
作者回复: 同学可以把配置代码和日志发出来看下,只看描述我没太明白“后面再获取dataid”是哪个场景
2022-01-242 - 6点无痛早起学习的和尚日常追更,每次做第一个打卡留言的人
作者回复: 感谢老铁的支持,双击666
2022-01-24
收起评论