1、Sentinel控制台UI功能
Sentinel控制台UI功能:
菜单名称 | 概述 | 用法 | 其他 |
---|---|---|---|
实时监控 | 采集当前资源的限流信息 | 观察 | |
簇点链路 | 把代码中植入的资源上报 | 统一熔断、限流 | 自动上报功能,很棒 |
流控规则 | 限流 | 根据资源, 支持访问资源的QPS和访问资源的线程数限流 | 一般是限制 QPS |
降级规则 | 熔断降级 | 根据资源,请求超时、异常、数超阈值熔断 | 异于hystrix,时间窗口后直接恢复 |
热点规则 | - | - | - |
系统规则 | - | - | - |
授权规则 | - | - | - |
集群流控 | 见名知意 | - | - |
机器列表 | 见名知意 | - | - |
2、五类管控规则
基于Sentinel 1.8.1编写,目前支持的五种管控规则:
2.1、流控规则
参考:https://github.com/alibaba/Sentinel/wiki/流量控制
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型(QPS 或 并发线程数) | QPS |
limitApp | 流控针对的调用来源 | 若为 default 则不区分调用来源 |
strategy | 判断的根据是资源自身,还是根据其它关联资源(refResource),还是根据链路入口 | 根据资源本身 |
controlBehavior | 流量控制效果(直接拒绝、Warm Up、匀速排队)) | 直接拒绝 |
/**
* 初始化流控规则
*/
private void initFlowRules() {
//定义流控规则
FlowRule flowRule = new FlowRule();
flowRule.setResource(SentinelResourceKey.getUserPassById);//资源名
flowRule.setCount(1);//限流阈值
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//阈值类型
flowRule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);//流控针对的调用来源
flowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);//流控效果
// 加载规则
List<FlowRule> rules = new ArrayList<>();
rules.add(flowRule);
FlowRuleManager.loadRules(rules);
}
2.2、降级规则
参考:https://github.com/alibaba/Sentinel/wiki/熔断降级
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即限流规则的作用对象 | |
count | 熔断阈值(最大RT / 比例阈值 / 异常数) | |
grade | 熔断策略(慢调用比例 / 异常比例 / 异常数) | |
limitApp | 熔断针对的调用来源 | 若为 default 则不区分调用来源 |
timeWindow | 熔断时长,单位秒 | |
rtSlowRequestAmount | 慢调用比例阈值,仅慢调用比例模式有效 | |
minRequestAmount | 最小请求数 |
/**
* 初始化降级规则
*/
private void initDegradeRules() {
//定义规则
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource(SentinelResourceKey.getUserPassById);//资源名
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);//熔断策略 RT
degradeRule.setCount(10);//最大RT(单位ms) / 比例阈值 / 异常数
degradeRule.setTimeWindow(60);//熔断时长,单位秒
degradeRule.setRtSlowRequestAmount(1);//慢调用比例阈值,仅慢调用比例模式有效
degradeRule.setMinRequestAmount(1);//最小请求数
// 加载规则
List<DegradeRule> rules = new ArrayList<>();
rules.add(degradeRule);
DegradeRuleManager.loadRules(rules);
}
2.3、热点规则
参考:https://github.com/alibaba/Sentinel/wiki/热点参数限流
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade | 限流模式 | QPS 模式 |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
limitApp | 针对的调用来源 | 若为 default 则不区分调用来源 |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx | 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 | |
paramFlowItemList | 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型 | |
clusterMode | 是否是集群参数流控规则 | false |
clusterConfig | 集群流控相关配置 |
/**
* 初始化热点规则
*/
private void initParamFlowRules() {
//定义规则
ParamFlowRule paramFlowRule = new ParamFlowRule();
paramFlowRule.setResource(SentinelResourceKey.getUserPassById);//资源名
paramFlowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//阈值类型,只支持QPS模式
paramFlowRule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);//针对的调用来源
paramFlowRule.setCount(10);//阈值
paramFlowRule.setParamIdx(0);//指配热点参数的下标
paramFlowRule.setDurationInSec(10);//统计窗口时间长度,单位秒
// 加载规则
List<ParamFlowRule> rules = new ArrayList<>();
rules.add(paramFlowRule);
ParamFlowRuleManager.loadRules(rules);
}
2.4、系统规则
参考:https://github.com/alibaba/Sentinel/wiki/系统自适应限流
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
Field | 说明 | 默认值 |
---|---|---|
highestSystemLoad | 最大的load1 | |
highestCpuUsage | 所有入口流量的最大CPU使用率 | [0-1]的小数,代表百分比 |
avgRt | 所有入口流量的平均响应时间,单位秒 | |
qps | 所有资源入口的QPS | |
maxThread | 所有资源入口的最大并发线程数 |
/**
* 初始化系统自适应规则
*/
private void initSystemRules() {
//定义规则
SystemRule systemRule = new SystemRule();
//支持5种控制维度
systemRule.setHighestSystemLoad(20);//最大的load1
systemRule.setHighestCpuUsage(0.7);//所有入口流量的最大CPU使用率([0-1]的小数,代表百分比)
systemRule.setAvgRt(10);//所有入口流量的平均响应时间,单位ms毫秒
systemRule.setQps(100);//所有资源入口的QPS
systemRule.setMaxThread(60);//所有资源入口的最大并发线程数
// 加载规则
List<SystemRule> rules = new ArrayList<>();
rules.add(systemRule);
SystemRuleManager.loadRules(rules);
}
2.5、授权规则
参考:https://github.com/alibaba/Sentinel/wiki/黑白名单控制
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即限流规则的作用对象 | |
strategy | 限制模式(白名单 / 黑名单) | 白名单 |
limitApp | 针对的调用来源 | 若为 default 则不区分调用来源 |
/**
* 初始化授权规则
*/
private void initAuthorityRules() {
//定义规则
AuthorityRule authorityRule = new AuthorityRule();
authorityRule.setResource(SentinelResourceKey.getUserPassById);//资源名
authorityRule.setStrategy(RuleConstant.AUTHORITY_WHITE);//限制模式:白名单 / 黑名单
authorityRule.setLimitApp("appA,appB");//针对的调用来源,不同origin用 , 分隔,如 appA,appB
// 加载规则
List<AuthorityRule> rules = new ArrayList<>();
rules.add(authorityRule);
AuthorityRuleManager.loadRules(rules);
}