๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
MSA๋ก ์ ํฅํ 11๋ฒ๊ฐ์ ์ฌ๋ก
๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
MSA๋ก ์ ํฅํ 11๋ฒ๊ฐ์ ์ฌ๋ก
๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
MSA๋ก ์ ํฅํ 11๋ฒ๊ฐ์ ์ฌ๋ก
๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
MSA๋ก ์ ํฅํ 11๋ฒ๊ฐ์ ์ฌ๋ก
๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
MSA๋ก ์ ํฅํ 11๋ฒ๊ฐ์ ์ฌ๋ก
๐Hystrix
netfilx๊ฐ ๋ง๋ fault tolerance library๋ก ์ฃผ๋ก ์ฅ์ ์ ํ ๋ฐฉ์ง์ resilience ๊ธฐ๋ฅ์ ํ๋ค.
๐จ์ ์ฉ ๋ฐฉ๋ฒ
- Hystrix annotation ์ฌ์ฉ - hystrix javanic, spring cloud netfix์ ํฌํจ๋์ด ์์
@HystrixCommand
public String anyMethod() {
}
- Hystrix command ์์
pulbic class SampleCommand extends HystrixCommand<String> {
@Override
protected String run() {}
}
hystrix command๋ฅผ ํธ์ถํ ๋ ๋ฒ์ด์ง๋ ์ผ
- ๋ฉ์๋๋ฅผ interceptํ์ฌ ๋์ ์คํํ๋ค - thread isolation
- ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ ์ฑ๊ณต ํน์ ์คํจ ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ธ์คํด์ค ๋จ์๋ก ๊ธฐ๋กํ๊ณ ํต๊ณ๋ธ๋ค. ํต๊ณ์ ๋ฐ๋ผ circuit open ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. - circuit breaker
- ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค - fallback
- ํน์ ์๊ฐ๋์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ exception์ ๋ฐ์ํ๋ค - timeout
๐ฒ๊ธฐ๋ฅ์ ๊ด์ ์์ ๋ณธ Hystrix์ ์ฃผ์ 4๊ฐ์ง ๊ธฐ๋ฅ
Circuit Breaker
hystrix.command.<commandKey>. //circuitbreaker ์ ์ธ
metrics.rollingStats.timeInMilliseconds - Default 10์ด
circuitBreaker.requestVolumeThreshold - Default 20๊ฐ
circuitBreaker.errorThresholdPercentage - Default 50%
circuitBreaker.sleepWindowInMilliseconds - Default 5์ด
hystrix command breaker๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฃผ์ด์ง CommandKey ๋จ์๋ก ํต๊ณ๋ฅผ ๋ด๊ณ ๋์ํ๋ค.
10์ด ๋์ 20๊ฐ ์ด์์ ํธ์ถ์ด ๋ฐ์ํ ๊ฒฝ์ฐ, 50%์ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด 5์ด๊ฐ ํธ์ถ ์ฐจ๋จ(circuit open)
์ผ์ ์๊ฐ(10์ด) ๊ฒฝ๊ณผ ํ์ ๋จ ํ ๊ฐ์ ์์ฒญ์ ๋ํด์ ํธ์ถ์ ํ์ฉํ๋ฉฐ(Half open), ์ด ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด → Circuit Close(ํธ์ถ ํ์ฉ)
Fallback
fallback์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ ๋ค์ ๊ฒฝ์ฐ์ ์๋ณธ ๋ฉ์๋๋ฅผ ๋์ ์คํํ๋ค.
- circuit open
- any exception(HystrixBadRequestException ์ ์ธ)
- Semaphore/ ThreadPoolRejection
- Timeout
@HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
//์ถ์ฒ ์๋ฒ ํธ์ถ
public String anyMethod() {}
//๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก
public String recommendFallback(){return "<๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ ๋ชฉ๋ก>"}
๐งจ exception ํฐ์ง๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์. ๋น์์์ ์ผ๋ก ์๋ต์ด ๋น ๋ฅด๋ค๋ฉด ๋ณธ ๋ฉ์๋(anyMethod)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ๋ก๊น ํด ๋ณผ ๊ฒ.
๐งจHystrixBadRequestException : ์ด ์ค๋ฅ๋ fallback์ ์คํํ์ง ์์ผ๋ฉฐ circuit open์ ์ํ ํต๊ณ์๋ ์ง๊ณ๋์ง ์๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ์ ๋ฌ๊ณผ ๊ฐ์ method caller์ ์ค์์ ๊ฒฝ์ฐ ์ด ์์ธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ค๋ฅธ ์์ธ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด circuit breaker ํต๊ณ์ ์ง๊ณ๋์ด circuit open์ด ๋๊ฑฐ๋ fallback์ด ์คํ๋์ด ๊ฐ๋ฐ ๊ณผ์ ์ ์ค๋ฅ๋ฅผ ์ธ์งํ ์ง ๋ชป ํ ์ ์๋ค.
Timeout
hystrix์์๋ circuit breaker ๋จ์๋ก ์ค์ ํ ์ ์๋ค.
metrics.rollingStats.timeInMilliseconds - Default 1์ด
๋ณดํต์ 1์ด ๋ฏธ๋ง์ผ๋ก ์๋ต์ด ์์ผ ํ์ง๋ง, ui๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฑ์ ์ด์ ๋ก ์กฐ๊ธ ๋ ๋๋ ค๋ ์ข๋ค.
Isolation
์ต๋ ๊ฐ์ ์ด๊ณผ ์ semaphore rejection(fallback) ๋ฐ์ํ๋ค.
๋ ๊ฐ์ง isolation ๋ฐฉ์์ ๋จ์ ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
semaphore
circuit breaker 1๊ฐ๋น 1๊ฐ์ semaphore ์์ฑํ๊ณ , command๋ฅผ ํธ์ถํ caller Thread์์ fallback ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๐งจtimeout์ด ์ ์๊ฐ์ ๋ฐ์ํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด.. ์ด๊ฒ์ ์ค๋๋๋ก ํด๊ฒฐ ๊ฐ๋ฅ
thread(default)
circuit breaker ๋ณ๋ก ์ฌ์ฉํ thread pool ์ง์ (ThreadPoolKey)
command๋ฅผ ํธ์ถํ thread๊ฐ ์๋, thread pool์์ fallback ๋ฉ์๋ ์คํ.
๐Ribbon
netflix๊ฐ ๋ง๋ software load balancer๋ฅผ ๋ด์ฅํ RPC library
-Client Load Balancer with HTTP Client
API์ฝ๋ฌ๋ค์ ์๋์ผ๋ก ribbon client๊ฐ ๋ถ๊ฒ ๋๋ฉด, ์ธํ๋ผ์ ๋์ ์์ด๋ ๋ค์์ ์๋ฒ ๋ชฉ๋ก์ ํธ์ถํ ์ ์๋ค.
ํ์ง๋ง ์คํ๋ง ํด๋ผ์ฐ๋์์๋ ribbon ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ์ง ์์! ์คํ๋ง ํด๋ผ์ฐ๋์๋ http ํต์ ์ด ํ์ํ ์์๊ฐ ๋ด์ฅ๋์ด ์์. (api gateway, feign, restTemplate(@LoadBalanced))
๐Eureka
netflix๊ฐ ๋ง๋ dynamic service discovery
-๋ฑ๋ก: ์๋ฒ๊ฐ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ IP ์ฃผ์, ํฌํธ๋ฅผ ๋ฑ๋ก
-์กฐํ: ์๋น์ค ์ด๋ฆ์ ๊ฐ๊ณ ์๋ฒ ๋ชฉ๋ก์ ์กฐํ
Ribbon๊ณผ ์ฐ๋ํด ์๋ฒ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
Server ์์ ์ eureka ์๋ฒ์ ์๋์ผ๋ก ์์ ์ ์ํ ๋ฑ๋ก
์ฃผ๊ธฐ์ heartbeat์ผ๋ก eureka server์ ์์ ์ด ์ด์์์์ ์๋ฆผ
server ์ข ๋ฃ ์ eureka ์๋ฒ์ ์์ ์ ์ํ ๋ณ๊ฒฝ ํน์ ์์ ์ ๋ชฉ๋ก ์ญ์
eureka ์์ ๋ฑ๋ก๋ ์ด๋ฆ์ “spring.application.name”
Ribbon + Eureka in Spring cloud?
ํ๋์ ์๋ฒ์๋ eureka client ์ ribbon client๊ฐ ํจ๊ป ์ค์ ๋๋ฉด spring cloud๋ ๋ค์์ ribbon bean์ ๋์ฒด (์๋ฒ์ ๋ชฉ๋ก์ ์ค์ ์ผ๋ก ๋ช ์ํ๋ ๋์ , eureka๋ฅผ ํตํด์ look upํด์ด)
- serverList<Server>→ ๋ณ๊ฒฝ: DiscoverEnableNIWSServerList
- -๊ธฐ๋ณธ: ConfigurationBasedServerList
- IPing→ ๋ณ๊ฒฝ: NIWSDiscoveryPing
- -๊ธฐ๋ณธ: DummyPing
๐ API Gateway
msa ํ๊ฒฝ์์ api gateway์ ํ์์ฑ
- single endpoint ์ ๊ณต
- api ๊ณตํต ๋ก์ง ๊ตฌํ - logging, authentication, authorization
- traffic control - api quota, throttling
๐๋ฌธ์ ์ง๋ฉด!
100% ์์ฒด ๊ฐ๋ฐํ api gateway๋ฅผ ๋๊ณ spring cloud zuul์ ๋์ ํด์ผ ํ ๊น?
→yes!
์ด์ : ์๋ฒ์ ๋ชจ๋ ํธ์ถ์ hystrix command๊ฐ ๊ฐ์ธ์ ํธ์ถํ๋ค. ๊ทธ ์์๋ ribbon client๊ฐ ์กด์ฌ. ๊ทธ ์์์ eureka client๋ฅผ ํตํด์ ์ค์ ์๋ฒ๋ฅผ ํธ์ถํ๋ค.
api gateway๋ฅผ ์ฌ์ฉํด endpoint ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๊ณ , service์ ์ค๋ฅ๊ฐ ๋๋ ๋ด ๊ฒ์ดํธ ์จ์ด๋ ์ฃฝ์ง ์์ ์ตํ์ ๋ณด๋ฃจ๊ฐ ์๊ธด๋ค. circuit breaker์ isolation์ด ๋ด zuul์ ํ ๊ตฐ์ด ์ฃฝ๋๋ผ๋ ๊ฒฉ๋ฆฌ ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. spring cloud zuul ์์ hystrix isolation์ semaphore์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
๐์ฅ์ ์๋๋ฆฌ์ค
hystrix, eureka, ribbon์ ์ฌ์ฉํ ์ฐ๋ฆฌ system์ ์ด๋ ์ ๋ resilience ํ ๊ฑฐ์ผ?
๐ Spring Cloud Sleuth - Logging
spring cloud sleuth ์ฌ์ฉ ์ application ๋ก๊ทธ์ trace Id(uuid)๊ฐ ํจ๊ป ์ถ๋ ฅ
with Zipkin !
hystrix with turbin !
'MSA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ํธ๋ฌ๋ฆฌ ๊ทธ๋ํ ๋ถ์ฐ์ค๋ช (0) | 2024.03.01 |
---|---|
์ํธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ์คํธ๋ ์ค ํ ์คํธ (1) | 2024.02.28 |
๋์์ฑ ์ฒ๋ฆฌ์ ์ค์์ฑ๊ณผ ๋ฐฉ๋ฒ (1) | 2024.01.26 |
CQRS ํจํด ์ ์ฉ๊ธฐ - ๋ฐฐ๋ฏผ ์ฐ์์ฝ ์ ๋ฆฌ (1) | 2023.12.09 |