반응형
환경: springboot2.7.6, java11
circuit breaker
- 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단
- 특정 서비스가 정상적으로 동작하지 않을 경우 다른 기능으로 대체수행하여 장애를 회피함
- open이 되었을 때 우회수행
- spring cloud netflix hystrix(19년 deprecated)
- resilience 4j ; 경량/자바 8 이상 지원
1. pom.xml 에 의존성 추가
<!-- resilience4j -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
2. open feign 을 통해 다른 msa component로 통신하던 부분을 circuit breaker로 변경
우선 기본적으로 제공하는 circuitBreakerFactory을 사용해본다.
//클래스 상단에 주입
private final CircuitBreakerFactory circuitBreakerFactory;
...
//함수 안
//open-feign with error decoder
//orders = orderServiceClient.getOrders(userId);
CircuitBreaker circuitBreaker =circuitBreakerFactory.create("circuitbreaker");
orders = circuitBreaker.run(() -> orderServiceClient.getOrders(userId), throwable -> new ArrayList<>());
3. 이렇게 해두고 해당 msa component를 down 시킨상태에서 api 요청.
로그에는 접속 불가가 뜨지만 결과는 빈 array 반환됨
4. 기본 세팅말고 설정을 상세하게 바꾸고 싶다면 아래처럼 custom하여 빈으로 등록하면 됨
각 설정 의미는 공식 문서 참고
@Configuration
public class Resilience4Config {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfig(){
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build();
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(4)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED) //기본값임
.slidingWindowSize(2)
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build());
}
}
728x90
반응형
'개발 > spring-cloud' 카테고리의 다른 글
[spring-cloud] micrometer, prometheus (0) | 2024.02.08 |
---|---|
[spring-cloud] zipkin 분산 환경 모니터링 (0) | 2024.02.08 |
[cloud] property값 암호화하여 사용하기 (0) | 2024.01.29 |
[cloud] spring cloud bus (0) | 2024.01.29 |
[cloud] 파일을 동적으로 관리하는 config server (0) | 2024.01.29 |