해당 포스트는 Spring Cloud에 속한 기술들에 대한 개념과 주요 기술에 대해 알아보고 실무에 적용했었던 내용을 정리하는 포스트입니다.
[이미지 출처 : https://www.connecting-software.com/blog/what-is-an-api-gateway-how-it-can-actually-deliver-practical-results/]
API 게이트웨이(패턴) 는 마이크로서비스 관리 / 운영을 위한 플랫폼 패턴이며 해당 패턴에 필요한 기능들을 제공하는 서버를 일컫습니다.
API 게이트웨이는 개별 서비스의 앞 단에서 모든 서비스들의 엔드포인트를 단일화하고 다음과 같은 필수 기능 요소들을 제공합니다.
API 게이트웨이를 사용함으로서 다음과 같은 장점을 얻을 수 있습니다.
하지만 장점이 있다면 당연히 단점도 있겠죠. API 게이트웨이는 앞서 소개해드린 장점 외에 단점도 존재합니다.
그러나 단점이 있음에도 장점이 뚜렷하기 때문에 오늘날 마이크로서비스 아키텍처에서 API 게이트웨이는 반드시 필요한 요소로 존재하고 있습니다.
Spring Cloud Gateway는 Spring Framework에서 제공하는 오픈 소스 기반의 Gateway 서비스입니다.
Spring Cloud Gateway 이전에는 Spring Cloud Zuul이 있었으며 Zuul의 패치가 중단됨에 따라 Spring Cloud Gateway로의 이전이 이뤄졌다고 합니다.
Spring Cloud Zuul과 Spring Cloud Gateway의 가장 큰 차이점은 다음과 같습니다.
Spring Cloud Gateway는 비동기 방식을 통해 수많은 요청을 빠르게 처리할 수 있으며 다른 Spring Cloud 기반 기술들과 통합이 잘 되어 있어 다양한 기술적 연계가 가능합니다.
SCG의 개념도는 다음과 같습니다.
SCG를 구성하는 주요 3요소로는 Route, Predicate, Filters가 있으며 사용자의 요청이 각 컴포넌트를 거쳐 라우팅됩니다.
Route는 고유 ID + 목적지 URI + Predicate + Filter로 구성되며, 아래에서 소개할 Predicate + Filter의 묶음이자 라우팅이 될 규칙이라고 할 수 있습니다.
Route를 통해 SCG로 요청된 URI의 조건이 Predicate를 통과하여 참인 경우 매핑된 해당 경로로 매칭됩니다.
Predicate는 주어진 요청이 주어진 조건을 충족하는지 테스트하는 구성 요소이며, 하나 이상의 조건자를 정할 수 있습니다.
만약 Predicate에 매칭되지 않을 경우 SCG 자체적으로 HTTP 404 Not Found로 응답합니다.
Filter & Filter Chain은 SCG를 통해 들어오는 요청이나 반환되는 응답에 대해 전처리 / 후처리를 담당합니다.
이 중에서 Proxy Filter는 프록시 요청이 처리될 떄 수행되는 필터입니다.
앞서 소개한 Route, Predicate, Filters의 예시를 보여드리면 다음과 같습니다. (application.yaml)
spring:
cloud:
gateway:
# 먼저 선언한 순서대로 필터가 적용됨 route 1 -> route 2
routes:
# route 1, route의 id는 sample-internal
- id: sample-internal
uri: http://localhost:8081
predicates:
- Path=/sample/api/v1/internal/** # /sample/api/v1/internal/** 로 들어오는 요청에 반응
filters:
- NotAllowedURIExceptionFilter # filter 로직 적용 (커스텀 필터)
# route 2, route의 id는 sample
- id: sample
uri: http://localhost:8081
predicates:
- Path=/sample/** # /sample/** 로 들어오는 요청에 반응
filters:
- RewritePath=/sample/(?<segment>.*), /$\{segment} # filter 로직 적용 (RewritePath 필터)
Predicates는 주어진 요청이 주어진 조건을 충족하는지 테스트하는 구성 요소로, 크게 시간 / URI / 요청 / 네트워크 관련으로 분류를 할 수 있습니다.
Filter & Filter Chain은 SCG를 통해 들어오는 요청이나 반환되는 응답에 대해 전처리 / 후처리를 담당하며, 특정 Route에 적용할 수 있는 Gateway Filter와 전역적으로 적용되는 Global Filter로 분류합니다.
https://cloud.spring.io/spring-cloud-gateway/reference/html/
https://s-core.co.kr/insight/view/spring-cloud-gateway-%EA%B8%B0%EB%B0%98%EC%9D%98-api-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4-%EA%B5%AC%EC%B6%95/
https://nginxstore.com/blog/api-gateway/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%EC%B6%95%EC%9D%84-%EC%9C%84%ED%95%9C-api-gateway-%ED%8C%A8%ED%84%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/