SpringCloudAlibaba——编码方式配置Sentinel限流与熔断

Sentinel限流、熔断的实现流程

  1. 定义资源
  2. 定义限流、熔断规则
  3. 检验规则是否生效

定义资源

方式一:使用@SentinelResource注解

@GetMapping("testY")
@SentinelResource(value = "testY", blockHandler = "testYHandler")
public String testY(){
    
    
    return "testY";
}

//限流后的处理方法
public String testYHandler(BlockException exception) {
    
    
    return "testY被限流";
}

需要注意的是,blockHandler配置的方法与原始方法的返回值、参数必须一致,而且需要增加BlockException参数。

方式二:使用SphU.entry()方法

	@GetMapping("/testZ")
    public String testZ() throws Exception {
    
    
    	//定义资源为testZ,在请求进入时需要进行限流判断,如果抛出BlockException异常,则表示触发了限流
        try (Entry entry = SphU.entry("testZ")){
    
    
            //业务
            log.info("testZ...........");
            return "testZ";
        } catch (BlockException e) {
    
    
        	//限流后的处理
            return "testZ被限流";
        }
    }

也可以通过返回布尔值的方式来定义资源:

if (Sph0.entry("testZ")) {
    
    
	try{
    
    
		//被保护的业务逻辑
	}finally {
    
    
		Sph0.exit();
	}
} else {
    
    
	//限流后的处理
}

在这种方式中,需要注意资源使用完之后要调用Sph0.exit( ) ,否则会导致调用链记录异常,抛出ErrorEntryFreeException异常。

定义资源保护的规则

方式一:通过Sentinel Dashboard提供的界面定义规则

默认是非持久化的,可以持久化到Nacos。

方式二:编码配置规则,再通过Sentinel的SPI扩展点加载:

实现Sentinel提供的InitFunc接口:

public class FLowRuleInitfunc implements InitFunc {
    
    
    @Override
    public void init() throws Exception {
    
    
        //定义流控规则
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("testZ");//资源名称
        rule.setLimitApp("default");//不区分调用来源
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//阈值类型:基于QPS
        rule.setCount(1);//单机阈值:1
        rule.setStrategy(RuleConstant.STRATEGY_DIRECT);//流控策略:直接
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);//流控效果:默认为快速失败
        rule.setClusterMode(false);//非集群模式
        rules.add(rule);
        //加载规则
        FlowRuleManager.loadRules(rules);
    }
}

如果想要被Sentinel加载,需要在resource目录下创建META-INF/services/com.alibaba.csp.sentinel.init.InitFunc文件,文件内容就是自定义扩展点的全路径:

在这里插入图片描述

pers.zhang.springcloud.alibaba.controller.FLowRuleInitfunc

验证规则

启动Nacos、Sentinel和微服务,访问/testZ
在这里插入图片描述

查看Sentinel Dashboard,可以看到我们编码定义的流控规则:
在这里插入图片描述

快速连续访问/testZ,限流成功,执行了限流后的逻辑:
在这里插入图片描述

熔断规则的定义

Sentinel实现服务熔断和限流类似,不同之处在于限流采用的是FlowRule,而熔断中采用的是DegradeRule:

		//定义熔断规则
        List<DegradeRule> degradeRules = new ArrayList<>();
        DegradeRule dRule = new DegradeRule();
        dRule.setResource("testZ");//资源名称
        dRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//降级策略:异常数
        dRule.setCount(5);
        dRule.setTimeWindow(10);//时间窗
        degradeRules.add(dRule);
        //加载
        DegradeRuleManager.loadRules(degradeRules);

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/108044177