CircuitBreak
- 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단
- 다른 서비스로 대체 수행
의존성 주입 (build.gradle)
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
...
}
CircuitBreaker 설정 파일 (Default 설정 있어서 Custom 하게 사용할 경우만 생성)
- CircuitBreakerConfig
- failureRateThreshold
- CirucitBreaker open 결정 횟수
- default : 50
- waitDurationInOpenState
- CircuitBreak를 open 한 상태 유지하는 지속시간, 이후에는 half-open
- default 60
- slidingWindowType
- CircuitBreak가 닫힐때 통화 결과를 기록하는 데 사용되는 슬라이딩 창의 유형 구성, (카운트기만, 시간기반)
- slidingWindowSize
- CircuitBreak가 닫힐 때 호출 결과를 기록하는데 사용되는 슬라이딩 창의 크기
- default 100
- failureRateThreshold
- TimeLimiterConfig
- timeoutDuration
- 문제라고 감지하는 시간 설정
- timeoutDuration
import ...
@Configuration
public class Resilience4JConfig {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration(){
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(4)
.waitDurationInOpenState(Duration.ofMillis(3000))
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(2)
.build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build());
}
}
CircuitBreaker 사용 예시
- CircuitBreakerFactory를 주입 받는다.
- CircuitBreaker 객체를 만든다.
- CircuitBreaker을 사용한다.
import ...
@Service
@Slf4j
public class UserServicesImpl implements UserService {
...
CircuitBreakerFactory circuitBreakerFactory;
@Autowired
public UserServicesImpl(...,CircuitBreakerFactory circuitBreakerFactory) {
...
this.circuitBreakerFactory = circuitBreakerFactory;
}
@Override
public UserDto getUserByUserId(String userId, HttpHeaders headers) {
...
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("vocaServerCircuitbreaker");
StarsResponse stars = circuitBreaker.run(() -> vocaServerClient.getStarsByUser(userId, headers),
throwable -> new StarsResponse(new ArrayList<StarResponse>()));
...
}
}
'MSA' 카테고리의 다른 글
[MSA] Spring Boot - Micrometer란? Micrometer Timer example (0) | 2023.05.15 |
---|---|
[MSA] Spring Boot - Zipkin 이란? Spring Cloud Sleuth Example (0) | 2023.05.14 |
[MSA] Spring Boot - Kafka Consumer, Producer Example (0) | 2023.05.10 |
[MSA]Kafka Connect - Connect Sink Example (0) | 2023.05.09 |
[MSA]Kafka Connect - Connect Source Example (0) | 2023.05.08 |