Sentinel 与 Resilience4j 熔断限流原理有何不同?如何选型?

结论先行:两者都做“流量防护”,理念不同:Sentinel 是规则驱动 + 中心化管理的流量治理组件,重限流(QPS/并发线程/热点)与熔断降级,配有可视化控制台、规则可推送持久化;Resilience4j 是轻量进程内容错库,以装饰器组合出熔断、限流、隔离、重试、超时,无控制台、规则靠代码/配置。中文互联网微服务多用 Sentinel;追求轻量、与函数式/响应式风格一致选 Resilience4j。

一、核心能力对比

维度SentinelResilience4j
模型资源 + 规则 + Slot 责任链CircuitBreaker/RateLimiter/Bulkhead 等模块
限流QPS、并发线程、热点参数、系统自适应RateLimiter(令牌)
熔断慢调用/异常比例/异常数状态机 CLOSED→OPEN→HALF_OPEN
隔离信号量/线程池(结合)Bulkhead(信号量/线程池)
重试/超时少内置Retry、TimeLimiter 原生
控制台Sentinel Dashboard + 规则推送无,指标对接 Prometheus/Grafana
侵入@SentinelResource + 规则中心注解/装饰器,规则在代码或配置

二、Sentinel 关键原理

  1. 资源定义:埋点(SphU.entry 或 @SentinelResource(value="getOrder"));
  2. 规则:流控规则(grade=QPS/并发线程、控制行为=快速失败/预热/排队)、熔断降级规则(慢调用比例/异常比例/异常数 + 时间窗口);
  3. 责任链:NodeSelector→ClusterBuilder→StatisticSlot(统计)→AuthoritySlot(黑白名单)→SystemSlot(系统自适应)→FlowSlot(流控)→DegradeSlot(熔断降级)逐个裁决;
  4. 统计滑动窗口:以时间为单位的滑动窗口计数 QPS/异常,支持秒级实时;
  5. 规则持久化:控制台/API 推送到客户端内存,配合 Nacos 等做规则数据源持久化。
@SentinelResource(value = "createOrder",
        blockHandler = "createOrderBlock",   // 限流/熔断触发
        fallback = "createOrderFallback")    // 业务异常兜底
public Order createOrder(OrderReq req) { ... }

三、Resilience4j 关键原理

  • CircuitBreaker 状态机:关闭(CLOSED)→超过阈值打开(OPEN)→等待窗口后半开(HALF_OPEN)试放少量请求→成功回 CLOSED、失败回 OPEN;
  • 指标基于滑动窗口(计数/时间)统计失败率、慢调用率;
  • 组合使用:TimeLimiter + CircuitBreaker + Retry + RateLimiter + Bulkhead 装饰同一调用,构成弹性调用链;
  • Spring Cloud 集成:spring-cloud-starter-circuitbreaker-resilience4j + @CircuitBreaker(name, fallbackMethod)。

常见追问 / 记忆点

  • 追问:熔断和限流解决什么问题?答:熔断防“下游故障拖垮自己”,限流防“自身过载拖垮整个系统”,降级是两者触发后的兜底响应。
  • 追问:两套都见过怎么判断该信哪个?答:看是否有规则中心/控制台诉求——要治理平台选 Sentinel,要轻内嵌选 Resilience4j。
  • 记忆点:Sentinel 中心化治理、Resilience4j 进程内组合;状态机三态与滑动窗口是熔断通用底座。
笔记加载中…