Sentinel——热点规则

发布时间 2023-12-04 23:04:52作者: 谁风霜依旧

热点规则

热点规则是用于实现热点参数限流的规则。热点参数限流指的是,在流控规则中指定对某方法参数的 QPS 限流后,当所有对该资源的请求URL中携带有该指定参数的请求 QPS 达到了阙值,则发生限流。

配置热点规则

controller

package com.zjw.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 前端控制器
 *
 * @since 2023-12-4
 */
@RestController
@Slf4j
public class DepartController {

    /**
     * 测试热点规则
     */
    //发生异常会降级,调用paramFallback方法
    @SentinelResource(value = "param", fallback = "paramFallback")
    @GetMapping("/param")
    public String param(Long id, String name) {
        return "param:" + id + ", " + name;
    }

    public String paramFallback(Long id, String name) {
        return "fallback param:" + id + ", " + name;
    }
}

sentinel控制台配置热点规则

请求中含有第0索引(即id),且十秒内请求超过三次,第四次请求会被限流。

参数索引: 是配置的热点规则所在方法的第几个参数,索引从0开始
统计窗口时长:统计窗口时间长度(单位为秒)。请求在该时间之内的请求数量大于阈值会被限流。

请求测试

也可以通过高级选项设置例外。如我们可以把id为0的值阈值设置大一些,减少被限流的可能。

API配置热点规则

package com.zjw;

import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class ConsumerParamRule8080Application {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerParamRule8080Application.class, args);
        //初始化热点规则
        paramRule();
    }

    private static void paramRule() {
        ParamFlowRuleManager.loadRules(configParamFlowRule());
    }

    // 设置授权规则
    private static List<ParamFlowRule> configParamFlowRule() {
        List<ParamFlowRule> ruleList = new ArrayList<>();
        ParamFlowRule rule = new ParamFlowRule();
        // 资源名
        rule.setResource("param");
        // 参数索引
        rule.setParamIdx(0);
        // 单机阈值
        rule.setCount(3);
        // 统计窗口时长 s
        rule.setDurationInSec(1);
        ruleList.add(rule);
        return ruleList;
    }
}