sentinel介绍

来源:阿里开源的分布式系统流量控制系统
适用:java编写的程序
功能:限流(单机)/熔断/系统自适应流量控制/访问控制/网关流控/集群流控/热点参数流控


基本工作原理:

  1. 对于每个资源会自动创建一个Entry的对象,对象的作用有:1)流控规则;2)存储资源的情况(RT、调用链、QPS、线程数量、来源信息等);3)统计各个指标的情况(判断是否触发流控规则,并返回是否放行)
  2. 被定义的资源被调用前都会在它的Entry对象中被统计,根据统计的结果来判断是否返回异常;比如最简单是通过try…catch…来开启流控:
//被entry = SphU.entry("资源名称");和entry.exit()包围着的就是被保护的资源的内容
try{
    entry = SphU.entry("资源名称");
    //do something
    } catch (BlockException e){
        //do something(请求触发了流控)
    } finaly {
        entry.exit()
    }

如何进行指标的统计?
统计指标是基于滑动窗口的原理。

  • 当初始化时,会根据当前时间,按照时间窗口的参数生成该资源的时间窗口;
  • 控制时间窗口的参数有两个:sampleCount(定义窗口数量,其越大流控越精确,默认2)和intervalInMs(定义事件窗口长度,默认:1000ms)。根据以上两个参数可以计算得到每个小的时间窗口的ID.
  • 每次请求到达资源时,会根据请求的时间,计算到其落在了哪个时间窗口的ID中。
  • 统计当前时间窗口的请求各项指标是否触发了流控;

各个流控功能参数介绍

单机限流
单机限流可以基于QPS/线程数/调用关系三种方式进行限流
参数详解:

  • resource:资源名,即限流规则的作用对象 count: 限流阈值
  • grade: 限流阈值类型(1:QPS 或0:并发线程数);默认:1
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来;默认:default,即不区分来源
  • strategy: 调用关系限流策略:直接、链路、关联;默认:直接
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队),默认:直接拒绝
  • clusterMode:是否集群模式限流.默认:否

例子:

//基于QPS的限流
//json
//对于“resourceName”这个资源,通过QPS进行限流,不区分请求来源,不开启集群模式;控制资源的QPS为10
{"resource":"resourceName","count":10,"grade":1,"limitApp":"default","strategy":"itself","controlBehavior":"reject","clusterMode":False}
//API
private static void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<FlowRule>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource(KEY);
        // set limit qps to 20
        rule1.setCount(20);
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule1.setLimitApp("default");
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
}
//基于线程数
//JSON
{"resource":"resourceName","count":10,"grade":0,"limitApp":"default","strategy":"itself","controlBehavior":"reject","clusterMode":False}
//API
private static void initFlowRule() {
        List<FlowRule> rules = new ArrayList<FlowRule>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource("methodA");
        // set limit concurrent thread for 'methodA' to 20
        rule1.setCount(20);
        rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);
        rule1.setLimitApp("default");
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
    }
//基于调用关系限流
待补充

熔断
熔断可以基于QPS、错误率和错误数三种方式进行熔断
参数详解:

  • resource:资源名,即限流规则的作用对象
  • count:阈值
  • grade:熔断策略,支持秒级平均RT(DEGRADE_GRADE_RT)、秒级异常比例(DEGRADE_GRADE_EXCEPTION_RATIO)、分钟级异常数(DEGRADE_GRADE_EXCEPTION_COUNT);默认:秒级平均RT
  • timeWindow 降级的时间,单位为 s
  • rtSlowRequestAmount: RT模式下 1 秒内连续多少个请求的平均 RT 超出阈值方可触发熔断; 默认:5
  • minRequestAmount:异常熔断的触发最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断;默认:5

例子:

//基于RT
//JSON
//任意触发如下任意一个条件,开启熔断:1)连续5个请求RT时间超过3500ms,熔断15s;2)1s内的请求数量>=5,且异常比例达到30%,熔断15s;
{"rtTime": 3500, "rtTimeWindow": 15, "exceptionRatio": 0.3, "exceptionTimeWindow": 15}
//API
private void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);
    // set threshold RT, 10 ms
    rule.setCount(10);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);//
    rule.setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

系统自适应流量控制
支持如下阈值:

  • Load:当实例负载超过阈值,并且当前并发线程数超过系统容量触发;系统容量计算方法:maxQpsminRt 计算得出,一般区cpu cores2.5
  • CPU usage
  • 平均RT
  • 并发线程数
  • 入口QPS

例子:

//限流:如下规则任一触发
private static void initSystemRule() {
        List<SystemRule> rules = new ArrayList<SystemRule>();
        SystemRule rule = new SystemRule();
        // max load is 3
        rule.setHighestSystemLoad(3.0);
        // max cpu usage is 60%
        rule.setHighestCpuUsage(0.6);
        // max avg rt of all request is 10 ms
        rule.setAvgRt(10);
        // max total qps is 20
        rule.setQps(20);
        // max parallel working thread is 10
        rule.setMaxThread(10);

        rules.add(rule);
        SystemRuleManager.loadRules(Collections.singletonList(rule));
    }

访问控制
配置项:

  • resource:资源名,即限流规则的作用对象
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式

例子:

private static void initWhiteRules() {
        AuthorityRule rule = new AuthorityRule();
        rule.setResource(RESOURCE_NAME);
        rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
        rule.setLimitApp("appA,appE");
        AuthorityRuleManager.loadRules(Collections.singletonList(rule));
    }

网关流控
待补充
集群流控

原理:

1.两个角色:Token Client和Token Server;
2.Token Client向Token Server询问请求是否放行,Token Server根据资源指标的统计结果,遍历其流控策略,高速Token Client请求是否放行;
3.Token Client和Token Server的通信是通过Netty协议进行通信的。

热点参数流控
参数:

  • resource:资源名
  • count:限流阈值
  • grade:限流模式 默认:QPS 模式
  • durationInSec: 统计窗口时间长度(单位为秒);默认:1s
  • controlBehavior :流控效果(支持快速失败和匀速排队模式),默认:快速失败
  • maxQueueingTimeMs:最大排队等待时长(仅在匀速排队模式生效)默认:0ms
  • paramIdx:热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
  • paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面count 阈值的限制。仅支持基本类型和字符串类型
  • clusterMode 是否是集群参数流控规则 false
  • clusterConfig 集群流控相关配置
    例子:
private static void initParamFlowRules() {
        // QPS mode, threshold is 5 for every frequent "hot spot" parameter in index 0 (the first arg).
        ParamFlowRule rule = new ParamFlowRule(RESOURCE_KEY)
            .setParamIdx(0)
            .setGrade(RuleConstant.FLOW_GRADE_QPS)
            //.setDurationInSec(3)
            //.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
            //.setMaxQueueingTimeMs(600)
            .setCount(5);

        // We can set threshold count for specific parameter value individually.
        // Here we add an exception item. That means: QPS threshold of entries with parameter `PARAM_B` (type: int)
        // in index 0 will be 10, rather than the global threshold (5).
        ParamFlowItem item = new ParamFlowItem().setObject(String.valueOf(PARAM_B))
            .setClassType(int.class.getName())
            .setCount(10);
        rule.setParamFlowItemList(Collections.singletonList(item));
        ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值