728x90
8. API Gateway - Zuul
API Gateway
- 클라이언트와 백엔드 서버 사이의 출입문(front door)
- 라우팅(라우팅, 필터링, API변환, 클라이언트 어댑터 API, 서비스 프록시)
- 횡단 관심사 cross-service concerns
- 보안. 인증(authentication) , 인가(authorization)
- 일정량 이상의 요청 제한(rate limiting)
- 계측(metering)
Netflix Zuul
- 마이크로 프록시
- 50개 이상의 AWS ELB 의 앞단에 위치해 3개의 AWS 리전에 걸쳐 하루 백억 이상의 요청을 처리(2015 년 기준)
- 출처
출처: https://www.slideshare.net/MikeyCohen1/rethinking-cloud-proxies-54923218
API Gateway - Zuul
1. Zuul의 모든 API 요청은 HystrixCommand로 구성되어 전달된다
- 각 API 경로 (서버군) 별로 Circuit Breaker 생성
- 하나의 서버군이 장애를 일으켜도 다른 서버군의 서비스에는 영향이 없다
- CircuitBreaker / ThreadPool의 다양한 속성을 통해 서비스 별 속성에 맞는 설정 가능
2. API를 전달할 서버의 목록을 갖고 Ribbon을 통해 Load-Balancing을 수행한다
- 주어진 서버 목록들을 Round-Robin으로 호출
- Coding을 통해 Load Balancing 방식 Customize 가능
3. Eureka Client를 사용하여 주어진 URL의 호출을 전달할 '서버 리스트'를 찾는다
- Zuul에는 Eureka Client가 내장
- 각 URL에 Mapping된 서비스 명을 찾아서 Eureka Server를 통해 목록을 조회 한다
- 조회된 서버 목록을
Ribbon
클라이언트에게 전달한다
4. Eureka + Ribbon에 의해서 결정된 Server 주소로 HTTP 요청
- Apache Http Client가 기본 사용
- OKHttp Client 사용 가능
5. 선택된 첫 서버로의 호출이 실패할 경우 Ribbon에 의해서 자동으로 Retry 수행
- Retry 수행 조건
- Http Client에서 Exception 발생 (IOException)
- 설정된 HTTP 응답코드 반환 (ex 503)
Zuul의 모든 호출은....
- HystrixCommand로 실행되므로 Circuit Breaker를 통해
- 장애시 Fail Fast 및 Fallback 수행 가능
- Ribbon + Eureka 조합을 통해
- 현재 서비스가 가능한 서버의 목록을 자동으로 수신
- Ribbon의 Retry 기능을 통해
- 동일한 종류의 서버들로의 자동 재시도가 가능
[실습 Step-6] Spring Cloud Zuul
Tag : step-6-zuul-baseline
1. [준비작업] Checkout
시간 절약을 위해 미리 준비된 모듈 Checkout(“zuul”)
git reset HEAD --hard
git checkout tags/step-6-zuul-baseline -b my-step-6
2. [zuul] Zuul 과 Eureka 디펜던시 추가 (build.gradle)
compile('org.springframework.cloud:spring-cloud-starter-netflix- zuul')
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.retry:spring-retry:1.2.2.RELEASE')
application.yml : Enable Zuul, Eureka
Main Class :
@EnableZuulProxy
@EnableDiscoveryClient
Tag : step-6-zuul-proxy-with-eureka
3. [zuul] application.yml 를 다음과 같이 설정
spring:
application:
name: zuul
server:
port: 8765
zuul:
routes:
product:
path: /products/**
serviceId: product
stripPrefix: false
display:
path: /displays/**
serviceId: display
stripPrefix: false
eureka:
instance:
non-secure-port: ${server.port}
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8761/eureka
4. 테스트
5. [zuul] application.yml 를 다음과 같이 설정
Tag : step-6-zuul-isolation-thread-pool
zuul:
routes:
product:
path: /products/**
serviceId: product
stripPrefix: false
display:
path: /displays/**
serviceId: display
stripPrefix: false
ribbon-isolation-strategy: thread
thread-pool:
use-separate-thread-pools: true
thread-pool-key-prefix: zuul-
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000
product:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
threadpool:
zuul-product:
coreSize: 30
maximumSize: 100
allowMaximumSizeToDivergeFromCoreSize: true
zuul-display:
coreSize: 30
maximumSize: 100
allowMaximumSizeToDivergeFromCoreSize: true
product:
ribbon:
MaxAutoRetriesNextServer: 1
ReadTimeout: 3000
ConnectTimeout: 1000
MaxTotalConnections: 300
MaxConnectionsPerHost: 100
display:
ribbon:
MaxAutoRetriesNextServer: 1
ReadTimeout: 3000
ConnectTimeout: 1000
MaxTotalConnections: 300
MaxConnectionsPerHost: 100
Spring Cloud Zuul - Isolation
spring-cloud-zuul 의 기본 Isolation 은 SEMAPHORE
(Netflix Zuul 은 threadpool)
Semaphore 는 network timeout 을 격리시켜주지 못함
spring-cloud-zuul 의 Isolation 을 THREAD 로 변경
zuul.ribbon-isolation-strategy : thread
모든 HystrixCommand 가 하나의 쓰레드풀에!!
유레카 등록된 서비스 별로 THREAD 생성
zuul.thread-pool.useSeparateThreadPools : true
zuul.thread-pool.threadPoolKeyPrefix : zuulgw
서비스 별 격리 성공
Spring Cloud Zuul
출처: https://netflixtechblog.com/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee
728x90
댓글