Skip to content

How to Use

jialianglinjl edited this page Jul 19, 2018 · 36 revisions

简介

使用sentinel来进行资源保护,主要分为两个步骤:

  1. 定义资源
  2. 定义规则

这里的原则是,先把可能需要保护的资源定义好,之后再配置规则。我们也可以理解为,只要有了资源,我们就可以灵活的定义各种流量控制规则。我们在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

对于主流的框架,我们提供适配,只需要按照适配中的说明配置,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 支持三种规则:流量控制规则熔断降级规则以及系统保护规则

流量控制规则 (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