๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“”๊ฐ•์˜ ์ •๋ฆฌ ๋…ธํŠธ

[Spring Cloud๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค] Section. 12 ์žฅ์•  ์ฒ˜๋ฆฌ์™€ Microservice ๋ถ„์‚ฐ ์ถ”์  & ๋ชจ๋‹ˆํ„ฐ๋ง

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 ๋ถ€์—ฌ

- ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ์œ„ํ•œ ์Šคํ”„๋ง ๋ถ€ํŠธ ์ž๋™ ์„ค์ •

 

[์„œ๋น„์Šค์ด๋ฆ„, TraceId, SpanId]

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 ์ •๋ณด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ

metrics์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ Prometheus

  - 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๋ฌธ์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™” ํ•ด์ค€๋‹ค.

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์™€ ์—ฐ๋™ํ•œ ๊ทธ๋ผํŒŒ๋‚˜