일반적으로 마이크로 서비스간 통신에 문제가 생겨 circuitBreaker가 작동하면 열렸다고 표현하고
작동하지 않는 상태라면 닫혔다고 표현합니다.
@Configuration
public class Resilience4JConfiguration {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(4)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(2)
.build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
return fatory -> fatory.configureDefault(
id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build()
);
}
}
다수개의 circuitBreaker 설정을 만들고 싶다면
return fatory -> fatory.configureDefault(
id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build(),
"circuitBreaker name"
);
Resilience4JConfigBuilder 생성자에 circuitBreaker name을 인자값으로 줄 수 있고
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker name");
circuitBreaker를 생성할때 인자값으로 줬던 이름으로 config를 불러올 수 있습니다.
/* CircuitBreaker */
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker name");
List<OrderRes> orders = circuitBreaker.run(
() -> orderServiceClient.getOrders(userId), // toRun
throwable -> new ArrayList<>() // fallback
);
CircuitBreaker.run 의 첫번째 파라미터로 요청을 할 수 있고
두번째 파라미터에 throwable이 넘어오면 유의미한 후 처리를 할 수 있습니다.
Study TODO : https://happycloud-lee.tistory.com/219
refer :
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 이도원님,
https://cheese10yun.github.io/resilience4j-basic/,
https://junhyunny.github.io/spring-boot/spring-cloud/msa/design-pattern/msa-circuit-breaker-pattern/