사붐이개발일기
[FeignClient 장애처리] CircuitBreaker - Resilience4J 사용 본문
[FeignClient 장애처리] CircuitBreaker - Resilience4J 사용
sabeom 2024. 2. 27. 15:30CircuitBreaker 사용 이유

userClient에서 FeignClient로 orderClient를 요청 시 실패하면 userClient에서 실패한게 아니지만 500에러가 발생했다.
하지만 Fallback method를 구현시킨다면 결과적으로 userClient는 문제 없는것처럼 200 ok가 뜨도록 구현이 가능하다.
Circuit Breaker 란?
문제가 생겼던 service, 문제가 생겼던 function을 더이상 사용하지 않도록 막아주고 문제가 생겼던 서비스 상태가 정상적으로 복구되면 이전의 사용했던 흐름처럼 정상적으로 바꿔주는 장치를 CircuitBreaker라 한다.
- 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단
- 특정 서비스가 정상적으로 동작하지 않을 경우 다른 기능으로 대체 수행 => 장애회피


CURRENT (Spring Boot 2.4 이전) | REPLACEMENT (Spring Boot 2.4 이후) |
Hystrix (Circuit Breaker) | Resilience4j |
Hystrix Dashboard / Turbine | Micrometer + Monitoring System |
Ribbon | Spring Cloud Loadbalancer |
Zuul | Spring Cloud Gateway |
Archaius | Spring Boot external config + Spring Cloud Config |
Spring Boot 예제
- 프로젝트 환경
- Java : 17
- SpringBoot : 3.2.2
- SpringCloudVersion : 2023.0.0
gadle.build 의존성 추가 on user-service
// resilience4j
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
사용하고자 하는 service에 CircuitBreakerFactory 생성 후 에러로직 작성 on user-service
public class UserServiceImpl implements UserService {
CircuitBreakerFactory circuitBreakerFactory;
public UserServiceImpl(CircuitBreakerFactory circuitBreakerFactory){
this.circuitBreakerFactory = circuitBreakerFactory;
}
public void function() {
// List<ResponseOrder> ordersList = orderServiceClient.getOrders(userId);
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
List<ResponseOrder> ordersList = circuitBreaker.run(()-> orderServiceClient.getOrders(userId),
throwable -> new ArrayList<>());
}
}
CircuitBreakerFactory를 위한 config파일 만들기 ( config/Resilience4JConfig.java ) on user-service
@Configuration
public class Resilience4JConfig {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(4) // 기록된 호출 중 4%가 실패하면 circuit open
.waitDurationInOpenState(Duration.ofMillis(1000)) // circuit이 open되면 1000초 동안 유지 후 half-open으로 전환
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED) // count 또는 time을 기준으로 집계할것인지 선택
.slidingWindowSize(2) // 최대 2개의 호출을 기록하여 집계
.build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4)) // timeout 4초
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build()
);
}
}
Reference
1. [디자인패턴] 서킷브레이커 패턴(Circuit Breaker Pattern)의 필요성 및 동작 원리
https://mangkyu.tistory.com/261
2. MSA에서 필수로 알아야 하는 Circuit Breaker 패턴
https://be-student.tistory.com/100
3. Spring Cloud Resilience4j 설정 설명
https://otrodevym.tistory.com/entry/spring-boot-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-24-spring-cloud-Resilience4j1-%EC%84%A4%EC%A0%95-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%86%8C%EC%8A%A4
'인프런 > [Spring Cloud] MSA-이도원' 카테고리의 다른 글
[모니터링] Micrometer 와 Actuator, Prometheus 와 Grafana (0) | 2024.02.28 |
---|---|
[Microservice 분산추적] Zipkin 과 Spring Cloud Sleuth (0) | 2024.02.27 |
[Spring Cloud Bus AMQP] 섹션8. RabbitMQ 설치 - 윈도우10 (0) | 2024.02.23 |
[Kafka] 데이터 동기화를 위한 Apache Kafka의 활용 (0) | 2023.12.27 |
[MSA] Microservice간 통신 (RestTemplate, FeignClient, 예외처리) (0) | 2023.12.26 |