服务容错保护
Spring Cloud Hystrix
核心功能
- 熔断(Circuit Breaker): 当某个服务连续失败达到阈值时,自动“熔断”(停止调用),避免故障级联。
- 服务降级(Fallback):在服务不可用或响应超时时,自动切换到预定义的降级逻辑(如返回缓存数据、默认值或友好提示)
- 线程隔离(Thread Isolation):将不同服务的调用分配到独立线程池,避免单个服务故障耗尽主线程资源。
- 限流与流量控制: 通过
maxConcurrentRequests
限制单线程池内最大并发请求数, 通过滑动时间窗口统计, 可动态调整 - 实时监控与指标: 收集请求成功/失败率、响应时间、熔断状态等指标, 可集成第三方可视化工具
- 请求合并(Request Collapsing):一般用不到
熔断 vs. 降级的区别
场景 | Feign Fallback(降级) | Hystrix 熔断 |
---|---|---|
触发条件 | 任何单次调用失败(超时、HTTP 错误等) | 连续多次失败(如 50% 错误率,持续 10 次请求) |
执行动作 | 立即返回兜底数据,不阻断后续请求 | 当触发熔断后,阻断后续请求 ,直到半开状态重试 |
目的 | 保证客户端快速响应,避免阻塞 | 防止故障级联,保护系统稳定性 |
状态机 | 无状态,每次失败直接触发 | 有状态(CLOSED → OPEN → HALF-OPEN) |
适用场景 | 服务短暂不可用(如数据库连接池耗尽) | 服务持续不可用(如下游服务宕机) |
Hystrix 熔断后自动执行降级
Hystrix 的熔断机制会在服务连续失败达到阈值后, 自动阻断后续请求 ,并在此时执行降级逻辑(即 Feign 的 Fallback 方法)。这是两者的协同工作流程。
工作流程:
- 正常调用 :Feign 客户端调用服务,Hystrix 监控请求状态。
- 第一次失败 :服务返回异常(如
500 Internal Server Error
),Hystrix 记录失败次数。 - 连续失败 :当失败次数达到阈值(如
errorThresholdPercentage=50%
),Hystrix 触发熔断,将状态从CLOSED
→OPEN
。 - 熔断期间 :所有新请求直接走 Fallback 方法(即降级逻辑),不再实际调用服务。
- 半开状态 :熔断后等待
sleepWindowMillis
(默认 5 秒),尝试一次新请求:
- 成功:状态恢复为
CLOSED
,继续正常调用。 - 失败:再次熔断,延长熔断时间。