본문 바로가기
공부했던 내용

Spring Cloud Gateway란?

by UpperLeaf 2021. 2. 10.

Spring Cloud Gateway 약칭 SCG는 API Gateway로써 쉽게 사용자의 요청을 받고 적절한 마이크로 서비스에게 라우팅해주는 서버라고 생각할 수 있습니다.

 

Reverse Proxy

 

리버스 프록시란 클라이언트의 요청을 받고 이 요청을 적절한 Backend 서버로 라우팅 해주는 서버입니다. 또한 단순히 라우팅만 하는게 아니라, 기초적인 보안 또는 모니터링을 수행할 수 있습니다 잘 알려진 리버스 프록시 서버로 NGINX가 존재합니다.

즉 SCG는 더 많은 기능이 추가된 (보안과 모니터링) Reverse Proxy 서버라고 생각할 수 있습니다.

 

Netty를 이용한다.

 

WAS는 여러가지의 종류가 있습니다. Tomcat, Netty 등등이 존재하며 Spring Boot같은 경우에는 기본적으로 Tomcat을 WAS로써 이용하기에 jar파일로 프로그램의 배포가 가능합니다.

하지만 Spring Cloud Gateway는 Tomcat이 아닌 Netty를 이용합니다. API Gateway는 모든 요청이 거쳐가는곳이기 때문에 성능이 매우 중요하며 멀티쓰레드를 이용한 방식으로는 성능문제가 발생할 수 있습니다.

Netty는 비동기식 이벤트 기반의 WAS이기 때문에 기존의 멀티쓰레드 방식보다 더 많은 요청을 처리할 수 있습니다.

 

 

Spring Cloud Gateway는 3개의 Main Building Block이 존재합니다.

  • Route : 라우트는 클라이언트의 요청을 어느 서버로 라우팅할것인지에 대한 내용입니다. Route는 목적지 URI, Predicates, Filter들로 이뤄져 있습니다.
  • Predicate : 요청이 어떤 Path인지 또는 어떤 헤더를 가지고 있는지에 대한 조건검사를 할 수 있습니다.
  • Filter : Spring Framework에서 WebFilter의 인스턴스입니다. Filter을 적용함으로써 요청 또는 응답을 변형할 수 있습니다.

본격적으로 Spring Cloud Gateway Server를 만들기 위해서 Gateway Project를 만들고 아래와 같이

application.yml을 작성합니다.

 

위의 코드에서 service1과 service2는 API Gateway에서 라우팅할 마이크로 서비스들 입니다.

id값은 마이크로서비스마다 유일한 값을 가지기 때문에 보통 서비스명을 이용하며, uri는 마이크로 서비스가 동작하고 있는 서버입니다. 해당 URI로 요청을 라우팅하게됩니다. predicates는 routing하기전에 check하고 싶은 정보입니다. SCG Framework는 이미 많은 Predicate Factory를 만들어 놓았기 때문에 해당 Factory들을 이용해서 Predicate들을 구성할 수 있습니다.

 

예를들어 Predicate는 위의 Path 말고도 쿠키와 정규표현식 값이 일치하는지, HTTP헤더와 정규표현식 값이 일치하는지, 어떤 HTTP 메서드인지, 특정 시간 이전, 이후, 사이의 요청인지를 판단하여 적절한 마이크로서비스로 요청할 수 있습니다.

 

참고자료 : cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories

 

Spring Cloud Gateway

This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 5, Spring Boot 2 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them

cloud.spring.io

 

이후에 필터들을 추가합니다. Filter는 요청 전 또는 응답 받은 뒤에 여러가지 행동을 할 수 있게 해주는데, 요청 전 처리하는 필터를 Pre Filter, 요청 후 처리하는 필터를 Post Filter라고 합니다.

SCG Framework는 Predicate와 마찬가지로 사용할만한 여러개의 Filter를 만들어 놓았습니다. 이러한 Filter들을 이용할 수 있지만 개발자가 직접 Filter를 Custom해서 사용할 수 있습니다.

SCG에 이미 존재하는 필터는 AddRequestHeader, AddRequestParameter, AddResponseHeader 등등이 존재합니다.

 

참고자료 :  cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories

 

Spring Cloud Gateway

This project provides an API Gateway built on top of the Spring Ecosystem, including: Spring 5, Spring Boot 2 and Project Reactor. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them

cloud.spring.io

CustomFilter를 만드는 방법 중 하나는 AbstarctGatewayFilterFactory를 상속받는 Filter를 정의하는것입니다.

아래 코드는 request에 특정한 헤더값을 넣어주는 PreFilter입니다.

이후에 Application.yml을 수정해 이 필터를 모든 라우팅 또는 특정 몇몇 라우팅에만 적용할 수 있습니다.

개별 라우트에 적용하고싶다면 아래와 같이 작성합니다.

Global하게 적용하고 싶다면 아래와 같이 작성합니다.

 

이상으로 포스팅을 마치겠습니다.

'공부했던 내용' 카테고리의 다른 글

부동소수점  (0) 2021.02.08
Reflection과 Annotation  (0) 2020.08.10