포스트

03.Spring Cloud Gateway

Spring Cloud Gateway

API Gateway의 역할

  • API 라우팅
  • 인증 및 권한 부여
  • 속도 제한
  • 부하 분산(로드밸런싱)
  • 로깅(모니터링)
  • 오케스트레이션
  • 등등..

Spring Cloud Gateway(SCG)

  • API Gateway 중 하나이다
  • API gateway로는 Netflix Zuul 과 Amazon API 도 있다
  • Zuul과의 차이점
    • SCG는 비동기 처리에 유리
    • SCG는 Netty / Zuul은 Tomcat

SCG의 3가지 옵션

  • Route
    • 응답을 보낼 목적지 uri와 필터 항목을 식별하기 위한 ID로 구성되어 있고 라우팅 목적지를 의미한다
  • Predicate
    • 요청을 처리하기 전 HTTP 요청이 정의된 조건에 부합하는지 검사한다
  • Filter
    • 게이트웨이에서 받은 요청과 응답을 수정하는 역할로 Spring Framework의 WebFilter 인스턴스이다.
    • 구성이 디폴트(default-filters)로 적용되는 GlobalFilter와 각 서비스에 적용할 수 있는 내부 ServiceFilter로 구성된다.
  • SCG의 내부 요청 흐름도

MSA, Eureka에 적용된 SCG

  • 유레카만 구현된 서비스의 모습
  • SCG를 붙인 모습
  • 클라이언트 요청 시나리오
  • 실행과정
    (1) 각 인스턴스(서비스)를 실행하여 유레카 서버에 등록
    (2) 클라이언트에서 로그인 요청이 SCG로 들어옴
    (3) SCG가 디스커버리(유레카 서버)에서 요청에 대한 서비스 탐색
    (4) 유레카의 응답
    (5) 게이트웨이는 받았던 로그인 요청을 Auth 서비스에게 요청
    (6) 최종 결과를 사용자에게 응답

로드밸런싱 이용

  • 유레카가 추가되면 로드밸런싱을 이용할 수 있다

  • 게이트웨이만 있는 경우

1
2
3
4
5
route:
  - id: user-service
    uri: http://localhost:64412
    predicates: 
      - Path=/user/**
  • 유레카가 있으면 게이트웨이에 로드밸런싱을 적용할 수 있다
1
2
3
4
5
route:
  - id: user-service
    uri: lb://USER-SERVICE
    predicates: 
      - Path=/user/**
  • uri의 lb는 Load Balancing의 약자이며, 유레카에 등록된 서비스명으로 탐색하는 형식이다

게이트웨이에서 CORS 설정

1
2
3
4
5
6
7
8
9
10
spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "*"
            allow-credentials: false
            allowedHeaders: "*"
            allowedMethods: "*"
  • 헤더에 multi-value 작업을 할 경우, 아래처럼 필터 한 줄을 더 추가해야 한다
1
2
3
4
5
6
7
8
9
10
11
12
spring:
  cloud:
    gateway:
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_UNIQUE
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "https://localhost:8089"
            allow-credentials: true
            allowedHeaders: "*"
            allowedMethods: "*"