-
Notifications
You must be signed in to change notification settings - Fork 8.2k
How to Use
使用sentinel来进行资源保护,主要分为两个步骤:
- 定义资源
- 定义规则
这里的原则是,先把可能需要保护的资源定义好,之后再配置规则。我们也可以理解为,只要有了资源,我们就可以灵活的定义各种流量控制规则。我们在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
对于主流的框架,我们提供适配,只需要按照适配中的说明配置,sentinel就会默认为它们定义资源。
public void c(){
Entry entry = null;
// 务必保证finally会被执行
try{
// 资源名可使用任意有业务语义的字符串
entry = SphU.entry("自定义资源名");
/**
* 被保护的业务逻辑
*/
} catch (BlockException e1) {
//授权阻止,被限流或被降级
/**
* 异常抛出,或处理
*/
}finally{
if(entry != null){
entry.exit();
}
}
}public void d(){
// 资源名可使用任意有业务语义的字符串
if(SphO.entry("自定义资源名")){
// 务必保证finally会被执行
try {
/**
* 被保护的业务逻辑
*/
} finally {
SphO.exit();
}
}else{
//授权阻止,被限流或被降级
/**
* 异常抛出,或处理
*/
}
}
SentinelUtil.isBlockException(Throwable t);参见: 主流框架的支持
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供用户来定制自己的规则策略。
Sentinel 支持三种规则:流量控制规则、熔断降级规则以及系统保护规则。
重要的属性:
| field | 说明 | 默认值 |
|---|---|---|
| resource | 资源名,资源名是限流规则的作用对象 | |
| count | 限流阈值 | |
| grade | 限流阈值类型,是按照 QPS 还是线程数 | 默认根据 QPS |
| limitApp | 是否根据调用者来限流 | 否 |
| strategy | 判断的根据是资源自身,还是根据其它资源 (refResource),还是根据链路入口 (refResource) | 根据资源本身 |
| controlBehavior | 发生拦截后是直接拒绝,还是排队等待,还是慢启动模式 | 直接拒绝 |
同一个资源可以同时有多个限流规则。
理解上面规则的定义之后,我们可以通过调用API:FlowRuleManager.loadRules()来硬编码的定义流量控制规则
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);
}更多的详细内容可以参见: 流量控制
规则包含下面几个重要的属性:
| field | 说明 | 默认值 |
|---|---|---|
| resource | 资源名,资源名是限流规则的作用对象 | |
| count | 限流阈值 | |
| grade | 根据RT降级还是根据异常比例降级 | RT |
| timeWindow | 降级的时间 |
同一个资源可以同时有多个降级规则。 理解上面规则的定义之后,我们可以通过调用API:DegradeRuleManager.loadRules()来硬编码的定义流量控制规则
private static void initDegradeRule() {
List<DegradeRule> rules = new ArrayList<DegradeRule>();
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);
}更多详情可以参考:熔断降级
规则包含下面几个重要的属性:
| field | 说明 | 默认值 |
|---|---|---|
| highestSystemLoad | 最大的Load1 | -1(不生效) |
| avgRt | 所有入口流量的平均相应时间 | -1(不生效) |
| maxThread | 入口流量的最大并发数 | -1(不生效) |
理解上面规则的定义之后,我们可以通过调用API:SystemRuleManager.loadRules()来硬编码的定义流量控制规则
private static void initDegradeRule() {
List<SystemRule> rules = new ArrayList<SystemRule>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}更多详情可以参考:系统负载保护
运行下面命令,则会返回现有生效的规则:
curl http://localhost:8719/getRules?type=<XXXX>其中,type=flow 以 JSON 格式返回现有的限流塑形规则;degrade 则返回现有生效的降级规则列表;system 则返回系统保护规则。
我们同时也可以通过下面命令,来修改已有规则:
curl http://localhost:8719/setRules?type=<XXXX>&data=<DATA>其中,type 可以输入 flow、degrade 等方式来制定更改的规则种类,data 则是对应的 JSON 格式的规则。
上面的规则配置,都是出于内存状态的。即如果应用发生了重启,这个规则就会失效。我们提供了开放的接口。你可以通过实现 DataSource 的方式,来自定义自己的持久化规则。通常我们的建议有:
- 整合 Diamond,动态的实时刷新配置规则
- 结合 SQL、GitHub 等来实现该规则
- 配合 Dashboard 使用
更多的详情请参见: 动态规则配置
-
文档
-
Documents
- Read Me
- Introduction
- How to Use
- How it Works
- Flow Control
- Parameter Flow Control
- Cluster Flow Control
- API Gateway Flow Control
- Circuit Breaking
- Adaptive System Protection
- Metrics
- General Configuration
- Dynamic Rule Configuration
- Dashboard
- Integrations with open-source frameworks
- Contribution Guideline