들어가며
지난 시간에는 CircuitBreaker 개념에 대해서 알아보았고 이번 시간에는 설정 방법과 테스트에 대해 정리한다.
시리즈 1 - MSA
https://sjparkk-dev1og.tistory.com/151
시리즈 2 - Eureka
https://sjparkk-dev1og.tistory.com/153
시리즈 3 - OpenFeign
https://sjparkk-dev1og.tistory.com/155
시리즈 4 - Circuit Breaker 패턴 개념
https://sjparkk-dev1og.tistory.com/157
서킷브레이커 Resilience4J 설정 방법
1. 의존성 추가
implementation("org.springframework.boot:spring-boot-starter-aop")
implementation("io.github.resilience4j:resilience4j-spring-boot2:1.7.0")
implementation("io.github.resilience4j:resilience4j-reactor:1.7.0")
2. Config or application.yml 설정중 택 1
- Config
- yml
** detail한 exception 설정을 위해 config 방법 권장, yml 설정 시 주의점은 CircuitBreaker 자체가 Bean으로 등록되지 않는다. Spring Bean에 등록되는 것은 CircuitBreakerRegistry뿐이며 서킷브레이커 객체를 이용하기 위해서는 registry에서 직접 꺼내줘야한다.
3. CircuitBreaker 서비스 정의해주기
- 서킷브레이커 패턴을 적용할 서비스에 @CircuitBreaker 어노테이션 적용 및 옵션값 설정
- name 은 config에 설정한 circuitBreaker name과 동일하게 설정, yml이라면 instances 하위 name을 적어준다.
- fallbackMethod에는 해당 서비스에서 익셉션이 발생했을시 실행될 메서드명을 입력해준다.
4. 테스트 로그 확인
먼저 모든 애플리케이션을 실행한다. 이후 테스트를 위해 slidingWindow 값을 5로 설정한다. 스토어 1번이 나오도록 설정된 API로 5번 요청을 보내면 아래와 같이 Exception이 발생하게 되며 그 이후 요청으로는 CallNotPermiitedException이 발생하여 호출을 막게된다.
이렇게 되면 기존에 CLOSED 상태였던게 OPEN으로 상태가 변하게 되고 시간이 지나면 HALF_OPEN 상태로 바뀌게 되고 이후 다시 서킷을 열지 닫을지 판단하게 됩니다.
추가 사항
아래 옵션값들의 설정에 따라 다양하게 설정이 가능하다.
- name: 서킷브레이커의 이름
- failureRateThreshold: 실패 비율의 임계치
- slowCallRateThreshold: 느린 호출의 임계치
- slowCallDurationThreshold: 느린 호출로 간주할 시간 값
- slidingWindowType: 서킷브레이커의 타입을 지정한다. TIME_BASED, COUNT_BASED 중 택 1
- slidingWindowSize: 시간은 단위 초, 카운트는 단위 요청 수
- minimumNumberOfCalls: 총 집계가 유효해 지는 최소한의 요청 수. 이 값이 1000이라면 999번 실패해도 서킷브레이커는 상태변이가 일어나지 않는다.
- waitDurationInOpenState: OPEN에서 HALF_OPEN으로 상태변이가 실행되는 최소 대기 시간
- permittedNumberOfCallsInHalfOpenState: HALF_OPEN 상태에서 총 집계가 유효해지는 최소한의 요청 수. COUNT_BASED로 slidingWindowType이 고정되어 있다.
- automaticTransition: true라면 waitDurationInOpenState로 지정한 시간이 지났을 때 새로운 요청이 들어오지 않아도 자동으로 HALF_OPEN으로 상태변이가 발생한다.
- ignoreExceptions: 해당 값에 기재한 exception은 모두 실패로 집계하지 않는다.
- recordExceptions: 해당 값에 기재한 exception은 모두 실패로 집계한다.
더 자세한 설정 정보는 아래 공식 문서를 참고
https://resilience4j.readme.io/docs/circuitbreaker
'Spring' 카테고리의 다른 글
@NotFound 어노테이션 (0) | 2022.08.03 |
---|---|
Spring Data JPA - Pageable을 이용한 Pagenation 처리 방법 (0) | 2022.07.17 |
@JsonIgnore 사용시 발생한 문제점과 @JsonProperty를 이용한 해결 방법 정리 (0) | 2022.06.29 |
SpringBoot - LogBack 관련 개념 및 설정 방법 (1) (0) | 2022.06.19 |
SpringBoot Cloud - MSA & Eureka & FeignClient(OpenFeign) & CircuitBreaker(Hystrix & Resilience4J) 차례대로 알아보기 시리즈 (4-1) - CircuitBreaker 개념 및 설정방법 (0) | 2022.06.08 |
댓글