分布式流量控制方案Sentinel:熔断演示

| 分类 分布式系统  | 标签 Spring  Sentinel  限流  熔断  时间窗  滑动窗口  分布式  高可用  微服务  责任链  设计模式  Guava  RateLimiter  令牌桶算法  限流器  Hystrix 

Sentinel 的熔断机制支持三种策略:0-慢调用比例、1-异常比例、2-异常笔数

熔断功能测试对应的Controller 如下所示

    // 熔断
    // http://localhost:8880/test/degrade
    @SuppressWarnings("static-access")
    @SentinelResource(value = "degradeResource", blockHandler = "degradeBlockHandler", fallback = "degradeFallback")
    @RequestMapping("/degrade")
    @ResponseBody
    public String degrade(@RequestBody String request) throws InterruptedException {
        Thread.currentThread().sleep(25);   // 模拟慢响应
        System.out.println(request);
        return "This is Degrade Page";
    }
    
    // 返回值类型必须与原函数返回值类型一致;
    // 方法参数列表需要和原函数一致,或者可以额外多一个 BlockException 类型的参数用于接收对应的异常。
    public String degradeBlockHandler(@RequestBody String request, BlockException ex) {
        return "degradeBlockHandler";
    }
    
    // 返回值类型必须与原函数返回值类型一致;
    // 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    public String degradeFallback(@RequestBody String request, Throwable throwable) {
        return "degradeFallback";
    }

yml 熔断规则配置如下

sentinel:
  degrade:
    rules: "[{'resource':'degradeResource', 'grade':'0', 'minRequestAmount':'3', 'count':'20', 'timeWindow':'20', 'statIntervalMs':'10000'}]"

该条规则的解释为

  • grade=0表示按照慢调用比例策略熔断
  • minRequestAmount=3表示请求数超过3之后才可能触发熔断
  • count=20表示超过20ms 的识别为慢响应
  • timeWindow=20表示熔断时长为20s
  • statIntervalMs表示统计窗口长度为10000ms

使用Postman 发起请求,请求到第四次的时候就满足了上面配置的慢调用的规则,触发blockHandler = “degradeBlockHandler” 的回调

fallback 功能测试

Sentinel 支持通过@SentinelResource 注解定义资源并配置blockHandler 和fallback 函数来进行限流之后的处理。注意blockHandler 函数会在原方法被限流/降级/系统保护的时候调用,而fallback 函数会针对所有类型的异常

如果把degrade 姐哦哭修改为如下方式,无脑抛出一个自定义异常

    // 熔断
    // http://localhost:8880/test/degrade
    @SentinelResource(value = "degradeResource", blockHandler = "degradeBlockHandler", fallback = "degradeFallback")
    @RequestMapping("/degrade")
    @ResponseBody
    public String degrade(@RequestBody String request) throws InterruptedException {
        throw new ExceptionMain();

    }

使用Postman 发起一次请求,就会导致触发fallback = “degradeFallback” 的回调




如果本篇文章对您有所帮助,您可以通过微信(左)或支付宝(右)对作者进行打赏!


上一篇     下一篇