
Spring全家桶:Spring Cloud 2023.0.x 熔断降级限流系统性知识体系
一、微服务高可用防护基础
1.1 核心问题:服务雪崩效应
在微服务架构中,服务间存在复杂的调用链。当某个下游服务出现故障时,会导致上游调用方线程阻塞,进而引发级联故障,最终导致整个系统崩溃,这就是服务雪崩效应。
在分布式系统中,当扇出链路上某个微服务响应时间过长或不可用时,会导致调用方资源被持续占用,进而引发整个系统崩溃的现象称为服务雪崩效应。单个后端依赖的失败可能在几秒钟内导致所有服务器资源饱和,引发级联故障。
1.2 三大核心防护手段
| 手段 | 作用 | 解决的问题 |
|---|---|---|
| 熔断 | 当服务调用失败率达到阈值时,暂时切断对该服务的调用 | 防止故障扩散,保护调用方资源 |
| 降级 | 当系统负载过高或服务不可用时,返回简化的默认结果 | 保证核心业务可用,牺牲非核心功能 |
| 限流 | 控制请求进入系统的速率,防止系统被突发流量冲垮 | 保护系统在容量范围内稳定运行 |
1.3 Spring Cloud 2023.0.x 高可用组件生态
Spring Cloud 2023.0.x(代号Leyton)基于Spring Boot 3.2.x构建,要求Java 17+。自Spring Cloud 2020.0起,Netflix Hystrix已被完全移除,官方推荐使用以下两种高可用防护组件:
- Resilience4j:Spring Cloud官方默认推荐的轻量级容错库,提供熔断、降级、限流、重试、舱壁等功能
- Sentinel:阿里巴巴开源的流量治理组件,以流量为切入点,提供更丰富的流量控制和系统保护能力
二、Resilience4j 完整知识体系
2.1 Resilience4j 概述
Resilience4j是一个轻量级、模块化的容错库,专为Java 8+设计,灵感来自Netflix Hystrix,但采用了更现代的函数式编程风格,且不依赖RxJava。
2.2 核心模块
Resilience4j采用模块化设计,可按需引入:
- CircuitBreaker:熔断器模块,实现熔断降级功能
- RateLimiter:限流器模块,实现请求速率控制
- Bulkhead:舱壁模块,通过限制并发请求数隔离服务
- Retry:重试模块,自动重试失败的请求
- TimeLimiter:超时限制模块,限制请求的最大执行时间
- Cache:缓存模块,缓存成功的请求结果
2.3 核心组件详解
2.3.1 CircuitBreaker(断路器)
状态机模型:
- CLOSED:正常状态,允许所有请求通过
- OPEN:熔断状态,所有请求直接失败
- HALF_OPEN:半开状态,允许少量请求探测服务状态
滑动窗口类型:
- COUNT_BASED:基于计数的滑动窗口,统计最近N个请求
- TIME_BASED:基于时间的滑动窗口,统计最近N秒的请求
关键配置参数:
resilience4j:
circuitbreaker:
instances:
productService:
slidingWindowSize: 10 # 滑动窗口大小
minimumNumberOfCalls: 5 # 最小请求数
failureRateThreshold: 50 # 失败率阈值(%)
slowCallDurationThreshold: 2s # 慢调用阈值
slowCallRateThreshold: 50 # 慢调用比例阈值(%)
waitDurationInOpenState: 5s # 熔断时长
permittedNumberOfCallsInHalfOpenState: 3 # 半开状态允许的请求数
2.3.2 RateLimiter(限流器)
采用令牌桶算法实现,支持两种模式:
- 简单限流:固定速率生成令牌
- 预热限流:系统启动时逐步增加令牌生成速率
配置示例:
resilience4j:
ratelimiter:
instances:
productService:
limitForPeriod: 10 # 周期内允许的请求数
limitRefreshPeriod: 1s # 刷新周期
timeoutDuration: 0 # 等待令牌的超时时间
2.3.3 Bulkhead(舱壁隔离)
通过限制并发请求数来隔离不同服务,防止单个服务占用所有资源:
- 信号量隔离:轻量级,无线程切换开销
- 线程池隔离:完全隔离,支持超时控制
配置示例:
resilience4j:
bulkhead:
instances:
productService:
maxConcurrentCalls: 10 # 最大并发数
maxWaitDuration: 0 # 等待获取信号量的超时时间
2.4 熔断器工作原理
Resilience4j熔断器有三种状态:
- CLOSED(关闭):正常状态,允许所有请求通过
- OPEN(打开):熔断状态,直接拒绝所有请求,快速失败
- HALF_OPEN(半开):试探状态,允许少量请求通过,检测服务是否恢复
状态转换逻辑:
- 当失败率或慢调用率达到阈值时,从CLOSED转为OPEN
- OPEN状态持续指定时间后,转为HALF_OPEN
- HALF_OPEN状态下,根据试探请求的结果决定转为CLOSED还是OPEN
2.5 Spring Cloud 2023.0.x 集成方式
2.5.1 引入依赖
<!-- 非响应式应用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<!-- 响应式应用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
2.5.2 配置方式
Resilience4j支持两种配置方式:配置文件配置和Java代码配置。
配置文件示例(application.yml):
resilience4j:
circuitbreaker:
configs:
default:
sliding-window-size: 100 # 滑动窗口大小
sliding-window-type: COUNT_BASED # 滑动窗口类型:基于计数
failure-rate-threshold: 50 # 失败率阈值(%)
slow-call-rate-threshold: 50 # 慢调用率阈值(%)
slow-call-duration-threshold: 1s # 慢调用定义时间
minimum-number-of-calls: 10 # 计算失败率前的最小请求数
wait-duration-in-open-state: 5s # 熔断状态持续时间
permitted-number-of-calls-in-half-open-state: 5 # 半开状态允许的请求数
instances:
userService:
base-config: default
failure-rate-threshold: 60
ratelimiter:
configs:
default:
limit-for-period: 10 # 每个周期允许的请求数
limit-refresh-period: 1s # 周期长度
instances:
orderService:
base-config: default
limit-for-period: 5
2.5.3 使用方式
方式一:使用Spring Cloud CircuitBreaker抽象
@Service
public class UserService {
private final CircuitBreakerFactory circuitBreakerFactory;
private final RestTemplate restTemplate;
public UserService(CircuitBreakerFactory circuitBreakerFactory, RestTemplate restTemplate) {
this.circuitBreakerFactory = circuitBreakerFactory;
this.restTemplate = restTemplate;
}
public User getUserById(Long id) {
return circuitBreakerFactory.create("userService")
.run(() -> restTemplate.getForObject("http://user-service/users/" + id, User.class),
throwable -> new User(id, "默认用户", "降级返回"));
}
}
方式二:使用Resilience4j注解
@Service
public class OrderService {
@CircuitBreaker(name = "orderService", fallbackMethod = "getOrderFallback")
@RateLimiter(name = "orderService")
public Order getOrderById(Long id) {
// 调用远程服务
return restTemplate.getForObject("http://order-service/orders/" + id, Order.class);
}
public Order getOrderFallback(Long id, Exception e) {
return new Order(id, "默认订单", 0.0);
}
}
三、Sentinel 完整知识体系
3.1 Sentinel 概述
Sentinel是阿里巴巴开源的面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度保障微服务的稳定性。
3.2 架构设计
Sentinel采用责任链模式的插槽链(Slot Chain)核心架构,每个插槽负责一个独立功能模块,可灵活扩展:
- NodeSelectorSlot:构建调用路径
- ClusterBuilderSlot:集群节点统计
- LogSlot:日志记录
- StatisticSlot:实时指标统计
- SystemSlot:系统自适应保护
- AuthoritySlot:黑白名单控制
- FlowSlot:流量控制
- DegradeSlot:熔断降级
3.3 核心组件详解
3.3.1 流量统计核心:滑动窗口
Sentinel底层采用滑动窗口实现秒级指标统计:
- 将1秒拆分为多个样本窗口(默认2个500ms窗口)
- 每个样本窗口记录请求数、成功数、失败数、总响应时长
- 采用循环数组存储,无锁设计保证并发性能
- 自动淘汰过期样本窗口,解决固定窗口临界突刺问题
3.3.2 流量控制(限流)
限流维度:
- QPS限流
- 并发线程数限流
流控模式:
- 直接限流:直接限制当前资源
- 关联限流:当关联资源达到阈值时,限制当前资源
- 链路限流:只限制指定链路上的流量
流控效果:
- 快速失败:直接抛出FlowException
- Warm Up:预热模式,逐步增加阈值
- 排队等待:匀速排队,允许请求等待
配置示例:
[
{
"resource": "productQuery",
"limitApp": "default",
"grade": 1, // 1=QPS限流,0=线程数限流
"count": 100, // 阈值
"strategy": 0, // 0=直接,1=关联,2=链路
"controlBehavior": 0 // 0=快速失败,1=Warm Up,2=排队等待
}
]
3.3.3 熔断降级
Sentinel提供三种熔断策略:
- 慢调用比例:当慢调用比例超过阈值时触发熔断
- 异常比例:当异常比例超过阈值时触发熔断
- 异常数:当异常数超过阈值时触发熔断
状态机模型:
- CLOSED → OPEN:触发熔断条件
- OPEN → HALF_OPEN:熔断时长结束
- HALF_OPEN → CLOSED:探测请求成功
- HALF_OPEN → OPEN:探测请求失败
配置示例:
[
{
"resource": "productQuery",
"grade": 0, // 0=慢调用比例,1=异常比例,2=异常数
"count": 1000, // 最大RT(ms)或异常比例或异常数
"timeWindow": 5, // 熔断时长(s)
"minRequestAmount": 5, // 最小请求数
"slowRatioThreshold": 0.5 // 慢调用比例阈值
}
]
3.3.4 系统自适应保护
Sentinel提供系统维度的自适应保护,防止整个系统崩溃:
- CPU使用率
- 总QPS
- 平均响应时间
- 并发线程数
- 系统负载(仅Linux)
3.4 核心概念
- 资源:Sentinel的核心概念,可以是任何东西,如一个方法、一段代码、一个URL。所有规则都作用在资源之上
- 规则:定义了对资源进行保护的具体策略,包括流量控制规则、熔断降级规则、系统保护规则等
- 插槽链:Sentinel的核心工作机制,由一系列插槽组成,每个插槽负责不同的功能(如限流、熔断、统计等)
3.5 核心功能特性
3.3.1 流量控制
- 直接限流:限制资源的QPS
- 关联限流:当关联资源达到阈值时,限制当前资源
- 链路限流:只限制指定链路上的流量
- 流控效果:
- 快速失败:直接拒绝超过阈值的请求
- 预热:缓慢增加允许通过的请求数,防止系统被突发流量冲垮
- 排队等待:让请求匀速通过,适用于消息削峰填谷场景
3.3.2 熔断降级
Sentinel支持三种熔断策略:
- 慢调用比例:当慢调用比例达到阈值时触发熔断
- 异常比例:当异常比例达到阈值时触发熔断
- 异常数:当异常数达到阈值时触发熔断
3.3.3 热点参数限流
针对请求中的热点参数进行限流,例如限制某个用户ID的请求频率,或限制某个商品ID的查询频率。
3.3.4 系统自适应保护
从系统整体维度进行保护,根据系统的负载、CPU使用率、平均响应时间等指标自动调整流量,确保系统在最大吞吐量的同时保持稳定。
3.3.5 Sentinel控制台
Sentinel提供内置控制台,支持:
- 实时监控:查看秒级运行数据
- 规则管理:动态配置限流、熔断、系统保护规则
- 集群管理:管理集群节点
- 链路分析:查看调用链路
3.6 Spring Cloud 2023.0.x 集成方式
3.6.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2023.0.1.0</version>
</dependency>
<!-- 与Sentinel控制台通信 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.8</version>
</dependency>
3.6.2 配置控制台地址
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
port: 8719 # 与控制台通信的端口
3.6.3 使用方式
方式一:注解方式
@RestController
public class UserController {
@GetMapping("/users/{id}")
@SentinelResource(
value = "getUserById",
blockHandler = "getUserBlockHandler",
fallback = "getUserFallback"
)
public Result<User> getUserById(@PathVariable Long id) {
// 调用远程服务
return Result.success(userFeignClient.getUserById(id));
}
// 限流/熔断触发时的处理方法
public Result<User> getUserBlockHandler(Long id, BlockException e) {
return Result.fail("服务繁忙,请稍后再试");
}
// 其他异常触发时的降级方法
public Result<User> getUserFallback(Long id, Throwable e) {
return Result.success(new User(id, "默认用户", "异常降级"));
}
}
方式二:Feign集成
feign:
sentinel:
enabled: true # 开启Feign对Sentinel的支持
@FeignClient(name = "user-service", fallback = UserFeignFallback.class)
public interface UserFeignClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable Long id);
}
@Component
public class UserFeignFallback implements UserFeignClient {
@Override
public User getUserById(Long id) {
return new User(id, "默认用户", "Feign降级返回");
}
}
四、Resilience4j 与 Sentinel 全面对比
4.1 全维度对比表
| 对比维度 | Resilience4j | Sentinel |
|---|---|---|
| 开发团队 | 社区开源 | 阿里巴巴 |
| 设计理念 | 轻量级、模块化、函数式编程 | 流量治理为核心,全方位系统保护 |
| 核心功能 | 熔断、降级、限流、重试、舱壁、超时 | 流量控制、熔断降级、热点限流、系统自适应保护、集群限流 |
| 隔离策略 | 信号量隔离、线程池隔离 | 信号量隔离 |
| 熔断策略 | 失败率、慢调用率 | 慢调用比例、异常比例、异常数 |
| 限流粒度 | 服务/方法级 | 服务/方法/参数/链路级 |
| 动态配置 | 支持,但需要额外集成配置中心 | 原生支持,通过控制台动态配置 |
| 实时监控 | 基础监控,需要集成第三方工具 | 强大的实时监控控制台,秒级数据 |
| 集群支持 | 有限 | 原生支持集群限流 |
| 生态集成 | Spring Cloud官方推荐,与Spring生态无缝集成 | 与Spring Cloud Alibaba生态深度集成 |
| 学习曲线 | 中等 | 较低,控制台操作简单 |
| 适用场景 | 中小型微服务架构,注重轻量级和灵活性 | 大型分布式系统,需要复杂流量治理和系统保护 |
4.2 选型建议
选择Resilience4j的场景:
- 项目采用Spring Cloud官方技术栈
- 主要需要熔断、降级、重试等基础容错能力
- 偏好轻量级、模块化的解决方案
- 团队熟悉函数式编程和响应式编程
选择Sentinel的场景:
- 项目采用Spring Cloud Alibaba技术栈
- 需要复杂的流量治理能力(热点防护、系统保护、集群流控)
- 需要实时监控和动态配置能力
- 有大规模流量处理需求(如电商秒杀)
- 团队更熟悉国内开源生态
五、生产环境最佳实践
5.1 通用最佳实践
- 合理设置阈值:根据系统压测结果设置合理的限流和熔断阈值,避免过度保护或保护不足
- 分级降级策略:根据业务重要性制定分级降级策略,优先保证核心业务可用
- 监控告警:建立完善的监控告警体系,及时发现和处理异常情况
- 灰度发布:新规则上线时采用灰度发布方式,逐步扩大范围
- 异常处理:确保降级方法本身不会抛出异常,避免二次故障
5.2 Resilience4j 最佳实践
- 使用配置文件管理规则:便于统一管理和修改
- 合理配置滑动窗口:根据业务特点选择基于计数或基于时间的滑动窗口
- 区分不同异常类型:只对需要熔断的异常进行统计
- 避免过度重试:设置合理的重试次数和间隔,避免加重下游服务负担
5.3 Sentinel 最佳实践
- 使用控制台管理规则:充分利用Sentinel控制台的动态配置能力
- 热点参数限流:对热点资源使用热点参数限流,提高系统稳定性
- 系统自适应保护:开启系统自适应保护,防止系统被突发流量冲垮
- 规则持久化:将规则持久化到配置中心(如Nacos),避免重启后规则丢失
- 集群限流:对于集群部署的服务,使用集群限流功能,避免单机限流的局限性
六、常见问题与解决方案
6.1 Resilience4j 常见问题
- 熔断不生效:检查是否正确引入依赖,是否开启了自动配置,注解是否被正确扫描
- 降级方法不执行:确保降级方法的签名与原方法一致,且在同一个类中
- 性能问题:避免在降级方法中执行耗时操作,尽量返回简单的默认结果
6.2 Sentinel 常见问题
- 控制台看不到应用:检查控制台地址配置是否正确,网络是否通畅,应用是否有请求流量
- 规则不生效:检查资源名称是否正确,规则是否已推送成功,应用是否已接收到规则
- 热点参数限流不生效:确保参数类型是基本类型或String,且参数索引正确
- Feign降级不生效:检查是否开启了Feign对Sentinel的支持,降级类是否被Spring容器管理
七、总结
Spring Cloud 2023.0.x提供了两种主流的熔断降级限流解决方案:Resilience4j和Sentinel。Resilience4j作为Spring Cloud官方推荐的轻量级容错库,适合中小型微服务架构;而Sentinel作为阿里巴巴开源的流量治理组件,提供了更丰富的功能和更强大的控制台,适合大型分布式系统。
在实际项目中,应根据业务需求和技术栈选择合适的组件。如果使用Spring Cloud Alibaba生态,Sentinel是更好的选择;如果追求轻量级和灵活性,Resilience4j是不错的选择。无论选择哪种组件,都需要遵循最佳实践,合理配置规则,建立完善的监控告警体系,才能真正保障微服务系统的高可用性。
Spring Cloud 2023.0.x 熔断降级限流面试高频问答卡片
一、基础概念类
Q1:什么是服务雪崩效应?
标准答案:在微服务架构中,服务间存在复杂调用链。当某个下游服务响应时间过长或不可用时,会导致上游调用方线程阻塞,资源被持续占用,进而引发级联故障,最终导致整个系统崩溃的现象。单个后端依赖的失败可能在几秒钟内导致所有服务器资源饱和。
Q2:微服务高可用防护的三大核心手段是什么?分别解决什么问题?
标准答案:
- 熔断:当服务调用失败率达到阈值时,暂时切断对该服务的调用,防止故障扩散,保护调用方资源
- 降级:当系统负载过高或服务不可用时,返回简化的默认结果,保证核心业务可用,牺牲非核心功能
- 限流:控制请求进入系统的速率,防止系统被突发流量冲垮,保护系统在容量范围内稳定运行
Q3:Spring Cloud 2023.0.x推荐的高可用防护组件有哪些?
标准答案:自Spring Cloud 2020.0起Netflix Hystrix已被完全移除,官方推荐两种组件:
- Resilience4j:Spring Cloud官方默认推荐的轻量级容错库,提供熔断、降级、限流、重试、舱壁等功能
- Sentinel:阿里巴巴开源的流量治理组件,以流量为切入点,提供更丰富的流量控制和系统保护能力
二、Resilience4j相关
Q4:Resilience4j的核心模块有哪些?
标准答案:Resilience4j采用模块化设计,可按需引入:
- CircuitBreaker:熔断器模块
- RateLimiter:限流器模块
- Bulkhead:舱壁隔离模块
- Retry:重试模块
- TimeLimiter:超时限制模块
- Cache:缓存模块
Q5:Resilience4j熔断器的三种状态及转换逻辑是什么?
标准答案:
- CLOSED(关闭):正常状态,允许所有请求通过
- OPEN(打开):熔断状态,直接拒绝所有请求,快速失败
- HALF_OPEN(半开):试探状态,允许少量请求通过检测服务是否恢复
转换逻辑:
- 失败率或慢调用率达到阈值 → CLOSED转OPEN
- OPEN状态持续指定时间后 → 转HALF_OPEN
- HALF_OPEN状态下,试探请求全部成功 → 转CLOSED;有失败 → 转OPEN
Q6:Resilience4j支持哪两种滑动窗口类型?
标准答案:
- COUNT_BASED:基于计数的滑动窗口,统计最近N个请求的结果
- TIME_BASED:基于时间的滑动窗口,统计最近N秒内的所有请求结果
Q7:Resilience4j的舱壁隔离有哪两种实现方式?各有什么特点?
标准答案:
- 信号量隔离:轻量级,无线程切换开销,性能高,但不支持超时控制
- 线程池隔离:完全隔离,支持超时控制,但有线程切换开销,资源消耗较大
Q8:Resilience4j在Spring Cloud中有哪两种使用方式?
标准答案:
- 使用Spring Cloud CircuitBreaker抽象:通过CircuitBreakerFactory创建熔断器实例,调用run方法执行业务逻辑和降级逻辑
- 使用Resilience4j注解:在方法上添加@CircuitBreaker、@RateLimiter等注解,指定fallbackMethod
三、Sentinel相关
Q9:Sentinel的核心架构是什么?
标准答案:Sentinel采用责任链模式的插槽链(Slot Chain)核心架构,每个插槽负责一个独立功能模块,可灵活扩展。主要插槽包括:
- NodeSelectorSlot:构建调用路径
- ClusterBuilderSlot:集群节点统计
- StatisticSlot:实时指标统计
- SystemSlot:系统自适应保护
- AuthoritySlot:黑白名单控制
- FlowSlot:流量控制
- DegradeSlot:熔断降级
Q10:Sentinel的流量控制有哪些维度和模式?
标准答案:
限流维度:QPS限流、并发线程数限流
流控模式:
- 直接限流:直接限制当前资源
- 关联限流:当关联资源达到阈值时,限制当前资源
- 链路限流:只限制指定链路上的流量
Q11:Sentinel的流控效果有哪几种?
标准答案:
- 快速失败:直接抛出FlowException,默认方式
- Warm Up(预热):逐步增加阈值,防止系统被突发流量冲垮
- 排队等待:让请求匀速通过,适用于消息削峰填谷场景
Q12:Sentinel支持哪三种熔断策略?
标准答案:
- 慢调用比例:当慢调用比例超过阈值时触发熔断
- 异常比例:当异常比例超过阈值时触发熔断
- 异常数:当异常数超过阈值时触发熔断
Q13:Sentinel的系统自适应保护从哪些维度进行保护?
标准答案:从系统整体维度进行保护,包括:
- CPU使用率
- 总QPS
- 平均响应时间
- 并发线程数
- 系统负载(仅Linux系统)
Q14:什么是Sentinel的热点参数限流?
标准答案:针对请求中的热点参数进行限流,例如限制某个用户ID的请求频率,或限制某个商品ID的查询频率。可以有效防止热点资源被过度访问导致系统崩溃。
Q15:Sentinel控制台提供哪些核心功能?
标准答案:
- 实时监控:查看秒级运行数据
- 规则管理:动态配置限流、熔断、系统保护规则
- 集群管理:管理集群节点
- 链路分析:查看服务调用链路
Q16:Sentinel与Feign如何集成?
标准答案:
- 在配置文件中添加
feign.sentinel.enabled=true开启Feign对Sentinel的支持 - 在@FeignClient注解中指定fallback或fallbackFactory属性
- 实现Feign接口作为降级类,并将其注册为Spring Bean
四、对比与选型类
Q17:Resilience4j与Sentinel在隔离策略上有什么区别?
标准答案:
- Resilience4j支持信号量隔离和线程池隔离两种方式
- Sentinel仅支持信号量隔离,轻量级,性能更高
Q18:Resilience4j与Sentinel在限流粒度上有什么区别?
标准答案:
- Resilience4j仅支持服务/方法级别的限流
- Sentinel支持更细粒度的限流,包括服务/方法/参数/链路级,还支持热点参数限流
Q19:Resilience4j与Sentinel在动态配置和监控方面有什么区别?
标准答案:
- Resilience4j支持动态配置,但需要额外集成配置中心;监控能力基础,需要集成第三方工具
- Sentinel原生支持动态配置,通过控制台即可实时修改规则;提供强大的实时监控控制台,支持秒级数据展示
Q20:什么情况下选择Resilience4j?什么情况下选择Sentinel?
标准答案:
选择Resilience4j:
- 项目采用Spring Cloud官方技术栈
- 主要需要熔断、降级、重试等基础容错能力
- 偏好轻量级、模块化的解决方案
- 团队熟悉函数式编程和响应式编程
选择Sentinel:
- 项目采用Spring Cloud Alibaba技术栈
- 需要复杂的流量治理能力(热点防护、系统保护、集群流控)
- 需要实时监控和动态配置能力
- 有大规模流量处理需求(如电商秒杀)
- 团队更熟悉国内开源生态
五、最佳实践类
Q21:微服务高可用防护的通用最佳实践有哪些?
标准答案:
- 合理设置阈值:根据系统压测结果设置,避免过度保护或保护不足
- 分级降级策略:根据业务重要性制定,优先保证核心业务可用
- 监控告警:建立完善的监控告警体系,及时发现和处理异常
- 灰度发布:新规则上线时采用灰度方式,逐步扩大范围
- 异常处理:确保降级方法本身不会抛出异常,避免二次故障
Q22:Sentinel的生产环境最佳实践有哪些?
标准答案:
- 使用控制台管理规则,充分利用动态配置能力
- 对热点资源使用热点参数限流,提高系统稳定性
- 开启系统自适应保护,防止系统被突发流量冲垮
- 将规则持久化到配置中心(如Nacos),避免重启后规则丢失
- 对于集群部署的服务,使用集群限流功能,避免单机限流的局限性
Q23:Resilience4j的生产环境最佳实践有哪些?
标准答案:
- 使用配置文件管理规则,便于统一管理和修改
- 根据业务特点选择基于计数或基于时间的滑动窗口
- 区分不同异常类型,只对需要熔断的异常进行统计
- 设置合理的重试次数和间隔,避免加重下游服务负担
- 避免在降级方法中执行耗时操作,尽量返回简单的默认结果
六、常见问题类
Q24:Resilience4j降级方法不执行的常见原因有哪些?
标准答案:
- 降级方法的签名与原方法不一致(参数列表、返回值类型)
- 降级方法与原方法不在同一个类中
- 降级方法的访问权限不是public
- 异常类型不匹配,fallbackMethod只处理指定的异常类型
Q25:Sentinel控制台看不到应用的常见原因有哪些?
标准答案:
- 控制台地址配置错误
- 应用与控制台之间网络不通
- 应用没有任何请求流量(Sentinel在第一次请求时才会初始化)
- 应用的sentinel-transport-simple-http依赖缺失
- 端口冲突(默认8719端口被占用)
Q26:Sentinel规则不生效的常见原因有哪些?
标准答案:
- 资源名称与规则中配置的不一致
- 规则没有成功推送到应用
- 应用没有接收到规则(网络问题或配置中心问题)
- 规则配置错误(如阈值设置为0)
- 限流模式或流控效果配置不正确