Open Feign 설정 설명 - Cake-ly/cake-ly-wiki GitHub Wiki

Open Feign 설정 정리

Feign 클라이언트?

  • Spring Cloud 에서 제공하는 선언적 웹 서비스 클라이언트
  • RESTful 웹 서비스 호출 간소화를 위해 등장 - 인터페이스 기반

원리

  • 인터페이스에 정의된 메서드 시그니처를 분석해 - HTTP 요청을 동적으로 생성

설정

Feign

feign:
  client:
    config:
      default:
        connectTimeout: 10000  # 10초
        readTimeout: 10000     # 10초
        loggerLevel: basic     # URL, 응답 코드, 시간만 로깅
  compression:
    request:
      enabled: true
    response:
      enabled: true
  1. connectionTimeout
    • 타겟 서버와 연결 시도하는 시간 최대 10초
  2. readTimeout
    • 연결 후 응답을 기다리는 데 최대 시간 10초
  3. loggerLevel
    • 요청 URL, 응답 코드, 소요 시간만 로깅처리
  4. compression
    • 요청과 응답 본문 압축처리 네트워크 대역폭을 줄임
    • 물론 압축 때문에 응답 시간이 늘어날 순 있음.

Resilience4j - 회복성 패턴

머임?

그래서 왜쓰는데.

image

  • 만약 넷플릭스 에서 공통적으로 많이 사용되는 서비스가 하나가 장애가 발생했다고 생각해보자.
    • 하나의 서비스의 장애가 연결된 1000개의 서버로 에러를 뱉을것이다.
    • 만약 서킷브레이커가 존재하지 않는다면, 특정 스레드는 계속적으로 해당 api 를 호출하려고 시도를 하게 될 것이다.
    • 또한 지속적으로 해당 api를 여러 서버에서 동시에 호출함으로
      • 벌크헤드가 발생하게 되는데 이때 장애 서비스의 리소스 고갈을 유도하기도 한다.

설정

resilience4j:
  circuitbreaker:
    instances:
      default:
        slidingWindowSize: 20
        minimumNumberOfCalls: 10
        permittedNumberOfCallsInHalfOpenState: 5
        waitDurationInOpenState: 10s
        failureRateThreshold: 50
  retry:
    instances:
      default:
        maxAttempts: 3
        waitDuration: 2s
        retryExceptions:
          - java.io.IOException
          - java.net.ConnectException
          - org.springframework.web.client.ResourceAccessException
  bulkhead:
    instances:
      default:
        maxConcurrentCalls: 30
  timelimiter:
    instances:
      default:
        timeoutDuration: 8s
        cancelRunningFuture: true

서킷 브레이커

  1. slidingWindowSize
    • 최근 20번의 호출을 기반으로 실패율을 계산하도록 한다.
  2. minimumNumberOfCalls
    • 서킷 브레이커 동작을 위한 최소한의 호출 수를 정의한다.
    • 너무 모수가 적으면 신뢰도가 낮기에 최소 N 개 이상으로 호출이 된 경우에만 서킷 브레이커가 동작하도록 하는 것이다.
  3. failureRateThreshold
    • 실패율이 50% 가 넘는 경우 서킷이 열린다.

      OPEN, HALF OPEN, CLOSED

      • 열림 > - 서킷이 열린다는 것은
        • 모든 호출이 차단된다는 의미이다.
      • 반열림 > - 제한된 호출만 허용해서 서비스가 정상인지 확인하는 과정임
        • 성공시 → 닫힘
        • 실패시 → 열림
      • 닫힘 > - 호출이 정상적으로 처리되는 상태
        • slidingWindowSize 내에서 실패율이 N % 미만이면 해당 상태를 유지한다.
  4. waitDurationInOpenState
    • 열린 상태에서 10초 후 반열림으로 전환한다.

벌크헤드

  1. maxConcurrentCalls
    • 동시 호출 수를 제한해 시스템 과부하를 방지한다.
    • 최대 N 개의 동시 호출을 허용하는것이다.

타임리미터

  1. timeoutDuration
    • N 초 내에 응답 없으면 종료처리

재시도

  • maxAttempts
    • 최대 N 회 시도
  • waitDuration
    • 재시도 간에 2초 동안 대기한다.
  • retryException
    • 특정 예외 발생 시 재시도함.