본문 바로가기

Spring

Spring cloud circuit breaker fallback 메소드 테스트

728x90
반응형

Spring cloud Circuit Breaker Config빈 등록 방법은 아래 포스팅을 참고

https://tweety1121.tistory.com/entry/Spring-circuitbreaker-actuator-health-check-%EC%84%A4%EC%A0%95

 

Spring circuitbreaker actuator health check 설정

Gradle implementation "org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j" implementation 'org.springframework.boot:spring-boot-starter-actuator' CircuitBreaker Confi..

tweety1121.tistory.com


application.yml

resilience4j.circuitbreaker:
  configs:
    default:
      failureRateThreshold: 50
      slowCallRateThreshold: 100
      slowCallDurationThreshold: 60000
      permittedNumberOfCallsInHalfOpenState: 4
      maxWaitDurationInHalfOpenState: 1000
      slidingWindowType: COUNT_BASED
      slidingWindowSize: 10
      minimumNumberOfCalls: 10
      waitDurationInOpenState: 10000
      registerHealthIndicator: true

failureRateThreadhold : 실패 비율 50%가 넘어가면 서킷브레이커가 오픈된다.

minimumNumberOfCalls : 실패율, 느린 응답 비율을 계산한 최소 요청 수 (10개 이상부터 서킷브레이커 오픈에 대한 계산을 한다)

permittedNumberOfCallsInHalfOpenState : 서킷이 반오픈상태일 때 받아들일 요청 갯수 

maxWaitDurationInHalfOpenState : 회로가 반-개방 상태일 때, 처리하는 요청의 최대 타임아웃

https://resilience4j.readme.io/docs/circuitbreaker

 

CircuitBreaker

Getting started with resilience4j-circuitbreaker

resilience4j.readme.io

 

TestController.java

@RestController
@RequiredArgsConstructor
public class TestController {

    //@RequiredArgsConstructor는 final이 붙은 초기화되지 않은 필드 생성자를 만들어준다
    // @NotNull  도 가능
    // 의존성을 높이기 위해 
    private final TestService testService;

    @GetMapping("/test")
    public String test() {
        int randomNo = new Random().nextInt();
        String result = randomNo % 2 == 0? testService.test(): testService.fail();
        return result;
    }

}

/test API를 호출할 때 랜덤하게 성공과 실패를 호출한다.

짝수일경우 test호출 홀수일 경우 fail 호출

TestService.java

@Service
public class TestService {

    @CircuitBreaker(name = "test", fallbackMethod = "fallbackGet")
    public String test() {
        return "hi";
    }

    @CircuitBreaker(name="test", fallbackMethod = "fallbackGet")
    public String fail() {
        throw new RuntimeException("Failed");
    }

    private String fallbackGet(Throwable  t) {
        return "FallBack error Message : " + t.getMessage();
    }

}

@CircuitBreaker 어노테이션을 사용하려면 spring-starter-aop를 gradle에 추가해줘야한다.

implementation 'org.springframework.boot:spring-boot-starter-aop'

RuntimeException 이 발생하면 fallbackMethod를 호출한다.

@CicuitBreaker에 name을 지정하면 동일한 서킷브레이커로 같은 config설정이 적용된다.

 

 

랜덤하게 정상적인 호출과 exception이 발생한다.

 


최초 /actuator/health 호출시 

test circuit breaker에 status가 CLOSED로 되어있다.(details가 citcuit의 상태)

10개호출 했을 때 50%이상 실패했을 경우 서킷이 오픈되도록 설정되어있다.

 

/test 를 호출하면 

hi
FallBack error Message : Failed

두 가지 리턴이 랜덤하게 호출된다.

실패할때마다 failedCalls 수가 증가한다.

FallBack error Message : CircuitBreaker 'test' is OPEN and does not permit further calls

10개중 50%이상이 실패일 경우 Circuit이 오픈된 걸 확인할 수 있다.

728x90
반응형