一、快速开始
Sentinel
的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。
Sentinel
支持以下几种规则:流量控制规则
、熔断降级规则
、系统保护规则
、来源访问控制规则
和 热点参数规则
。
二、规则的种类
1. 限流控制规则 (FlowRule)
- 重要属性:同一个资源可以同时有多个限流规则。
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | åå限流阈值类型,QPS 或线程数模式 | QPS 模式 |
limitApp | 流控针对的调用来源 | default ,代表不区分调用来源 |
strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) |
controlBehavior | 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 | 直接拒绝 |
1.1 通过代码定义流量控制规则
package cn.calvin.alibaba.sentinel.config;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
/**
* Sentinel 流控规则配置
*
* @author Calvin
* @date 2021/9/14
* @since v1.0.0
*/
@Slf4j
@Configuration
public class SentinelRulesConfig {
// 定义资源名称
private static final String RESOURCE_NAME = "/api/v1/user/getById";
/**
* 初始化流控规则
*/
@PostConstruct
public void initFlowRules() {
// 添加: 流控规则
List<FlowRule> rules = new ArrayList<>();
// 构建流控规则: 资源名称、QPS规则、阈值(每秒最多只能通过1个请求。)
FlowRule flowRule = this.flowRuleBuild(RESOURCE_NAME, RuleConstant.FLOW_GRADE_QPS, 1);
rules.add(flowRule);
// 加载配置好的规则
FlowRuleManager.loadRules(rules);
log.info(">>>>>>>>> 初始化流控规则: {} >>>>>>>>>", rules);
}
/**
* 流控规则构建
*
* @param resourceName 资源名称
* @param grade 流控规则
* @param count 阈值
* @return {@link FlowRule}
*/
private FlowRule flowRuleBuild(String resourceName, int grade, double count) {
// 创建:流控规则
FlowRule rule = new FlowRule();
// 设置规则对应的【资源名称】
rule.setResource(resourceName);
// 设置流控规则为: QPS
rule.setGrade(grade);
// 设置受保护的资源阈值
rule.setCount(count);
return rule;
}
}
2. 熔断降级规则 (DegradeRule)
熔断降级规则包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
2.1 熔断策略
Sentinel 提供以下几种熔断策略:
慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。
当单位统计时长(
statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例 (
ERROR_RATIO
):当单位统计时长(
statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
2.2 通过代码定义熔断降级规则
package cn.calvin.alibaba.sentinel.config;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
/**
* Sentinel 流控规则配置
*
* @author Calvin
* @date 2021/9/14
* @since v1.0.0
*/
@Slf4j
@Configuration
public class SentinelRulesConfig {
// 定义资源名称
private static final String RESOURCE_NAME = "/api/v1/user/getById";
/**
* 初始化熔断降级规则
*/
@PostConstruct
public void initDegradeRules() {
// 添加:熔断降级规则
List<DegradeRule> rules = new ArrayList<>();
// 构建熔断降级规则:资源名称、异常数策略(慢调用比例规则)、阈值为: 异常数为2个 、触发熔断最小请求数:2个、统计时间长:1分钟
DegradeRule rule = this.degradeRuleBuild(
RESOURCE_NAME,
RuleConstant.DEGRADE_DEFAULT_SLOW_REQUEST_AMOUNT,
2,
2,
60 * 1000,
10,
0
);
// 规则意思:1分钟内:执行了2次,并且出现了2次异常,就会触发熔断规则,熔断持续时长为10秒。
// - 如果10秒过后,在第一次调用出现了异常,直接进入熔断降级规则。
rules.add(rule);
// 加载配置好的规则
DegradeRuleManager.loadRules(rules);
log.info(">>>>>>>>> 初始化熔断降级规则: {} >>>>>>>>>", rules);
}
/**
* 熔断降级规则构建
*
* @param resourceName 资源名称
* @param grade 熔断降级规则策略:慢调用比例、异常比例数、异常数
* @param count 比例阈值
* @param minRequestAmount 最小请求数
* @param countMs 统计时长
* @param degradeTimes 熔断时长
* @param slowRatioThreshold 慢调用比例阈值
* @return {@link DegradeRule}
*/
private DegradeRule degradeRuleBuild(String resourceName, int grade, double count, int minRequestAmount, int countMs, int degradeTimes, int slowRatioThreshold) {
DegradeRule rule = new DegradeRule();
// 设置规则策略
rule.setGrade(grade);
// 设置慢调用比例阈值,仅慢调用比例模式有效
rule.setSlowRatioThreshold(slowRatioThreshold);
// 设置比例阈值
rule.setCount(count);
// 设置最小请求数
rule.setMinRequestAmount(minRequestAmount);
// 统计时长(单位为 ms)
rule.setTimeWindow(degradeTimes);
// 设置熔断时长,单位为 s
rule.setStatIntervalMs(countMs);
// 设置规则对应的【资源名称】
rule.setResource(resourceName);
return rule;
}
}
更多详情可以参考 熔断降级。
3. 系统保护规则 (SystemRule)
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统规则包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
highestSystemLoad | load1 触发值,用于触发自适应控制阶段 | -1 (不生效) |
avgRt | 所有入口流量的平均响应时间 | -1 (不生效) |
maxThread | 入口流量的最大并发数 | -1 (不生效) |
qps | 所有入口资源的 QPS | -1 (不生效) |
highestCpuUsage | 当前系统的 CPU 使用率(0.0-1.0) | -1 (不生效) |
理解上面规则的定义之后,我们可以通过调用 SystemRuleManager.loadRules()
方法来用硬编码的方式定义流量控制规则:
private void initSystemProtectionRule() {
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);
}
更多详情可以参考 系统自适应保护。
4. 访问控制规则 (AuthorityRule)
很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(origin
)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
授权规则,即黑白名单规则(AuthorityRule
)非常简单,主要有以下配置项:
resource
:资源名,即限流规则的作用对象limitApp
:对应的黑名单/白名单,不同 origin 用,
分隔,如appA,appB
strategy
:限制模式,AUTHORITY_WHITE
为白名单模式,AUTHORITY_BLACK
为黑名单模式,默认为白名单模式
更多详情可以参考 来源访问控制。
5. 热点规则 (ParamFlowRule)
详情可以参考 热点参数限流。