Circuit Breaker Pattern 적용


Circuit Breaker Pattern 적용


@CircuitBreaker

오늘은 애노테이션 기반으로 Circuit Breaker를 적용해보는 시간을 가졌다.

@GetMapping("/")
@CircuitBreaker(name = "", fallBackMehtod = "")
public void testMethod() {
    //...
}

@CircuitBreaker에는 name, fallbackMethod 두 가지 속성을 설정할 수 있다.

  • name : circuit breaker의 이름
  • fallbackMethod : 요청이 실패했을 때 호출할 콜백 메소드명.


두개의 프로젝트 만들기

Project A


@RestController
@RequestMapping("/a")
public class ServiceAController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String BASE_URL = "http://localhost:8081/";
    private static final String SERVICE_A = "serviceA";

    @GetMapping
    @CircuitBreaker(name = SERVICE_A, fallbackMethod = "serviceAFallback")
    public String serviceA() {
        String url = BASE_URL + "b";
        return restTemplate.getForObject(
                url,
                String.class
        );
    }

    public String serviceAFallback(Exception e) {
        return "This is a fallback method for Service A";
    }
}
resilience4j:
  circuitbreaker:
    instances:
      serviceA:
        registerHealthIndicator: true   
        eventConsumerBufferSize: 10
        failureRateThreshold: 50
        minimumNumberOfCalls: 5
        automaticTransitionFromOpenToHalfOpenEnabled: true
        waitDurationInOpenState: 5s
        permittedNumberOfCallsInHalfOpenState: 3
        slidingWindowSize: 10
        slidingWindowType: COUNT_BASED

▶︎ 설정 정보에 대한 설명


Project B


@RestController
@RequestMapping("/b")
public class ServiceBController {

    @GetMapping("")
    public String serviceB() {
        return "Service B is called from Service A";
    }

}



요청 Test

ServerA 상태ServerB 상태결과
UpUp“Service B is called from Service A”
UpDown“This is a fallback method for Service A”

ServerB가 내려갔을 때 ServerA에서 설정해둔 FallbackMethod가 실행됨을 확인할 수 있었다.


참고 블로그 및 영상

▶︎ Youtube 강의