[TIL] 241202
Do - List
- POST /orders 주문 추가 API 구현
- PUT /orders/{orderId} 주문에 상품을 추가하는 API 구현
- POST /orders?fail 주문 추가 API - 상품 API 호출 실패 케이스 구현
이 부분이 가장 오래 걸리고 에러 해결이 잘 안 됐는데, 구현 후 돌아보니 gradle.build의 의존성 설정과 application.yml 설정을 잘 못했던 것 같습니다. Spring Cloud OpenFeign과 Resilience4j를 함께 사용할 때는 올바른 설정을 적용하려면 두 가지를 모두 포함한 구성이 필요합니다.
spring:
cloud:
openfeign:
circuitbreaker:
enabled: true
alphanumeric-ids:
enabled: true
기존 application.yml 설정은 Spring Cloud OpenFeign의 Circuit Breaker 기능만 활성화합니다. Resilience4j와의 구체적인 통합 설정이 없기 때문에, 원하는 동작 (e.g., Circuit Breaker가 ProductClient의 Fallback을 호출)으로 연결되지 않을 수 있습니다.
feign:
circuitbreaker:
enabled: true
resilience4j:
circuitbreaker:
instances:
product: # ProductClient와 매핑될 Circuit Breaker 설정
register-health-indicator: true
sliding-window-size: 10 # 최근 10개의 요청을 기준으로 실패율 계산
failure-rate-threshold: 50 # 50% 이상 실패하면 Circuit Breaker 열림
wait-duration-in-open-state: 10000 # Circuit Breaker가 열려있는 상태 유지 시간 (밀리초)
따라서 Resilience4j를 사용할 때, OpenFeign의 Circuit Breaker 기능과 통합하려면 Feign 설정에 위와 같이 feign.circuitbreaker.enabled를 활성화하고, 동시에 Resilience4j 설정을 통해 서비스별로 세부 동작을 정의해야 합니다.
- feign.circuitbreaker.enabled:
- OpenFeign에서 Circuit Breaker를 활성화하는 설정입니다.
- Resilience4j를 Circuit Breaker 라이브러리로 사용할 때 필수입니다.
- resilience4j.circuitbreaker.instances:
- Resilience4j의 Circuit Breaker 설정을 세분화하여 특정 서비스(product)에 대한 동작 방식을 정의합니다.
- 여기서 product라는 이름은 @CircuitBreaker(name = "product")와 매칭됩니다.
- 세부 설정:
- sliding-window-size: Circuit Breaker가 실패율을 계산할 때 사용하는 요청 개수입니다.
- failure-rate-threshold: 실패율 임계값(%)으로, 지정된 값을 초과하면 Circuit Breaker가 열립니다.
- wait-duration-in-open-state: Circuit Breaker가 열려있을 상태의 지속 시간(밀리초)입니다.
이렇게 설정하면 orderService에서 설정한 fallbackMethod가 실행됩니다.
@FeignClient(name = "product", fallback = ProductClientFallback.class)
public interface ProductClient {
@GetMapping("/products/{productId}/exists")
boolean isProductExist(@PathVariable Long productId);
}
ProductClient에서 호출한 ProductClientFallback.class는 끝까지 인식하지 못하는 한계가 있었습니다.
- GET /orders/{orderId} 주문 단건 조회 API 구현
- 상품 서비스 Weighted Load Balancing 구성 시도