Sentinel 降级规则模块

117 阅读3分钟

Sentinel 降级规则模块

流控是对外部来的⼤流量进⾏控制,熔断降级的视⻆是对内部问题进⾏处理。

Sentinel 降级会在调⽤链路中某个资源出现不稳定状态时(例如调⽤超时或异常⽐
例升⾼),对这个资源的调⽤进⾏限制,让请求快速失败,避免影响到其它的资源
⽽导致级联错误。当资源被降级后,在接下来的降级时间窗⼝之内,对该资源的调
⽤都⾃动熔断。

Sentinel不会像Hystrix那样放过⼀个请求尝试⾃我修复,就是明明确确按照时间窗
⼝来,熔断触发后,时间窗⼝内拒绝请求,时间窗⼝后就恢复。

RT

平均响应时间

当 1s 内持续进⼊ >=5 个请求,平均响应时间超过阈值(以 ms 为单位),那么在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地熔断(抛出 DegradeException)。

注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -
Dcsp.sentinel.statistic.max.rt=xxx 来配置。

配置一下简单测试

在这里插入图片描述


    @GetMapping("/api/tests")
    public String viewconfig(String str) {
        int i = new Random(System.currentTimeMillis()).nextInt(5);

        try {
            Thread.sleep(i*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return str +" : tests  " + LocalDateTime.now();
    }

正常请求
在这里插入图片描述

熔断后,等待5s后才能正常请求
在这里插入图片描述

这里我处理了熔断请求返回信息

    //熔断后限流提示
    @ExceptionHandler(BlockException.class)
    @ResponseBody
    public String DegradeException(BlockException e) {
        AbstractRule rule = e.getRule();
        logger.info("Blocked by Sentinel: {}", rule.toString());
        return "{\"msg\":\"请求繁忙,请稍后再试!\",\"code\":401}";
    }

当然如果再请求时候,当然也会触发限流策略

异常⽐例

当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的⽐值超过阈值之后,
资源进⼊降级状态,即在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调
⽤都会⾃动地返回。异常⽐率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。

在这里插入图片描述

同样的会熔断

在这里插入图片描述

异常数

和异常比例几乎一致,只是这个侧重数量。

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

在这里插入图片描述

Sentinel ⾃定义兜底逻辑

@SentinelResource注解类似于Hystrix中的@HystrixCommand注解

@SentinelResource注解中有两个属性需要我们进⾏区分,blockHandler属性⽤来指定不满⾜Sentinel规则的降级兜底⽅法,fallback属性⽤于指定Java运⾏时异常兜底⽅法

指定方法内熔断

@RestController
@RequestMapping("/api")
public class Test3Controller {


    //异常熔断测试
    @GetMapping("/tests3")
    @SentinelResource(value = "tests3",blockHandler = "blockHandlerVoid")
    public String tests3(String str) {
         int  i = 1/0;
        return str +" : tests  " + LocalDateTime.now();
    }

    public String blockHandlerVoid(String str, BlockException e){

        return "blockHandlerVoid...";
    }

}

先请求,再sentinel控制台中设置
可以看到我们定义的请求名
在这里插入图片描述

设置熔断
在这里插入图片描述

请求测试,自定义返回的熔断信息

在这里插入图片描述

抽出类

代码中默认会抛出异常,但是我们自定义了异常处理,所以请求会处理异常

在这里插入图片描述

同理,请求名
在这里插入图片描述
设置规则
在这里插入图片描述

请求测试熔断返回

在这里插入图片描述

fegin调用降级

引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

main方法开启fegin
@EnableFeignClients

测试接口

   @GetMapping("/api/feginTest2")
    public String feginTest2(String str) {
        return feginTest.getConfig() + " : " + LocalDateTime.now();
    }

服务

@FeignClient(value = "nacos-config-8098",
        fallback = ResumeFallback.class,

        path = "/config")
public interface FeginTest {

    @RequestMapping(value = "/viewconfig",method= RequestMethod.GET)
    String getConfig();
}

FeginTest接口降级策略

@Component  // 别忘了这个注解,还应该被扫描到
public class ResumeFallback implements FeginTest {

    @Override
    public String getConfig() {
        return "getConfig 降级...";
    }
}

nacos-config-8098我们暂时不启动,直接调用

可以看到降级

在这里插入图片描述
当然我们正确请求我们的配置服务,如下
在这里插入图片描述

最后

介绍了Sentinel 的降级,熔断配置和使用
以及介绍了配合fegin 使用是如何降级的。