SpringCloud-Alibaba学习(十一):Sentinel熔断降级及其他规则

1、Sentinel熔断降级

文档:
https://github.com/alibaba/Sentinel/wiki/熔断降级

熔断策略

  • 慢调用比例
    • 请求的响应时间大于设置的 RT 即为慢调用
    • 单位时间慢调用的比例大于阈值时,进行熔断
    • 单位时间请求数需要大于设置的最小请求数才生效(最小 5)
    • 熔断后经过熔断时长后会进入探测恢复状态,发起一个请求,请求超时继续熔断,否则恢复
  • 异常比例
    • 单位时间请求数大于最小请求数
    • 发生异常的请求比例大于阈值
  • 异常数
    • 单位统计时长内的异常数目超过阈值后进行熔断
// 模拟接口
@RestController
@RequestMapping("/break")
public class BreakController {

    @GetMapping("/test1")
    public String test1(@RequestParam("type") Integer type) {
        System.out.println("test1");
        if (type == 0) {
            System.out.println("正常接口调用");
        } else {
            if (type == 1) {
                System.out.println("慢调用");
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (type == 2) {
                System.out.println("异常调用");
                throw new RuntimeException("接口发生异常");
            }
        }
        return "test";
    }
}

1.1 慢调用比例

image

image

上面规则为:单位时间内请求响应时间超过 1.5s 的请求大于 3 个时,对接口进行熔断,熔断时间为 10s,单位时间内请求数大于 5 有效

1.2 异常比例

image

1.3 异常数

image

2、热点参数

对资源的指定参数进行限流

触发条件:必须有至少一个参数,参数的值可以任意

注意:仅支持 QPS 限流模式,HTTP 接口不能使用默认的资源名会不生效,需要用 @SentinelResource 定义资源

@RestController
@RequestMapping("/hotKey")
public class HotKeyController {

    @GetMapping("/test")
    @SentinelResource("hotkey-test")
    public String test(String name, Integer age) {
        System.out.println("name:" + name);
        System.out.println("age:" + age);
        return "hotKey";
    }
}

image

指定参数值进行限流,编辑热点规则项,修改高级选项

参数类型目前仅支持基本数据类型和 String 类型,不支持对象类型

image

3、权限规则

官方叫做黑白名单控制

  • 配置了白名单的资源只能允许配置的应用访问,拒绝其他应用的访问
  • 配置了黑名单的资源不允许配置的应用访问,允许其他应用访问

一个资源只能配置一个白名单或黑名单

黑白名单的配置是应用级别(origin)

image

上面规则只是配置给了资源提供方,要想规则生效,还得需要调用方提供请求来源(origin)
服务提供方拦截请求,解析获取 origin,如果 origin 在白名单中就放行,在黑名单中就拦截

a)服务提供方解析来源,这里是从请求头中获取(也可以定义其他请求头)
RequestOriginParser 是 Sentinel 提供的接口

@Component
public class CustomRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String source = httpServletRequest.getHeader("source");
        System.out.println("请求来源:" + source);
        return origin;
    }
}

b)调用方定义传递请求头
通过 feign 提供的拦截器,统一处理

/**
 * 自定义 feign 请求的拦截器,请求发送前执行
 */
@Component
public class CustomRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("source", "cloud-sentinel-demo");
    }
}

4、针对来源流控

默认来源是 default 表示对所有应用生效,可以修改设置为只对指定来源的请求生效。

image

5、系统规则

前文涉及的各种流控规则都是资源(接口)维度的控制,而系统规则是设置整个微服务系统级别的流控规则,粒度更大

posted @ 2022-07-06 17:08  originyuan  阅读(258)  评论(0编辑  收藏  举报