Circuit Breaker
- ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ์๋น์ค์ ๋ฐ๋ณต์ ์ธ ํธ์ถ์ด ๋์ง ๋ชปํ๊ฒ ์ฐจ๋จ
- ํน์ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ๋์ฒด ์ํ
์ฐ๊ด๋ ์๋น์ค๊ฐ ํน์ ํ๊ณ์น ์ด์ ์คํจํ๋ค๋ฉด Circuit Breaker๋ Open. (์ฐจ๋จ or ๋์ฒด ๊ธฐ๋ฅ)
์ ์ ์๋ํ๋ค๋ฉด Circuit Breaker๋ Closed.
Mircroservice ํต์ ์ ์ฐ์ ์ค๋ฅ
USER์๋น์ค์ ์ฐ๊ด๋ ์๋น์ค๊ฐ ๋์ํ์ง ์์ ๋ ๋์ฒํ ๋ฐฉ์์ด ์์ด์ผํ๋ค.
Resilience4j์์ Circuit breaking์ ํฌํจํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ก Customizer<Resilience4JCircuitBreakerFactory>ํ์ผ์ ์ ์ํด์ ์ํท๋ธ๋ ์ด์ปค ์์ธ ์ค์ ์ด๋ ์๊ฐ ์ ํ ์ค์ ์ ์์ธํ ์ ํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ๋ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ ์ค์ ์ ์๋ตํ๊ณ CircuitBreakerFactory๋ฅผ ์ฃผ์ ๋ฐ์์ Fallback Method๋ฅผ ์ ์ํ ์ ๋ ์๋ค.
CircuitBreaker circuitbreaker = circuitBreakerFactory.create("circuitbreaker");
List<ResponseOrder> orderList = circuitbreaker.run(
() -> orderServiceClient.getOrders(userId), throwable -> new ArrayList<>());
์ฑ๊ณต ์ Order์๋น์ค ๋ฆฌํด ๊ฐ ๋ฐํ, ๋ฌธ์ ๋ฐ์ ์ ๋น ๋ฆฌ์คํธ ๋ฐํ
Microservice ๋ถ์ฐ ์ถ์
๋ง์ดํฌ๋ก์๋น์ค๋ค์ ์ฐ์์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ง์ ์๋น์ค๊ฐ ์คํ๋๋ค. ์ด๋ฌํ ํ๋ฆ์ ์ถ์ ํ๋ ๊ฒ์ ์ค์ํ๋ค.
Zipkin
- ๋ถ์ฐ ํ๊ฒฝ์ Timing ๋ฐ์ดํฐ ์์ง, ์ถ์ ์์คํ
- ๋ถ์ฐ ํ๊ฒฝ์์์ ์์คํ ๋ณ๋ชฉ ํ์ ํ์
- Span : ํ๋์ ์์ฒญ์ ์ฌ์ฉ๋๋ ์์ ์ ๋จ์ (์ธ๋ถ์ ์ธ ์์ฒญ ํธ๋์ญ์ ์ ๋ปํจ)
- Trace : ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด๋ค์ง Span ์ , ํ๋์ ์์ฒญ์ ๋ํ ๊ฐ์ Trace ID ๋ฐ๊ธ
[Trace (span, span, span)]
Spring Cloud Sleuth
- ์คํ๋ง ๋ถํธ๋ฅผ Zipkin๊ณผ ์ฐ๋
- ์์ฒญ ๊ฐ์ ๋ฐ๋ฅธ Trace ID, Span ID ๋ถ์ฌ
- ๋ถ์ฐ ํธ๋ ์ด์ฑ์ ์ํ ์คํ๋ง ๋ถํธ ์๋ ์ค์
User-service์์ ์ฃผ๋ฌธ๋ก์ง์ ์คํํ ๋ TraceId์ SpanId๋ฅผ ์์ฑํ๋ค. Feign์ผ๋ก OrderSerivce์ ์์ฒญํ ๋๋ ์๋ก์ด SpanId๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ค. TraceId๋ Order-service์์๋ ํ๋์ ์์ฒญ์ผ๋ก ๋ฌถ์ด๋ฏ๋ก ๋๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ค.
zinkin์์ ์๋์ ๊ฐ์ด '์์ฒญ'์ ํ๋ฆ์ ํ์ธํ ์ ์๋ค. ์ด๋์์ ์ผ๋ง๋ ๊ฑธ๋ฆฌ๊ณ ์์ธ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์ง๊ด์ ์ผ๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
๋ํ TraceId๋ SpanId ๊ฒ์์ ํตํด ๋น ๋ฅด๊ฒ ์ํ๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
์ฌ๋ฏธ์๋ ๊ธฐ๋ฅ์ Zipkin์ Depencies ๊ธฐ๋ฅ์ผ๋ก ์์ฒญ ํ๋ฆ๋๋ฅผ ์๊ฐํํ์ฌ ๋ณผ ์ ์๋ค.
๋ง์ดํฌ๋ก์๋น์ค ๋ชจ๋ํฐ๋ง
Turbin Server
ํฐ๋น ์๋ฒ์ ๋ชจ์์ง ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํด์ ๋์๋ณด๋์ ๋ณด์ฌ์ค
ํ์ฌ ์คํ๋ง๋ถํธ ๋ฒ์ ์ ๋ง๋ ๊ฒ์ Micrometer(application monitoring)์๋น์ค
Micrometer
- Prometheus๋ฑ์ ๋ค์ํ ๋ชจ๋ํฐ๋ง ์์คํ ์ง์
- ์คํ๋ง๋ถํธ 2๋ถํฐ Spring์ Metric ์ฒ๋ฆฌ
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Prometheus
- Metrics๋ฅผ ์์งํ๊ณ ๋ชจ๋ํฐ๋ง ๋ฐ ์๋์ ์ฌ์ฉ๋๋ ์คํ์์ค ์ ํ๋ฆฌ์ผ์ด์
์คํ๋ง๋ถํธ์์ ์์งํ Metrics ์ ๋ณด๋ฅผ ํ์ฉํ ์ ์์
- job_name: 'user-service'
scrape_interval: 15s
metrics_path: '/user-service/actuator/prometheus'
static_configs:
- targets: ['localhost:8000']
- job_name: 'order-service'
scrape_interval: 15s
metrics_path: '/order-service/actuator/prometheus'
static_configs:
- targets: ['localhost:8000']
- job_name: 'apigateway-service'
scrape_interval: 15s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8000']
prometheus์์ ๊ฐ์ ธ์ฌ metrics ์ ๋ณด job์ prometheus.yml์์ ์ค์ ํ ์ ์๋ค.
Grafana
- ๋ฐ์ดํฐ ์๊ฐํ, ๋ชจ๋ํฐ๋ง ๋ฐ ๋ถ์์ ์ํ ์คํ์์ค ์ ํ๋ฆฌ์ผ์ด์
- ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ธฐ ์ํ ๋์๋ณด๋ ์ ๊ณต
ํ๋ก๋ฉํ ์ฐ์ค ์ ์ฅํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์๊ฐํํ ์ ์์
์ ์ ๋ค์ด ๋ง๋ค์ด๋ ๋์๋ณด๋๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ์ฌ ์ฌ์ฉ์ค์ธ ์๋น์ค์ ๋ง๊ฒ query๋ฌธ์ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ํด์ค๋ค.