在微服务架构中,服务之间调用频繁,如果某个服务出现故障,会导致调用它的服务也受影响,甚至出现雪崩效应。为了解决这个问题,引入了 断路器(Circuit Breaker)模式。
一、什么是断路器
断路器类似电路中的开关,它会根据服务调用的状态自动决定:
- 关闭状态(Closed):正常调用,服务请求直接转发。
- 打开状态(Open):当某个服务连续失败达到阈值时,断路器会“打开”,阻止后续请求调用目标服务,直接返回错误或降级。
- 半开状态(Half-Open):经过一定时间后,断路器会允许部分请求通过,如果这些请求成功,断路器关闭,否则继续打开。
断路器的核心目的:快速失败 + 降级处理 + 防止雪崩
二、Spring Cloud 中的 Circuit Breaker
Spring Cloud 对断路器提供了统一接口,并支持多种实现,比如:
- Resilience4j(推荐,轻量且功能完善)
- Hystrix(Netflix 出品,但已进入维护模式)
- Sentinel(阿里开源,适合复杂流控和熔断降级)
Spring Cloud 提供了 spring-cloud-starter-circuitbreaker 和 spring-cloud-starter-circuitbreaker-resilience4j 等 starter 来快速集成。
三、基本使用示例(Resilience4j)
- 添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
- 配置断路器参数(
application.yml):
resilience4j.circuitbreaker:
instances:
myServiceCircuitBreaker:
registerHealthIndicator: true
slidingWindowType: COUNT_BASED
slidingWindowSize: 5
minimumNumberOfCalls: 3
permittedNumberOfCallsInHalfOpenState: 2
waitDurationInOpenState: 5000
failureRateThreshold: 50
slidingWindowSize:统计窗口大小
failureRateThreshold:失败率达到阈值就打开断路器
waitDurationInOpenState:打开状态保持时间
permittedNumberOfCallsInHalfOpenState:半开状态允许的尝试次数
在微服务架构中,服务之间调用频繁,如果某个服务出现故障,会导致调用它的服务也受影响,甚至出现雪崩效应。为了解决这个问题,引入了 断路器(Circuit Breaker)模式。
一、什么是断路器
断路器类似电路中的开关,它会根据服务调用的状态自动决定:
- 关闭状态(Closed):正常调用,服务请求直接转发。
- 打开状态(Open):当某个服务连续失败达到阈值时,断路器会“打开”,阻止后续请求调用目标服务,直接返回错误或降级。
- 半开状态(Half-Open):经过一定时间后,断路器会允许部分请求通过,如果这些请求成功,断路器关闭,否则继续打开。
断路器的核心目的:快速失败 + 降级处理 + 防止雪崩
二、Spring Cloud 中的 Circuit Breaker
Spring Cloud 对断路器提供了统一接口,并支持多种实现,比如:
- Resilience4j(推荐,轻量且功能完善)
- Hystrix(Netflix 出品,但已进入维护模式)
- Sentinel(阿里开源,适合复杂流控和熔断降级)
Spring Cloud 提供了 spring-cloud-starter-circuitbreaker 和 spring-cloud-starter-circuitbreaker-resilience4j 等 starter 来快速集成。
三、基本使用示例(Resilience4j)
- 添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
- 配置断路器参数(
application.yml):
resilience4j.circuitbreaker:
instances:
myServiceCircuitBreaker:
registerHealthIndicator: true
slidingWindowType: COUNT_BASED
slidingWindowSize: 5
minimumNumberOfCalls: 3
permittedNumberOfCallsInHalfOpenState: 2
waitDurationInOpenState: 5000
failureRateThreshold: 50
slidingWindowSize:统计窗口大小
failureRateThreshold:失败率达到阈值就打开断路器
waitDurationInOpenState:打开状态保持时间
permittedNumberOfCallsInHalfOpenState:半开状态允许的尝试次数
- 在代码中使用:
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final CircuitBreakerFactory circuitBreakerFactory;
public MyService(CircuitBreakerFactory circuitBreakerFactory) {
this.circuitBreakerFactory = circuitBreakerFactory;
}
public String callRemoteService() {
return circuitBreakerFactory.create("myServiceCircuitBreaker")
.run(() -> {
// 调用远程服务
return remoteService();
}, throwable -> {
// 降级逻辑
return "服务不可用,请稍后再试";
});
}
private String remoteService() {
// 模拟远程调用
if (Math.random() < 0.5) {
throw new RuntimeException("远程调用失败");
}
return "成功响应";
}
}
run() 方法第一个参数是业务逻辑
- 第二个参数是降级逻辑,当调用失败或者断路器打开时执行
四、断路器的使用场景
- 服务调用超时
防止某个服务响应慢导致调用方线程阻塞。
- 服务故障
当服务连续失败时,断路器可以快速返回默认值,避免雪崩。
- 依赖第三方接口
对不稳定的第三方 API 接口,使用断路器可保证系统稳定。
- 流量保护
防止突发高并发时依赖服务挂掉,引发级联故障。
五、总结
Spring Cloud 的 Circuit Breaker 提供了:
- 自动监控服务状态
- 智能开关控制请求流向
- 支持降级和快速失败
- 多种实现可选(Resilience4j、Hystrix、Sentinel)
断路器是微服务架构中的必备组件,可以极大提升系统的稳定性和容错能力。