API Gateway
- 클라이언트와 백엔드 서버 사이의 출입문(front door)
- 라우팅(라우팅, 필터링, API 변환, 클라이언트 어댑터 API, 서비스 프록시)
- 횡단 관심사 cross-service concerns
- 보안, 인증(authentication), 인가(authorization)
- 일정량 이상의 요청 제한 (rate limiting)
- 계측 (metering)
Netflix Zuul
- 마이크로 프록시
- 50개 이상의 AWS ELB의 앞단에 위치해 3개의 AWS 리전에 걸쳐 하루 백억 이상 요청을 처리
(2015년 기준)
- Zuul의 모든 API 요청은 HystrixCommand로 구성되어 전달된다.
- 각 APi 경로 (서버군) 별로 Circuit Breaker 생성
- 하나의 서버군이 장애를 일으켜도 다른 서버군의 서비스에는 영향이 없다.
- CircuitBreaker / ThreadPool의 다양한 속성을 통해 서비스 별 속성에 맞는 설정 가능
- API를 전달할 서버의 목록을 가지고 Ribbon을 통해 Load-Balancing을 수행한다.
- 주어진 서버 목록들을 Round-Robin으로 호출
- Coding을 통해 Load Balancig 방식 Customize 가능
- Eureka Client를 사용하여 주어진 URL의 호출을 전달할 '서버 리스트'를 찾는다.
- Zuul에는 Eureka Client가 내장
- 각 URL에 Mapping 된 서비스 명을 찾아 Eureka Server를 통해 목록을 조회한다.
- 조회된 서버 목록을 Ribbon 클라이언트에게 전달한다.
- Eureka + Ribbon에 의해서 결정된 Server 주소로 HTTP 요청
- Apache Http client가 기본 사용
- OKHttp client 사용 가능
- 선택된 첫 서버로의 호출이 실패할 경우 Ribbon에 의해서 자동으로 Retry 수행
- Retry 수행 조건
- Http Client에서 Exception이 발생 ( I/O Exception )
- 설정된 HTTP 응답 코드 반환 ( ex. 503 )
- Retry 수행 조건
- Zuul의 모든 호출은..
- HystrixCommand로 실행되므로 Circuit Breaker를 통해
- 장애 시 Fail Fast 및 Fallback 수행 가능
- Ribbon + Eureka 조합을 통해
- 현재 서비스가 가능한 서버의 목록을 자동으로 수신
- Ribbon의 Retry 기능을 통해
- 동일한 종류의 서버들로 자동 재시도 가능
- HystrixCommand로 실행되므로 Circuit Breaker를 통해
[실습 Step-6] Spring Cloud Zuul
- [zuul] 서비스 생성
- [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')
- [zuul] application.yml 설정
- [zuul] 메인 클래스에 @EnableZuulProxy, @EnableDiscoveryClient 추가
- 실행 확인 - localhost:8765/displays/1 , localhost:8765/products/1
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
- Eureka가 등록된 서비스 별로 THREAD 생성
- zuul.thread-pool.userSeparateThreadPools : true
- zuul.thread-pool.threadPoolKeyPrefix : zuulgw
- [zuul] application.yml을 다음과 같이 설정
Configuration Server, Tracing, Monitoring, 그리고 남은 이야기..
Spring Cloud Config - 중앙화 된 설정 서버
Spring Boot Admin, Turbine
Zipkin, Spring Cloud Sleuth
- Distributed Tracing, Twitter
'Back-end > MSA - Spring Cloud' 카테고리의 다른 글
마이크로 서비스 아키텍쳐 (0) | 2022.06.08 |
---|---|
Declarative Http Client - Feign (0) | 2021.11.24 |
Service Registry - Eureka (0) | 2021.11.24 |
Client LoadBalancer - Ribbon (0) | 2021.11.23 |
Circuit Breaker - Hystrix (0) | 2021.11.23 |