Sentinel规则

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;

}