1. 개요

이 예제에서는 Spring Cloud Circuit Breaker 프로젝트를 소개하고 이를 활용하는 방법을 배웁니다.

먼저 기존 회로 차단기 구현 외에 Spring Cloud 회로 차단기가 제공하는 기능을 살펴보겠습니다. 다음으로 Spring Boot 자동 구성 메커니즘을 사용하여 하나 이상의 회로 차단기를 애플리케이션에 통합하는 방법을 알아봅니다.

회로 차단기가 무엇이고 어떻게 작동하는지에 대한 자세한 정보는 Hystrix 소개 , Spring Cloud Netflix HystrixResilience4j 사용방법(예제)에서 확인할 수 있습니다.

2. 스프링 클라우드 서킷 브레이커

최근까지 Spring Cloud는 애플리케이션에 회로 차단기를 추가하는 한 가지 방법만 제공했습니다. 이는 Spring Cloud Netflix 프로젝트의 일부로 Netflix Hystrix를 사용했기 때문입니다.

Spring Cloud Netflix 프로젝트는 실제로 Hystrix 주변의 어노테이션 기반 래퍼 라이브러리입니다. 따라서 이 두 라이브러리는 밀접하게 결합되어 있습니다. 즉, 애플리케이션을 변경하지 않고는 다른 회로 차단기 구현으로 전환할 수 없습니다.

Spring Cloud Circuit Breaker 프로젝트는 이를 해결합니다. 다양한 회로 차단기 구현에서 추상화 계층을 제공합니다. 플러그 가능한 아키텍처입니다. 따라서 제공된 추상화/인터페이스에 대해 코딩하고 필요에 따라 다른 구현으로 전환할 수 있습니다.

예제에서는 Resilience4J 구현에만 중점을 둘 것입니다. 그러나 이러한 기술은 다른 플러그인에 사용할 수 있습니다.

3. 자동 구성

애플리케이션에서 특정 회로 차단기 구현을 사용하려면 적절한 Spring 스타터를 추가해야 합니다. 우리의 경우 spring-cloud-starter-circuitbreaker-resilience4j를 사용합시다 .

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

자동 구성 메커니즘 은 클래스 경로에서 스타터 중 하나를 발견하는 경우 필요한 회로 차단기 Bean을 구성합니다.

Resilience4J 자동 구성을 비활성화하려면 spring.cloud.circuitbreaker.resilience4j.enabled 속성을 false 로 설정할 수 있습니다.

4. 간단한 회로 차단기 예제

Spring Cloud Circuit Breaker 라이브러리가 작동하는 방식을 탐색할 수 있도록 Spring Boot를 사용하여 웹 애플리케이션을 만들어 보겠습니다.

우리는 앨범 List을 반환하는 간단한 웹 서비스를 구축할 것입니다. 원시 List이 타사 서비스에서 제공된다고 가정해 보겠습니다. 간단히 하기 위해 Jsonplaceholder 에서 제공하는 외부 더미 API를 사용 하여 List을 검색합니다.

https://jsonplaceholder.typicode.com/albums

4.1. 회로 차단기 만들기

첫 번째 회로 차단기를 만들어 봅시다. CircuitBreakerFactory의 인스턴스를 주입하는 것으로 시작하겠습니다 .

@Service
public class AlbumService {
    
    @Autowired
    private CircuitBreakerFactory circuitBreakerFactory;

    //... 

}

이제 CircuitBreakerFactory#create 메서드 를 사용하여 회로 차단기를 쉽게 만들 수 있습니다 . 회로 차단기 식별자를 인수로 사용합니다.

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");

4.2. 회로 차단기에서 작업 래핑

회로 차단기에 의해 보호되는 작업을 래핑하고 실행하려면 공급업체 를 인수로 사용하는 run 메서드 를 호출해야 합니다.

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "https://jsonplaceholder.typicode.com/albums";

    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class));
}

회로 차단기는 우리를 위해 우리의 방법을 실행하고 내결함성을 제공합니다.

경우에 따라 외부 서비스가 응답하는 데 너무 오래 걸리거나 예기치 않은 예외가 발생하거나 외부 서비스 또는 호스트가 존재하지 않을 수 있습니다. 이 경우 run 메서드 에 대한 두 번째 인수로 폴백을 제공할 수 있습니다 .

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "http://localhost:1234/not-real";
    
    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), 
      throwable -> getDefaultAlbumList());
}

폴백에 대한 람다 는 오류를 설명하는 입력으로 Throwable 을 수신합니다. , 대체를 트리거한 예외 유형에 따라 호출자에게 다른 대체 결과를 제공할 수 있습니다 .

이 경우 예외를 고려하지 않습니다. 캐시된 앨범 List만 반환합니다.

외부 호출이 예외로 종료되고 폴백이 제공되지 않으면 Spring에서 NoFallbackAvailableException 이 발생합니다.

4.3. 컨트롤러 구축

이제 예제를 마치고 서비스 메서드를 호출하고 브라우저를 통해 결과를 표시하는 간단한 컨트롤러를 만들어 보겠습니다.

@RestController
public class Controller {

    @Autowired
    private Service service;

    @GetMapping("/albums")
    public String albums() {
        return service.getAlbumList();
    }

}

마지막으로 REST 서비스를 호출하고 결과를 확인합니다.

[GET] http://localhost:8080/albums

5. 글로벌 사용자 지정 구성

일반적으로 기본 구성으로는 충분하지 않습니다. 이러한 이유로 사용 사례에 따라 사용자 지정 구성으로 회로 차단기를 만들어야 합니다.

기본 구성을 재정의하려면 @Configuration 클래스에서 자체 빈과 속성을 지정해야 합니다.

여기서는 모든 회로 차단기에 대한 전역 구성을 정의합니다. 이러한 이유로 Customizer<CircuitBreakerFactory>을 정의해야 합니다 . Resilience4JCircuitBreakerFactory 구현을 사용해 봅시다 .

먼저 Resilience4j 예제 에 따라 회로 차단기와 시간 제한기 구성 클래스를 정의합니다 .

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
  .failureRateThreshold(50)
  .waitDurationInOpenState(Duration.ofMillis(1000))
  .slidingWindowSize(2)
  .build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
  .timeoutDuration(Duration.ofSeconds(4))
  .build();

다음으로 Resilience4JCircuitBreakerFactory.configureDefault 메서드 를 사용하여 Customizer 빈에 구성을 포함시키겠습니다 .

@Configuration
public class Resilience4JConfiguration {
    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
        
        // the circuitBreakerConfig and timeLimiterConfig objects

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
          .timeLimiterConfig(timeLimiterConfig)
          .circuitBreakerConfig(circuitBreakerConfig)
          .build());
    } 
}

6. 특정 사용자 지정 구성

물론 애플리케이션에 여러 개의 회로 차단기를 사용할 수 있습니다. 따라서 어떤 경우에는 모든 회로 차단기에 대한 특정 구성이 필요합니다.

마찬가지로 하나 이상의 Customizer 빈을 정의할 수 있습니다. 그런 다음 Resilience4JCircuitBreakerFactory.configure 메서드 를 사용하여 각각에 대해 서로 다른 구성을 제공할 수 있습니다 .

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
}

여기에서 두 번째 매개변수인 구성 중인 회로 차단기의 ID를 제공합니다.

동일한 메서드에 회로 차단기 ID List을 제공하여 동일한 구성으로 여러 회로 차단기를 설정할 수도 있습니다.

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration2() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(),
        "circuitBreaker1", "circuitBreaker2", "circuitBreaker3");
}

7. 대체 구현

Resilience4j 구현을 사용하여 Spring Cloud 회로 차단기로 하나 이상의 회로 차단기를 생성 하는 방법을 살펴보았습니다 .

그러나 애플리케이션에서 활용할 수 있는 Spring Cloud Circuit Breaker에서 지원하는 다른 구현이 있습니다.

애플리케이션에서 서로 다른 회로 차단기 구현을 혼합하고 일치시킬 수 있다는 점을 언급할 가치가 있습니다 . 우리는 하나의 도서관에만 국한되지 않습니다.

위의 라이브러리에는 여기에서 살펴본 것보다 더 많은 기능이 있습니다. 그러나 Spring Cloud Circuit Breaker는 Circuit Breaker 부분만을 추상화한 것입니다. 예를 들어 Resilience4j는 이 기사에서 사용된 CircuitBreakerTimeLimiter 모듈 외에도 RateLimiter , Bulkhead , Retry 와 같은 다른 모듈도 제공합니다.

8. 결론

이 기사에서는 Spring Cloud Circuit Breaker 프로젝트를 발견했습니다.

먼저 Spring Cloud 회로 차단기가 무엇인지, 애플리케이션에 회로 차단기를 추가하는 방법을 배웠습니다.

다음으로 회로 차단기를 정의하고 통합하는 방법을 보여주기 위해 Spring Boot 자동 구성 메커니즘을 활용했습니다. 또한 간단한 REST 서비스를 통해 Spring Cloud Circuit Breaker가 어떻게 작동하는지 시연했습니다.

마지막으로 모든 회로 차단기를 함께 구성하는 방법과 개별적으로 구성하는 방법을 배웠습니다.

항상 그렇듯이 이 예제의 소스 코드는  GitHub에서 사용할 수 있습니다 .

Cloud footer banner