Sentinel实现服务降级并与api解耦
创始人
2024-04-13 01:57:44

Sentinel怎样实现熔断降级

熔断降级介绍

sentinel支持服务的熔断降级

熔断类似于保险丝,在超出了阈值的情况下,在一定的时间内不会执行业务逻辑,直接执行服务降级的方法。服务降级利用本地fallback方法,返回一个有好的提示给客户端,不会真实的去执行业务逻辑。除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

降级的策略

1.平均响应时间 (DEGRADE_GRADE_RT)
当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

2.异常比例(DEGRADE_GRADE_EXCEPTION_RATIO)
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

3.异常数(DEGRADE_GRADE_EXCEPTION_COUNT)
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

平均的响应时间

image-20221126105715934

如果在1s秒,平均有5个请求的响应时间大于配置的10rt毫秒时间 阈值,则会执行一定时间窗口的熔断和降级。

基于平均相应时间实现降级代码:

@SentinelResource(value = "getOrderDowngradeRtType", fallback = "getOrderDowngradeRtTypeFallback")
@RequestMapping("/getOrderDowngradeRtType")
public String getOrderDowngradeRtType() {try {Thread.sleep(300);} catch (Exception e) {}return "getOrderDowngradeRtType";
}public String getOrderDowngradeRtTypeFallback() {return "服务降级啦,当前服务器请求次数过多,请稍后重试!";
}

异常的比例

image-20221126105748147

当我们每秒的请求大于5的时候,会根据一定比例执行我们的熔断降级的策略。

@SentinelResource(value = "getOrderDowngradeErrorType", fallback = "getOrderDowngradeErrorTypeFallback")
@RequestMapping("/getOrderDowngradeErrorType")
public String getOrderDowngradeErrorType(int age) {int j = 1 / age;return "正常执行我们的业务逻辑";
}public String getOrderDowngradeErrorTypeFallback(int age) {return "服务降级啦,当前服务器请求次数过多,请稍后重试!";
}

异常的次数

image-20221126105817163

当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

服务降级解耦

传统的降级方式是通过@SentinelResource注解以及里面的fallback属性来实现的,这种方式比较大的问题是注解与接口依旧有一定耦合,需要让降级与接口完全隔离,这时我们可以通过openFeign声明的接口进行实现来达到目的,下面介绍一下通过实现类的方式实现

被调用方接口服务,业务中故意包含报错

image-20221126112123481

调用方api层,调用本微服务中声明的需要被调用的user服务

image-20221126112504661

调用方声明的UserService接口

image-20221126112744073

调用方的服务降级实现类UserFallbackServiceImpl,这里需要注意的是一定要记得加@Component,否则会导致项目都无法启动

image-20221126112932427

测试

浏览器中访问接口,提示自定义的降级信息,成功实现

image-20221126113140594

相关内容

热门资讯

南开大学专业排名最新或2023... 南开大学专业排名最新或2023(历届)招生优势专业南开大学各专业排名是多少? 南开大学的各类专业排名...
最新或2023(历届)六一儿童... 六一儿童节的作文怎样写?下面是小编提供的范文参考:六月一日是我们儿童们的节日,今年的这一天与以往不同...
最新或2023(历届)快乐的六... 【篇一】明天就是六一儿童节了,妈妈特地上新城给我买了转笔刀。我非常喜欢它,因为它是苹果的形状,我最爱...
最新或2023(历届)难忘的六... 篇一:星期五 雷阵雨 5月23日为了让山区的小朋友过一个快乐的“六一”儿童节,我们班组织了捐文具、玩...
最新或2023(历届)六一儿童... Every day looking forward to the "61" Children has...