企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 一、区分流控规则及降级规则 这部分虽然我们之前就说过,本节我们有必要再看一下。能正确的区分流控规则与降级规则,是理解Exception处理的基础。初学者咋一看sentinel流控规则与降级规则,好像没什么区别啊?为什么不统一叫做规则配置?还要去分开呢?为了方便大家的理解,我们来比较一下。 | 比较点 | 流控规则 | 降级规则 | | --- | --- | --- | | 内容比较 | QPS、线程数、关联、链路限流、冷启动及匀速排队、热点规则限流 | 平均响应时长、异常比例、异常数量 | | 解决问题的方向 | 外部流量压力导致问题 | 内部编码及处理能力导致的问题 | | Exception | FlowException(BlockException) | DegradeException(BlockException) | | 降级处理方法 | BlockHandler | fallback或BlockHandler | ## 二、异常处理关系图 我们先后已经为大家介绍了sentinel的流控规则和熔断降级,流控规则被触发之后,程序将去执行BlockHolder方法。那么熔断被触发之后,程序去执行什么方法呢?sentinel为我们提供了一个专门处理服务降级的方法:fallback。 正如上图所示: * FlowException代表限流规则被触发 * DegradeException代表熔断降级规则被触发 * FlowException和DegradeException都是BlockException的子类 * BlockHandler是可以用来被处理限流及熔断降级的方法 * fallback用来处理DegradeException,即处理熔断降级的方法 * fallback不仅可以用来处理熔断降级,还可以用来处理业务上的运行时异常 ## 三、fallback与blockHandler用法总结 * 针对资源触发限流规则:只有blockHandler 能自定义处理逻辑 * 针对业务上抛出运行时异常:只有fallback和defaultFallback能自定义处理逻辑。fallback 优先级高于 defaultFallback * 针对资源触发降级规则:blockHandler > fallback > defaultFallback #### 笔者自身的最佳实践(不绝对) * 不自定义blockHandler,限流信息直接返回给前端处理。前端将限流信息转换成如:“系统繁忙,请稍后再试!” * 对于大部分的业务,使用defaultFallback定义全局通用降级处理逻辑。如:“系统内部出现错误,请联系管理员进行处理!” * 对于重点业务,降级逻辑个性化较强的业务,比如需要返回缓存。这种情况使用fallback。 * 一旦使用fallback就用fallbackClass,一旦使用blockHolder就用blockHolderClass,降低代码耦合 ## 四、SentinelResource注解用法总结 > 注意:SentinelResource注解方式不支持 private 方法。 `@SentinelResource`用于定义资源,并提供可选的异常处理和 fallback 配置项。`@SentinelResource`注解包含以下属性: * `value`:资源名称,必需项(不能为空) * `entryType`:entry 类型,可选项(默认为`EntryType.OUT`) * `blockHandler`/`blockHandlerClass`:`blockHandler`对应处理`BlockException`的函数名称,可选项。blockHandler 函数访问范围需要是`public`,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为`BlockException`。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定`blockHandlerClass`为对应的类的`Class`对象,注意对应的函数必需为 static 函数,否则无法解析。 * `fallback`/`fallbackClass`:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了`exceptionsToIgnore`里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求: * 返回值类型必须与原函数返回值类型一致; * 方法参数列表需要和原函数一致,或者可以额外多一个`Throwable`类型的参数用于接收对应的异常。 * fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定`fallbackClass`为对应的类的`Class`对象,注意对应的函数必需为 static 函数,否则无法解析。 * `defaultFallback`(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了`exceptionsToIgnore`里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求: * 返回值类型必须与原函数返回值类型一致; * 方法参数列表需要为空,或者可以额外多一个`Throwable`类型的参数用于接收对应的异常。 * defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定`fallbackClass`为对应的类的`Class`对象,注意对应的函数必需为 static 函数,否则无法解析。 * `exceptionsToIgnore`(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。 > 注:1.6.0 之前的版本 fallback 函数只针对降级异常(`DegradeException`)进行处理,**不能针对业务异常进行处理**。