方式一:使用@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,可以看到我们编码定义的流控规则:
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);