Spring Cloud Circuit Breaker - redutan/redutan.github.io GitHub Wiki
Circuit Breaker(νλ‘μ°¨λ¨κΈ°)
- Release It μμ μ²μ μκ°λ ν¨ν΄
- μ격 μλΉμ€ νΈμΆ μ μλΉμ€ μ₯μ κ° μ νλλ κ²μ λ°©μ§νλ ν¨ν΄
- Cloud, MSA νκ²½μμ νμ ν¨ν΄ μ€ νλ
- Close: νλ‘μ°¨λ¨κΈ°κ° λ«ν μμΌλκΉ ν΅μ μ΄ μλλ μν.
- Open: μ°κ²°νλ μλ²μ ν΅μ μ΄ κ³μ μ€ν¨νλ μμ ν΅μ μ μλνμ§ μκ³ λ°λ‘ μ€ν¨(or Fallback)νλ μν. fail-fast
- Half-Open: ν΅μ μ΄ κ°λ₯νμ§ μλν΄ λ³΄λ μν. Open μνμμ μ£ΌκΈ°μ μΌλ‘ Half-Open μνλ‘ λ°λ. μ¬κΈ°μμ ν΅μ μ΄ μ±κ³΅ μνλ‘ νλ¨λλ©΄ Close μνλ‘ λ°λ.
Spring Cloud Circuit Breaker
νμ¬λ resilience4j ꡬν체λ₯Ό κ°μ₯ λ§μ΄ μ¬μ©νκ³ μμ
μ’μ μ½μ거리
implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")
- spring boot Config μμ (open-feignκ³Ό μ‘°ν©)
resilience4j:
circuitbreaker: # https://resilience4j.readme.io/docs/circuitbreaker#create-and-configure-a-circuitbreaker
configs:
default:
sliding-window-type: time_based # μκ° κΈ°λ° μλμ° μ¬λΌμ΄λ μ€μ (default: count_based)
sliding-window-size: 30 # ν μ¬λΌμ΄λ λ¨μλ 30μ΄(default:100)
minimum-number-of-calls: 10 # μ΅μ νΈμΆ κ°μ. μ΄ μ΄μ νΈμΆλμ΄μΌμ§ μ€λ₯ μ¬λΆλ₯Ό νλ¨ν μ μλ€. (default: 100)
slow-call-rate-threshold: 75 # slow-call λΉμ¨ μκ³μΉ(%).(default: 100) slow-callμ΄ μ΄ μκ³μΉλ₯Ό λμ΄κ°λ©΄ OPEN λλ€.
slow-call-duration-threshold: 6s # slow-call λ‘ νλ¨νλ λκΈ°μκ° μκ³μΉ
wait-duration-in-open-state: 15s # OPEN -> HALF_OPEN μΌλ‘ μ νλκΈ° μ μ λκΈ°μκ° (default: 60s)
permitted-number-of-calls-in-half-open-state: # HALF_OPEN μ νμ©λλ νΈμΆ μ (default: 10)
ignore-exceptions: # ν΄λΉ μμΈλ μ₯μ λ‘ νλ¨νμ§ μμ.(μ ν리μΌμ΄μ
λ΄μμ 400 κ³μ΄λ‘ λ°μν μ μλ μν©)
- com.sample.exception.InternalApiClientException
kakao:
base-config: default
naver:
base-config: default
slow-call-duration-threshold: 8s
instances:
default:
base-config: default
timelimiter:
configs:
default:
timeout-duration: 9s # slowCallDurationThreshold보λ€λ ν¬κ² μ€μ λμ΄μΌ ν¨. κ·Έλ¦¬κ³ feign read-timeout λ³΄λ€ μ§§μμΌν¨
cancel-running-future: true
naver:
base-config: default
timeout-duration: 11s
kakao:
base-config: default
timeout-duration: 11s
spring:
cloud:
circuitbreaker:
resilience4j:
disable-time-limiter: true # spring-boot 3.1.x μμ μ¬μ© μμ
openfeign:
circuitbreaker:
enabled: true
group:
enabled: true # κ·Έλ£Ή λ³λ‘ κ΄λ¦¬.(λͺ¨λ λ©μλμ λν΄μ κ΄λ¦¬νλ€μ΄μ κ°μΈμ μΌλ‘ μ νΈν¨ νΉν openfeign ν΅ν© μ)
client:
config:
default:
logger-level: basic
connect-timeout: 2000
read-timeout: 8000
naver:
url: ${application.naver-open-api.origin} # λ°λ‘ μ μν΄ λ
kakao:
url: ${application.kakao-open-api.origin} # λ°λ‘ μ μν΄ λ
read-timeout: 10000
compression:
request:
enabled: true
response:
enabled: true
httpclient:
hc5: # hc5κ° μ’μ κ² κ°μ. ok-httpμ κ²½μ°μλ λ€μ΄ν°λΈ μμ μ¬μ©νλμ§λΌ μ₯μ μμκ° μμ.
enabled: true
pool-reuse-policy: fifo
pool-concurrency-policy: strict