熔断器实现
外观
熔断器实现[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
熔断器(Circuit Breaker)是一种用于提高分布式系统容错性的设计模式,最初由Martin Fowler提出。在微服务架构中,服务间的依赖调用可能因网络问题或服务不可用而失败。熔断器通过监控调用失败率,在达到阈值时自动“熔断”(停止请求),避免雪崩效应,并给予下游服务恢复时间。
核心状态机:
- 关闭(Closed):正常调用,失败次数累积
- 打开(Open):停止所有请求,直接返回错误
- 半开(Half-Open):试探性允许部分请求通过
实现原理[编辑 | 编辑源代码]
数学模型[编辑 | 编辑源代码]
熔断触发条件通常基于滑动窗口统计,公式表示为:
状态转换图[编辑 | 编辑源代码]
Spring Cloud 实现[编辑 | 编辑源代码]
通过Spring Cloud Netflix Hystrix或Resilience4j实现:
Hystrix 示例[编辑 | 编辑源代码]
@HystrixCommand(
fallbackMethod = "getFallbackData",
commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
}
)
public String getRemoteData(String param) {
// 调用远程服务
return restTemplate.getForObject("http://service/api?q=" + param, String.class);
}
public String getFallbackData(String param) {
return "缓存数据"; // 降级逻辑
}
参数说明:
- requestVolumeThreshold:触发统计的最小请求数(窗口大小)
- errorThresholdPercentage:错误百分比阈值
- sleepWindowInMilliseconds:熔断持续时间
Resilience4j 示例[编辑 | 编辑源代码]
更现代的替代方案:
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 失败率阈值%
.slidingWindowSize(10) // 滑动窗口大小
.waitDurationInOpenState(Duration.ofSeconds(5))
.build();
CircuitBreaker breaker = CircuitBreaker.of("serviceA", config);
Supplier<String> decorated = CircuitBreaker
.decorateSupplier(breaker, () -> callExternalService());
Try.ofSupplier(decorated)
.recover(exception -> "fallback");
实际案例[编辑 | 编辑源代码]
电商系统支付服务: 1. 当支付成功率低于60%时触发熔断 2. 5秒内直接返回“支付繁忙”提示 3. 熔断后:
- 显示本地缓存的价格信息 - 订单进入异步处理队列
监控数据示例:
时间戳 | 请求数 | 失败率 | 状态 |
---|---|---|---|
2023-01-01T12:00:00 | 15 | 20% | Closed |
2023-01-01T12:00:05 | 22 | 55% | Open |
2023-01-01T12:00:10 | 3 | 33% | Half-Open |
高级配置[编辑 | 编辑源代码]
动态调整参数[编辑 | 编辑源代码]
通过Spring Cloud Config实现运行时更新:
resilience4j.circuitbreaker:
instances:
backendA:
registerHealthIndicator: true
failureRateThreshold: 60
minimumNumberOfCalls: 5
automaticTransitionFromOpenToHalfOpenEnabled: true
组合策略[编辑 | 编辑源代码]
熔断器常与以下模式配合使用:
- 舱壁模式(Bulkhead):限制并发调用数
- 重试机制(Retry):对瞬态故障的补偿
- 速率限制(Rate Limiter):防止过载
最佳实践[编辑 | 编辑源代码]
1. 熔断粒度:按业务重要性区分不同熔断策略 2. 降级逻辑:提供有意义的备用响应 3. 监控集成:对接Prometheus/Grafana 4. 手动覆盖:提供管理API强制切换状态 5. 日志记录:详细记录状态转换事件
常见问题[编辑 | 编辑源代码]
Q:熔断和重试会冲突吗? A:需要合理排序——应先重试再触发熔断,通常组合方式为: