Spring Cloud 系列文章之二十一:Spring Cloud Circuit Breaker 在微服务架构中的应用

引言

在微服务架构中,各服务之间的调用频繁且复杂。某个服务的故障或延迟可能会导致连锁反应,影响整个系统的稳定性。Spring Cloud Circuit Breaker 提供了一种优雅的方式来处理这种情况,通过熔断机制保护服务,防止故障蔓延。本篇文章将详细介绍 Spring Cloud Circuit Breaker 的基本概念及其在实际项目中的应用。

什么是 Spring Cloud Circuit Breaker?

Spring Cloud Circuit Breaker 是一个提供熔断机制的框架,旨在增强微服务系统的稳定性和容错能力。它可以检测服务的异常情况(如高延迟、错误率过高),并在必要时中断请求流,防止问题扩大。主要功能包括:

  1. 熔断器:监控服务调用情况,根据预设的条件触发熔断。
  2. 断路:在服务出现问题时,短时间内阻止请求发送到故障服务,防止资源浪费。
  3. 恢复:在一段时间后,允许部分请求尝试恢复连接,若服务恢复正常,则关闭熔断器。
搭建 Spring Cloud Circuit Breaker 项目
  1. 创建 Spring Boot 项目

首先,创建一个新的 Spring Boot 项目,并添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
  1. 配置 Eureka 客户端

application.yml 文件中配置 Eureka 客户端:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  1. 配置熔断器

application.yml 文件中配置 Resilience4j 熔断器:

resilience4j:
  circuitbreaker:
    instances:
      myService:
        registerHealthIndicator: true
        ringBufferSizeInClosedState: 5
        ringBufferSizeInHalfOpenState: 3
        waitDurationInOpenState: 10000
        failureRateThreshold: 50
        eventConsumerBufferSize: 10
  1. 实现服务调用

创建一个服务调用类,并使用 @CircuitBreaker 注解:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class MyService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private CircuitBreakerFactory circuitBreakerFactory;

    public String callExternalService() {
        return circuitBreakerFactory.create("myService").run(
            () -> restTemplate.getForObject("http://external-service/endpoint", String.class),
            throwable -> fallbackMethod()
        );
    }

    public String fallbackMethod() {
        return "Fallback response";
    }
}
  1. 创建 REST 控制器

创建一个 REST 控制器来触发服务调用:

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping("/call")
    public String callService() {
        return myService.callExternalService();
    }
}
  1. 启动应用

运行 Spring Boot 应用,访问 http://localhost:8080/call 触发服务调用,并观察熔断器的行为。

高级应用
  1. 自定义熔断器配置

通过配置文件或代码自定义熔断器的行为:

resilience4j:
  circuitbreaker:
    instances:
      customService:
        registerHealthIndicator: true
        ringBufferSizeInClosedState: 10
        ringBufferSizeInHalfOpenState: 5
        waitDurationInOpenState: 5000
        failureRateThreshold: 30
        eventConsumerBufferSize: 20
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
        .circuitBreakerConfig(CircuitBreakerConfig.custom()
            .slidingWindowSize(10)
            .failureRateThreshold(30)
            .waitDurationInOpenState(Duration.ofMillis(5000))
            .build())
        .build());
}
  1. 熔断器事件监听

监听熔断器事件,进行自定义处理:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import io.github.resilience4j.circuitbreaker.event.CircuitBreakerEvent;

@Component
public class CircuitBreakerEventListener {

    @EventListener
    public void onCircuitBreakerEvent(CircuitBreakerEvent event) {
        System.out.println("CircuitBreaker event: " + event.getEventType());
    }
}
  1. 监控和报警

集成 Spring Boot Actuator 和 Prometheus/Grafana 实现熔断器的监控和报警。

小结

通过本文的介绍,您已经了解了如何使用 Spring Cloud Circuit Breaker 实现微服务架构中的熔断机制。熔断器能够有效提高系统的稳定性和容错能力,防止单个服务的故障影响整个系统。在下一篇文章中,我们将探讨 Spring Cloud Stream 在数据处理中的应用,敬请期待。


如果您觉得这篇文章有用,请点赞、分享并关注我的博客,以便获取更多关于 Spring Cloud 的最新资讯。您的支持是我不断创作的动力!

更多推荐