概述
来源:阿里开源的分布式系统流量控制系统
适用:java编写的程序
功能:限流(单机)/熔断/系统自适应流量控制/访问控制/网关流控/集群流控/热点参数流控
基本工作原理:
- 对于每个资源会自动创建一个Entry的对象,对象的作用有:1)流控规则;2)存储资源的情况(RT、调用链、QPS、线程数量、来源信息等);3)统计各个指标的情况(判断是否触发流控规则,并返回是否放行)
- 被定义的资源被调用前都会在它的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));
}
最后
以上就是快乐柚子为你收集整理的sentinel介绍的全部内容,希望文章能够帮你解决sentinel介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复