7. 熔断降级
Sentinel除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException
)。
Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
由于网络或者自身的原因,我们的服务并不能保证100%可用,如果某个服务出现问题,调用这个服务就会出现阻塞的现象,此时,如果有大量请求涌入,线程资源就会消耗殆尽,导致微服务整体瘫痪,这时我们就要考虑服务不可用时的处理方式,也就是熔断和降级。我们先说降级。我们关闭nacos-server服务来制造这种场景。
限流降级指标有三个,如下图:
-
慢调用比例
-
异常比例
-
异常数
7.1. 慢调用比例
慢调用比例 (DEGRADE_GRADE_RT
):当资源的平均响应时间超过阈值(DegradeRule
中的 count
,以 ms 为单位,默认上限是4900ms)之后,资源进入准降级状态。如果1s之内持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下来的时间窗口(DegradeRule
中的 timeWindow
,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException
)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断。
7.1.1.配置中心:超时时间100ms,熔断时间10s
[
{
"resource":"/sentinelTest/sayHello",
"grade": 0,
"count": 100,
"timeWindow": 10,
"minRequestAmount": 5
}
]
7.1.2.项目中增加 配置
spring.cloud.sentinel.datasource.ds-degrade.nacos.server-addr=127.0.0.1:8848
spring.cloud.sentinel.datasource.ds-degrade.nacos.data-id=${spring.application.name}-sentinel-degrade
spring.cloud.sentinel.datasource.ds-degrade.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds-degrade.nacos.rule-type=degrade
spring.cloud.sentinel.datasource.ds-degrade.nacos.data-type=json