Sentinel规则
Sentinel整体架构如下
图里从下往上可以看到,核心的部分包含 规则(rules)
、 处理插槽(slot)
、 调用链路(invocation tree)
、 集群节点(cluster node)
、 滑动窗口(slading winodw)
5部分。
(1) 规则(rules)是什么
Sentinel里rules包含 流控规则(Flow Rule)、熔断规则( ) 等
//
(2) 是怎么做的
//
(3) 源码解读
(3.1) 限流配置管理-FlowRuleManager
FlowRuleManager对象主要职责是管理资源的限流配置
资源对应的流控配置保存在 Map<String, List<FlowRule>> flowRules
package com.alibaba.csp.sentinel.slots.block.flow;
/**
* 一个资源可以有多个规则/配置。这些规则按以下顺序生效:
* 来自指定呼叫方的请求
* 没有指定的调用者
*/
public class FlowRuleManager {
/** 资源和对应限流配置集合 重要 */
private static volatile Map<String, List<FlowRule>> flowRules = new HashMap<>();
private static final FlowPropertyListener LISTENER = new FlowPropertyListener();
/** */
private static SentinelProperty<List<FlowRule>> currentProperty = new DynamicSentinelProperty<List<FlowRule>>();
/**
* 定时任务线程池
* SCHEDULER 的 corePool size 必须设置为 1,这样两个任务startMetricTimerListener()才能由SCHEDULER有序运行
*/
@SuppressWarnings("PMD.ThreadPoolCreationRule")
private static final ScheduledExecutorService SCHEDULER = Executors.newScheduledThreadPool(1,
new NamedThreadFactory("sentinel-metrics-record-task", true));
static {
currentProperty.addListener(LISTENER);
startMetricTimerListener();
}
}
这里用到了观察者模式,DynamicSentinelProperty
是被观察者,FlowRuleManager
是观察者,FlowRuleManager观察到配置变更后会通过configUpdate
方法更新配置信息。
(3.1.1) 限流规则对象-FlowRule
FlowRule对象的主要用来存配置信息
package com.alibaba.csp.sentinel.slots.block.flow;
public class FlowRule extends AbstractRule {
public FlowRule() {
super();
setLimitApp(RuleConstant.LIMIT_APP_DEFAULT);
}
/**
* 流控类型 0:线程数限流 1:QPS限流
* 默认使用 QPS限流
*/
private int grade = RuleConstant.FLOW_GRADE_QPS;
/**
* 流量控制阈值。
*/
private double count;
/**
* 限流策略
* 基于调用链的流量控制策略。
*
* {@link RuleConstant#STRATEGY_DIRECT} 直接限流 (by origin);
* {@link RuleConstant#STRATEGY_RELATE} 关联限流 (with relevant resource);
* {@link RuleConstant#STRATEGY_CHAIN} 链路限流 (by entrance resource).
*/
private int strategy = RuleConstant.STRATEGY_DIRECT;
/**
* 具有相关资源或上下文的流量控制中的参考资源。
*/
private String refResource;
/**
* 流控效果
*
* 0.直接拒绝(reject directly)
* 1.热启动(warm up)
* 2. 匀速排队(rate limiter)
* 3. 热启动 + 匀速排队 warm up + rate limiter
*/
private int controlBehavior = RuleConstant.CONTROL_BEHAVIOR_DEFAULT;
/**
* 流控效果为预热启动时的预热时长
* 默认10s
*/
private int warmUpPeriodSec = 10;
/**
* 流控效果为排队等待时的等待时长
* 默认500
*/
private int maxQueueingTimeMs = 500;
/**
* 集群模式
*/
private boolean clusterMode;
/**
* 集群模式的流规则配置。
*/
private ClusterFlowConfig clusterConfig;
/**
* 流量整形(节流)控制器。
*/
private TrafficShapingController controller;
}
public abstract class AbstractRule implements Rule {
/**
* 规则id
*/
private Long id;
/**
* 规则名称
*/
private String resource;
/**
* 将受来源限制的应用程序名称。
* 默认的limitApp是"default",即允许所有源应用。
*
* 对于权限规则,多个源名称可以用逗号(',')分隔。
*/
private String limitApp;
}