Skip to content

How to Use

jialianglinjl edited this page Jul 19, 2018 · 36 revisions

Introduction

There are mainly 2 steps to use Sentinel:

  1. Define resource
  2. Define rules

These two steps don’t have to be synchronized. As long as the resources are defined, you can add rules as necessary. Resources can be applied to multiple rules simultaneously.

Sentinel provides adaptions to popular frameworks as well. Services and methods provided by these framework are defined as resources by default after introduce the adapter extension.

定义资源

抛出异常的方式定义资源

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 支持三种规则:流量控制规则熔断降级规则以及系统保护规则

流量控制规则 (FlowRule)

流量规则的定义:

重要的属性:

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);
    }

更多的详细内容可以参见: 流量控制

熔断降级降级规则 (DegradeRule)

规则包含下面几个重要的属性:

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);
    }

更多详情可以参考:熔断降级

系统保护规则 (SystemRule)

规则包含下面几个重要的属性:

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 可以输入 flowdegrade 等方式来制定更改的规则种类,data 则是对应的 JSON 格式的规则。

定制自己的持久化规则

上面的规则配置,都是出于内存状态的。即如果应用发生了重启,这个规则就会失效。我们提供了开放的接口。你可以通过实现 DataSource 的方式,来自定义自己的持久化规则。通常我们的建议有:

  1. 整合 Diamond,动态的实时刷新配置规则
  2. 结合 SQL、GitHub 等来实现该规则
  3. 配合 Dashboard 使用

更多的详情请参见: 动态规则配置

Clone this wiki locally