spring cloud alibaba sentinel 代码配置和dashboard页面配置对照

343 阅读3分钟

1.说明

记录一下使用sentinel-dashboard 页面添加规则和使用代码配置规则的等效方式,对于每种规则怎么使用,有什么效果的话,这里就不赘述了

2.添加maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

3.启动sentinel dashboard,从页面修改sentinel配置参数

下载sentinel dashboard,这里使用1.8.0的版本测试

下载完成后,从命令行启动 java -jar sentinel-dashboard-1.8.0.jar

完成后打开http://127.0.0.1:8080/ 用户名密码默认都为sentinel image.png

这个时候登录进去后,会看不到有需要配置规则的资源,需要先进去访问以下对应的接口,才能生成对应的节点

4.流控规则配置

4.1.QPS测试

添加接口

@GetMapping("/rule/flow/qps")
@SentinelResource(value = "qps", blockHandler = "qpsBlockHandler")
public String qps() {
    return "Flow CTRL QPS";
}

public String qpsBlockHandler(BlockException ex) {
    ex.printStackTrace();
    return "QPS Block ......";
}

blockHandler指定qpsBlockHandler,当触发流控的时候,就会调用下面的qpsBlockHandler

  • 配置流控规则 方式一:在sentinel dashboard中配置规则

先调用一下/rule/flow/qps,让dashboard 加载资源

image.png 其中qps这个节点名是在上面@SentinelResource 里面的value 定义的

1728892298790.png 点击➕流控后,在弹出的页面设置流控规则,这里选择QPS,阈值时2,代表1秒内超过2次调用就会抛出异常

  • 配置流控规则 方式二:在代码中初始化规则
@PostConstruct
private static void init() {

    List<FlowRule> flowRules = new ArrayList<>();

    /**
     * 流控模式:QPS
     */
    FlowRule qpsRule = new FlowRule();
    qpsRule.setResource("qps");
    qpsRule.setCount(1);
    qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    flowRules.add(qpsRule);
  
    FlowRuleManager.loadRules(flowRules);
}

@PostConstruct代表这个类初始化的时候执行 创建规则列表flowRules,并最后加载到FlowRuleManager 流控规则管理器里面,启动项目后,可以做到和页面配置一样的效果

最终1秒内多次调用浏览器的效果如下

image.png

4.2.线程数测试

添加接口

@GetMapping("/rule/flow/thread")
@SentinelResource(value = "thread", blockHandler = "threadBlockHandler")
public String thread() throws InterruptedException {
    Thread.sleep(4000);
    return "Flow CTRL Thread";
}

public String threadBlockHandler(BlockException ex) {
    ex.printStackTrace();
    return "Thread Block ......";
}
  • 配置流控规则 方式一:在sentinel dashboard中配置规则 image.png

  • 配置流控规则 方式二:在代码中初始化规则

@PostConstruct
private static void init() {

    List<FlowRule> flowRules = new ArrayList<>();

    /**
     * 流控模式:綫程數
     */
    FlowRule threadRule = new FlowRule();
    threadRule.setResource("thread");
    threadRule.setCount(1);
    threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
    flowRules.add(threadRule);

    FlowRuleManager.loadRules(flowRules);
}

4.3.流控规则的高级选项配置对照

1728893755236.png 对应选项设置,等效的代码配置如下

        FlowRule refRule = new FlowRule();
        refRule.setResource("/rule/flow/ref");
        //閾值類型:FLOW_GRADE_QPS=訪問數 ,FLOW_GRADE_THREAD=綫程數
        refRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //流控效果 : CONTROL_BEHAVIOR_DEFAULT=快速失敗, CONTROL_BEHAVIOR_WARM_UP=預熱,CONTROL_BEHAVIOR_RATE_LIMITER=排隊等候
        refRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
        //流控模式:STRATEGY_DIRECT=直接 ,STRATEGY_RELATE=關聯 , STRATEGY_CHAIN=鏈路
        refRule.setStrategy(RuleConstant.STRATEGY_RELATE);
//      refRule.setWarmUpPeriodSec(15);//設置為預熱后 ,該位置代表為预热时长
//      refRule.setMaxQueueingTimeMs(600);//設置為排隊等候后,該位置代表超時時間
        refRule.setCount(1);
        refRule.setRefResource("/rule/flow/ref2");
        flowRules.add(refRule);

5.降级规则配置

添加接口

@GetMapping("/rule/degrade")
@SentinelResource(value = "degrade", blockHandler = "degradeHandler")
public String degrade() {
    throw new RuntimeException("test");
}

public String degradeHandler(BlockException ex) {
    ex.printStackTrace();
    return "Degrade  Block......";
}

blockHandler指定degradeHandler,当触发流控的时候,就会调用下面的degradeHandler

  • 配置降级规则 方式一:在sentinel dashboard中配置规则

其中degrade这个节点名是在上面@SentinelResource 里面的value 定义的

image.png

  • 配置降级规则 方式二:在代码中初始化规则
   @PostConstruct
   private static void init() {
       List<DegradeRule> rules = new ArrayList<>();
       DegradeRule rule = new DegradeRule();
       rule.setResource("degrade");
       rule.setGrade(2); // 0 表示 RT,1 表示异常比例,2 表示异常数
//        rule.setSlowRatioThreshold(0.5);
       rule.setCount(1); // 阈值,根据 grade 的不同含义不同
       rule.setTimeWindow(10); // 熔断时长,单位为秒
       rules.add(rule);

       DegradeRuleManager.loadRules(rules);
   }

@PostConstruct代表这个类初始化的时候执行 创建规则列表rules,并最后加载到DegradeRuleManager 降级规则管理器里面,启动项目后,可以做到和页面配置一样的效果

6.系统规则配置

image.png

等效的代码配置如下

@PostConstruct
public void init() {
    List<SystemRule> rules = new ArrayList<>();
    SystemRule rule = new SystemRule();
    rule.setHighestSystemLoad(10.0); // 设置系统的最高负载,例如 CPU 负载阈值
    rule.setAvgRt(500); // 设置平均响应时间阈值
    rule.setMaxThread(1000); // 设置最大并发线程数阈值
    rule.setQps(100);
    rule.setHighestCpuUsage(0.3);
    rules.add(rule);

    SystemRuleManager.loadRules(rules);
}