Alibaba Sentinel降级规则(1.8.0 及以上版本)

服务降级

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(比如:调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败返回,避免影响到其他资源而导致级联错误。

当资源被降级后,在接下来的时间窗口之内,对资源的调用都自动熔断。

1.降级策略:慢调用比例(SLOW_REQUEST_RATIO)

慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该RT值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且慢调用的比例大于设置的比例阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用RT值则结束熔断,若大于设置的慢调用RT值则会再次会被熔断。

1.编写controller类

    @GetMapping("/getBody6_1")
    public String getBody6_1(){
        try {
            TimeUnit.SECONDS.sleep(1);//睡眠1秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "getBody6_1";
    }

2.新增熔断规则:
在这里插入图片描述
说明:在1000毫秒内,当请求数大于5,接口响应时间大于800ms,慢调用比例达到100%时,接下来的20秒内自动开启熔断。

补充:整合nacos后,下发配置对应的内容如下:

[
     {
        "resource": "/getBody6_1",//资源名
        "grade": 0,//熔断策略,0-慢调用比例
        "count": 800,//最大RT
        "slowRatioThreshold": 1,//比例阈值
        "timeWindow": 20,//熔断时长
        "minRequestAmount": 5,//最小请求数
        "statIntervalMs": 1000//统计时长
    }
]

3.使用JMeter压测工具,让1秒内请求接口(http://localhost:9001/getBody6_1)10次,这时Sentinel就开启了熔断。

4.使用浏览器请求:http://localhost:9001/getBody6_1
在这里插入图片描述

2.降级策略:异常比例(ERROR_RATIO)

异常比例:当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且异常比例大于设置的比例阈值,则接下来的熔断时长内请求自动会被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功(无异常)则结束熔断,否则会再次被熔断。

1.编写controller类

    @GetMapping("/getBody6_2")
    public String getBody6_2(Integer id){
        if(id != null && id < 0){
            throw new RuntimeException("运行异常");
        }
        return "getBody6_2";
    }

2.新增熔断规则:
在这里插入图片描述
说明:在1000毫秒内,当请求数大于5且异常比例达到阈值50%时,接下来的20秒内自动开启熔断。

补充:整合nacos后,下发配置对应的内容如下:

[
     {
        "resource": "/getBody6_2",//资源名
        "grade": 1,//熔断策略:1-异常比例
        "count": 0.5,//比例阈值
        "timeWindow": 20,//熔断时长
        "minRequestAmount": 5,//最小请求数
        "statIntervalMs": 1000//统计时长
    }
]

3.使用浏览器请求:http://localhost:9001/getBody6_2?id=-1
在这里插入图片描述

3.降级策略:异常数(ERROR_COUNT)

当单位统计时长(statIntervalMs)内请求数大于设置的最小请求数,并且异常数大于设置的异常数,则接下来的熔断时长内请求自动会被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功(无异常)则结束熔断,否则会再次被熔断。

1.仍然使用上面的controller类

2.新增熔断规则:
在这里插入图片描述
说明:在1000毫秒内,当请求数大于5且异常数达到5时,接下来的20秒内自动开启熔断。

补充:整合nacos后,下发配置对应的内容如下:

[
     {
        "resource": "/getBody6_2",//资源名
        "grade": 2,//熔断策略:2-异常数
        "count": 5,//异常数
        "timeWindow": 20,//熔断时长
        "minRequestAmount": 5,//最小请求数
        "statIntervalMs": 1000//统计时长
    }
]

3.使用浏览器请求:http://localhost:9001/getBody6_2?id=-4,快速刷新页面,就会出现熔断。
在这里插入图片描述
4.当20秒后,如果使用浏览器请求:http://localhost:9001/getBody6_2?id=0,接口访问正常,说明熔断结束。如果使用浏览器请求:http://localhost:9001/getBody6_2?id=-4,接口访问异常,再次访问熔断自动开始。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Sentinel 是一款开源的分布式系统防护组件,主要用于服务的流量控制、熔断降级和系统负载保护等。Sentinel 提供了一种基于注解和 API 的自定义限流方式。 自定义限流的主要步骤如下: 1. 定义资源名:在 Sentinel 中,资源是需要受到限流保护的对象。可以使用 `@SentinelResource` 注解来定义资源名。 ```java @SentinelResource(value = "myResource", blockHandler = "handleBlock") public void myMethod() { // 方法逻辑 } // 定义限流规则 private void handleBlock(BlockException ex) { // 处理限流逻辑 } ``` 2. 配置限流规则:通过 Sentinel Dashboard 或者代码方式配置限流规则,即设置每个资源的 QPS 阈值、流控模式等。 3. 触发限流:当资源的访问量超过限流规则中的阈值时,Sentinel 会触发限流,执行 blockHandler 中定义的逻辑。 以上是基于注解的方式,如果希望基于 API 进行自定义限流,可以使用 Sentinel 提供的 `SphU` 和 `Tracer` 等类进行手动埋点和统计。例如: ```java // 定义资源名 String resourceName = "myResource"; // 手动埋点 Entry entry = null; try { entry = SphU.entry(resourceName); // 执行业务逻辑 } catch (BlockException ex) { // 处理限流逻辑 } finally { if (entry != null) { entry.exit(); } } // 手动统计指标 Tracer.traceCount(resourceName, 1); ``` 通过自定义限流,可以灵活地根据业务需要对不同的资源进行限流保护,提高系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值