필요성
- MSA 방식으로 개인 프로젝트를 진행하며, 공통된 기능(Jwt인증, API 별로 호스트 포트넘버 매핑)을 반복하다 보니 API gateway의 필요성을 느끼게 되었다.
- 지난 학기 프로젝트에서 nginx의 리버스 프록시 기능을 활용하여 요청을 전달했었는데, 라우팅외에 더 강력한 기능이 있는 gateway를 사용해 보기로 하였다.
API 게이트웨이란?
MicroService Architecture(MSA)를 구성하는 다양한 기능 요소 중 External Gateway로 분류된 기능에 속하는 것이 API Gateway이다. MSA는 세부적인 서비스가 모듈 단위로 구성되어 있기에 Gateway를 사용하여 요청을 라우팅하여 엔드포인트를 단일화 해주는 기능을 제공한다. + 그리고 서비스의 필수 기능들을 모든 마이크로 서비스마다 구현하기에는 작업량이 늘어나기에 공통된 필수 기능 요소들을 제공해주는 역할 도 한다.
API 게이트웨이의 주요 기능
- 인증과 인가
- API 라우팅
- QoS
- 로깅 및 모니터링
- 입력 유효성 검사
출처)https://s-core.co.kr/insight/view/spring-cloud-gateway-기반의-api-게이트웨이-구축/
Spring Cloud Gateway 란?
Spring WebFlux 혹은 WebMVC 위에서 API Gateway를 구축하기 위해 제공되는 라이브러리.
용어 정리
- Route: Gateway의 기본 빌딩 블록. ID, 목적지 URI, Predicates의 집합, 필터의 집합으로 구성됨. 만약 Aggregate predicate가 참이 되면 Route가 매칭됨.
- Predicate: 자바 8의 function predicate이다. 입력 타입은 SpringFramework ServerWebExchange이고, 이를 통해 헤더나 매개변수 등 HTTP 요청의 모든 항목을 매칭시킬 수 있음.
- Filter: 특정 팩토리로 구성된 SpringFramework GatewayFilter 인스턴스. Downstream(하류, 최종 목적)으로 요청을 보내기 전이나 후에 요청과 응답을 수정할 수 있음.
How It Works
아래의 그림은 스프링 gateway가 어떻게 동작하는지 큰그림으로 보여준다.

Filter가 점선으로 두 부분으로 나뉜 이유는 Proxy Request가 전송되기 전과 후로 동작하기 때문이다. → Pre Filter, Post Filter 로직으로 나뉘게 됨. : 이 부분은 SpringFramework의 filter로직과 동일한 것으로 보임.
Predicate & Filter Factories 설정
- shortcuts과 fully expanded라는 두 가지의 설정방식으로 나뉨.
- Shortcuts
-
=(equals sign)과 ,(comma)로 필터를 인식할 수 있음
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
- Fully expanded
Spring Cloud Gateway의 기능
- Able to match routes on any request attribute
- 요청의 헤더, 쿼리 파라미터, HTTP 메서드 등에 따라 다른 경로로 라우팅
- Predicates and filters are specific to routes
- Predicates(선언자)와 filters(필터)는 각각의 라우트에 특정되어 있고, 라우트에 따라 서로 다른 조건과 작업을 수행할 수 있게 해준다.
- Circuit Breaker integration
- Circuit Breaker 패턴을 지원하여 서비스 간의 통신 중 발생하는 지연, 실패 등의 장애를 처리하고 이후 요청을 빠르게 실패하도록 설정한다.
- Spring Cloud DiscoveryClient integration
- Spring DiscoveryClient와 통합하여 서비스 디스커버리를 지원한다. 이를 통해 서비스의 위치를 자동으로 감지하고 요청을 라우팅할 수 있다.
- Easy to write Predicates and Filters
- 사용자가 쉽게 Predicates와 Filters를 작성할 수 있도록 지원함.
- Request Rate Limiting
- 요청 속도 제한을 설정할 수 있음. 과도한 요청으로 인한 서비스 부하를 방지하고 안정성을 유지할 수 있음.
- Path Rewriting
- 요청 경로를 재작성할 수 있음. 게이트웨이로 들어오는 요청의 경로를 수정하여 백엔드 서비스로 전달할 수 있음. 클라이언트에 노출되는 경로와 내부 서비스의 경로를 분리하는데 용이하며 Location transparency를 제공함. (내부 서비스의 host, port를 클라이언트가 몰라도 됨)
출처) https://cloud.spring.io/spring-cloud-gateway/reference/html/