SpringCloud

[Spring Cloud 를 활용한 MSA 기초] 8. API Gateway - Zuul

nineDeveloper 2021. 2. 7.
728x90

8. API Gateway - Zuul


youtu.be/6g1wH97BiuQ


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

댓글

💲 추천 글