Sentinel 熔断降级与热点参数规则

流控把"太挤"的流量挡在门外,熔断把"已经坏掉"的下游隔离起来。当被调服务持续变慢或持续报错,调用方不该再傻等,而应快速失败并让流量绕开故障点,给下游恢复的时间。热点参数规则则解决"少数热点 key 打爆资源"的问题。本章覆盖熔断降级与热点两类规则。

熔断的状态机

熔断器有三个状态:关闭(正常放行)、打开(直接快速失败)、半开(试探性放行少量请求探测下游是否恢复)。规则判定"出问题"后熔断器打开,期间请求不再进入业务逻辑;经过设定的熔断时长进入半开,放几个探测请求,成功则关闭熔断、失败则继续保持打开。理解状态机,就理解了"熔断时长"与"最小请求数"两个参数的意义。

熔断降级规则(Sentinel 1.8+ 的规则形态)

在"熔断降级规则"中新增规则,选择资源并配置三个要素之一作为熔断依据(Sentinel 1.8 之后规则经过重构,老资料里的"降级规则"参数请对照官方文档):

  • 慢调用比例:统计时长内,响应时间超过慢调用 RT 阈值的请求占比超过比例阈值即熔断,适合下游变慢的场景;
  • 异常比例:请求中抛异常的比例超过阈值即熔断,适合"报错率飙升"的故障;
  • 异常数:统计时长内异常总数超过阈值即熔断,适合低频但错误集中的接口。

公共参数包括:最小请求数(统计期内至少多少个请求才参与判定,避免偶发抖动误触发)、统计时长、熔断时长(打开后多久进入半开)。实践上建议:慢调用比例是默认首选;异常比例要结合"哪些异常算数"一起设计。

定义资源并编写降级处理:@SentinelResource

默认以 URL 为资源对方法级控制不够精细,用 @SentinelResource 显式声明资源名,并为规则触发(blockHandler)与业务异常(fallback)分别提供兜底:

@SentinelResource(
        value = "createOrder",
        blockHandler = "createOrderBlock",
        fallback = "createOrderFallback",
        blockHandlerClass = OrderFallback.class,
        fallbackClass = OrderFallback.class)
public OrderDto createOrder(OrderCreateCmd cmd) {
    // 调用下游:扣库存、扣账户
}
public final class OrderFallback {
    // blockHandler:熔断/流控等规则触发时调用,签名需与原方法对齐并多一个 BlockException 参数
    public static OrderDto createOrderBlock(OrderCreateCmd cmd, BlockException ex) {
        return OrderDto.failed("服务繁忙,请稍后再试");
    }
    // fallback:业务异常(非规则触发)时调用
    public static OrderDto createOrderFallback(OrderCreateCmd cmd, Throwable t) {
        return OrderDto.failed("下单失败,原因:" + t.getMessage());
    }
}

约定:blockHandler 处理的是 Sentinel 规则(BlockException),fallback 处理业务异常;方法签名与返回值规则、异常类型匹配要求以官方文档为准。实际工程里把兜底方法收敛到独立类(blockHandlerClass)比散落在业务类中更整洁。

与 OpenFeign 联动:调用下游自动熔断

服务间调用最常见的熔断对象是 Feign 客户端:当被调服务异常比例高时,直接返回 fallback 而不发起真实请求。Spring Cloud Alibaba 支持为 @FeignClient 配置 fallback/FallbackFactory 并由 Sentinel 接管触发,相关开关属性与配置方式以官方文档为准。这套组合把第 06 章讲的错误处理升级为"自动熔断 + 降级响应"。

热点参数规则

热点参数限流针对"同一个资源,不同参数值热度不同"的场景:比如查询商品详情的接口整体 QPS 不高,但某个爆款商品 id 的请求量极大,只按整体限流会误伤其他商品。热点规则按"参数索引 + 参数值"分别计数。控制台操作:在"热点规则"中新增规则,选择资源后设置参数索引(0 表示方法第一个参数,即商品 id)、单机阈值(如每秒 100),并可为特定参数值配置例外项(指定商品 id 单独设置更高或更低阈值)。代码上同样可以构造 ParamFlowRule 加载,参数例外项为特定 key 定制阈值。注意热点参数仅支持基本类型与部分包装类型的参数,复杂对象参数无法参与,详见官方文档。

小结

熔断降级用状态机把"坏邻居"隔离在业务之外,慢调用比例是最常用的判据,@SentinelResource 的 blockHandler/fallback 提供了规则与异常的两套兜底;热点规则则把限流精确到"参数值"粒度。容错三板斧(超时、重试、熔断降级)至此闭环,下一章转向另一个必备能力——链路追踪。

笔记加载中…