Spring Cloud(MSA)

Resilience4J = CircuirtBreaker

lby132 2022. 9. 28. 00:55

Feign Client를 이용해 user-service에서 order-service에 있는 getOrders()를 호출하는데 order-service에 있는 메소드임에도 불구하고 user-service에서 에러가 발생한다. 굳이 user-service에서 잘못된게 아니니 오류를 발생 시키고 싶지않다.

 

 

위 로직처럼 order-service를 호출하는 과정에 오류발생 시점에서 폴백시키고 정상처리 시키며 대신 order-service에서 값을 가져오지 못한것만 보여주면 된다.

이런식으로.

 

이 상황을 만족시키기 위해서 Resilience4J를 쓴다.

user-service에 

주입

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

 

Resilience4J 설정


@Configuration
public class Resilience4JConfig {

    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {

        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                .failureRateThreshold(4)        // circuitbreak를 열지말지 결정함. 기본값 50
                .waitDurationInOpenState(Duration.ofMillis(1000))   // circuitbreak를 open한 상태를 유지하는 지속 기간. 기본 60초
                //circuitbreak가 닫힐때 통화 결과를 기록하는데 사용되는 슬라이딩 창의 유형을 구성 카운트기반 또는 시간 기반 이건 카운트 기반으로 설정.
                .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)  
                .slidingWindowSize(2)   // circuitbreak가 닫힐 때 호출 결과를 기록하는데 사용되는 슬라이딩 창의 크기 구성 기본값 100
                .build();

        TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
                .timeoutDuration(Duration.ofSeconds(4))
                .build();

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

    }
}

CircuitBreakerFactory 를 주입받아서 

CircuitBreaker circuitbreaker = circuitBreakerFactory.create("circuitbreaker"); //circuitbreaker 생성.
        List<ResponseOrder> orderList = circuitbreaker.run(() -> orderServiceClient.getOrders(userId),  
                throwable -> new ArrayList<>()); // circuitbreaker를 실행시켰을때 getOrders가 에러가 발생하면 빈값을 넣는다.

이렇게 실행 해주면 된다. order-service의 런 상태를 끄던 해서 오류를 생성하고 포스트맨에서 테스트를 해보면 user-service에서는 에러를 발생시키지 않고 위에서 보여준것 처럼

orders값이 빈값이 나오고 정상처리 된다.

'Spring Cloud(MSA)' 카테고리의 다른 글

Zipkin  (0) 2022.09.29
아파치 카프카  (0) 2022.09.28
kafka 테스트할때 명령어 메모  (0) 2022.09.27
Spring Cloud Bus(with RabbitMq)  (0) 2022.09.24
Symmetric, Asymmetric  (0) 2022.09.24