熔断降级 Sentinel?

2025年 阅读约 15 分钟 面试指南 · Spring Cloud

深入解析Sentinel熔断降级:流量控制规则(QPS/线程数)、熔断策略(慢调用比例/异常比例/异常数)、热点参数限流、Sentinel控制台、与Hystrix对比,附面试模拟问答。

一句话总结

Sentinel 是阿里巴巴开源的流量治理组件,核心功能:流量控制(QPS/线程数限流)、熔断降级(慢调用比例/异常比例/异常数)、热点参数限流系统自适应保护。相比 Hystrix:Sentinel 规则更灵活(控制台实时修改)、支持更多维度限流、资源消耗更低、社区更活跃。核心概念:资源(被保护的对象)、规则(限流/熔断策略)、Entry(资源访问入口)。

初级理解

Sentinel 基本使用

# 1. 引入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> # 2. 配置 spring: cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel 控制台地址 port: 8719 # 与控制台通信端口 # 3. 使用 @SentinelResource 注解 @RestController public class UserController { @GetMapping("/user/{id}") @SentinelResource(value = "getUser", blockHandler = "getUserBlock") public User getUser(@PathVariable Long id) { return userService.getById(id); } // 限流/熔断后的降级方法 public User getUserBlock(Long id, BlockException e) { return new User(-1L, "服务繁忙,请稍后重试"); } }

中级深入

流量控制规则

# 流量控制模式 # 1. QPS 模式:每秒请求数超过阈值则限流 # 2. 线程数模式:并发线程数超过阈值则限流 # 流量控制效果 # 1. 快速失败:直接抛出 FlowException # 2. Warm Up(预热):系统冷启动时缓慢增加阈值 # 默认 coldFactor=3,预热时长内阈值从 threshold/3 逐步升到 threshold # 3. 排队等待:请求排队,匀速通过 # 适合处理突发流量(脉冲流量) # 控制台配置示例 # 资源名:getUser # 阈值类型:QPS # 阈值:10(每秒最多 10 个请求) # 流控模式:直接 # 流控效果:快速失败

熔断降级策略

策略说明示例
慢调用比例响应时间超过阈值的请求比例RT > 200ms 的请求超过 50%,熔断
异常比例异常请求占总请求的比例异常比例超过 50%,熔断
异常数异常请求的绝对数量1 分钟内异常数超过 10,熔断
# 熔断状态机 # CLOSED(关闭)→ 正常状态,统计请求 # ↓ 达到熔断条件 # OPEN(打开)→ 拒绝所有请求,抛出 DegradeException # ↓ 经过熔断时长 # HALF-OPEN(半开)→ 允许少量请求通过 # ↓ 请求成功 → CLOSED # ↓ 请求失败 → OPEN

高级拓展

Sentinel vs Hystrix

对比维度SentinelHystrix
隔离策略信号量隔离线程池/信号量隔离
规则修改控制台实时修改需重启
限流维度QPS/线程数/热点/系统线程池/信号量
控制台功能完善简单 Dashboard
维护状态活跃维护停止维护

热点参数限流

# 热点参数限流:对某个参数值单独限流 # 场景:商品详情接口,热门商品限制更严格 @GetMapping("/product/{id}") @SentinelResource(value = "getProduct", blockHandler = "blockHandler") public Product getProduct(@PathVariable Long id) { return productService.getById(id); } # 控制台配置 # 资源名:getProduct # 参数索引:0(第 0 个参数,即 id) # 阈值:100(默认 QPS 100) # 热点参数: # id=1001 → QPS 10(热门商品限制更严) # id=1002 → QPS 20

实战场景

场景:Feign 整合 Sentinel

# 开启 Feign 对 Sentinel 的支持 feign: sentinel: enabled: true # Feign 接口 + 降级实现 @FeignClient(name = "user-service", fallback = UserFeignFallback.class) public interface UserFeignClient { @GetMapping("/user/{id}") User getUser(@PathVariable("id") Long id); } # 降级实现类 @Component public class UserFeignFallback implements UserFeignClient { @Override public User getUser(Long id) { return new User(-1L, "用户服务不可用"); } } # 或使用 fallbackFactory 获取异常信息 @FeignClient(name = "user-service", fallbackFactory = UserFeignFallbackFactory.class) public interface UserFeignClient { }

面试模拟

面试官:Sentinel 和 Hystrix 有什么区别?

你:Sentinel 规则更灵活(控制台实时修改)、限流维度更多(QPS/线程数/热点/系统)、资源消耗更低。Hystrix 已停止维护,Sentinel 是当前主流选择。Sentinel 默认信号量隔离,Hystrix 默认线程池隔离。

面试官:Sentinel 的熔断策略有哪些?

你:三种:慢调用比例(响应时间超过阈值的比例)、异常比例(异常请求占比)、异常数(异常请求绝对数量)。熔断状态机:CLOSED → OPEN → HALF-OPEN → CLOSED/OPEN。