서킷 브레이커 (Resilience4j) 실습

CIRCUITBREAKER
2024.11.25
·
2 min read

환경 설정

  • Resilience4j를 사용하기 위한 build.gradle 의존성 추가 및 application.yml 파일 설정

dependencies {
    implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
}

실습

    @GetMapping("/product/{id}")
    public Product getProduct(@PathVariable String id) {
        return productService.getProductDetails(id);
    }
    @CircuitBreaker(name =  "productService", fallbackMethod = "fallbackGetProductDetails") // 실패하면 fallbackGetProductDetails 메서드 실행
    public Product getProductDetails(String productId) {
        log.info("###Fetching product details for productId: {}", productId);
        if ("111".equals(productId)) {
            log.warn("###Received empty body for productId: {}", productId);
            throw new RuntimeException("Empty response body");
        }
        return new Product(
            productId,
            "Sample Product : " + productId
        );
    }

    public Product fallbackGetProductDetails(String productId, Throwable t) {
        log.error("####Fallback triggered for productId: {} due to: {}", productId, t.getMessage());

        return new Product(
            productId,
            "FallbackProduct : " + productId
        );
    }
  • product 조회 시 "111"을 조회하면 예외 처리 로직

결과

실패하면 fallbackMethod로 지정한 fallbackGetProductDetails 메서드가 실행되고 이후 일정 시간(20)동안은 올바른 요청을 해도 fallbackGetProductDetails 메서드가 실행되는 것을 확인했다

해당 실습은 간단하기도 했고 fallback 로직이 응답 내려주는 것이라 아직 뭔가 잘 모르겠다







- 컬렉션 아티클