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 )

  • Zuul의 모든 호출은..
    • HystrixCommand로 실행되므로 Circuit Breaker를 통해
      • 장애 시 Fail Fast 및 Fallback 수행 가능
    • Ribbon + Eureka 조합을 통해
      • 현재 서비스가 가능한 서버의 목록을 자동으로 수신
    • Ribbon의 Retry 기능을 통해
      • 동일한 종류의 서버들로 자동 재시도 가능


[실습 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

+ Recent posts