[Spring Cloud Gateway] Zuul 대신 spring cloud gateway

2021. 1. 26. 01:02SPRING

[Spring Cloud Gateway] Zuul 대신 spring cloud gateway

[Spring Cloud Gateway] 프로젝트 생성 및 라우팅 기능

 

 

 

그리 많은 프로젝트를 경험해 본 건 아니었지만 그간 보아왔던 MSA 환경에서는 모두 gateway 구축을 위해서 Zuul을 사용했었다.

하지만 많이 사용되왔던 Zuul 대신 Spring Cloud Gateway 라는 명확한 라이브러리를 제시받았는데, Zuul의 신규 개발이 더이상 이루어지지 않기 때문이겠지... 싶다. 

 

국내 레퍼런스는 많지가 않아서 하루 종일 영문 구글링을 했고, 정말 100번 이상 검색창을 두들겼던 것 같다. 그런데 이렇게 검색을 하다 보니 처음에 찾아 둔 솔루션을 잊어버리고 또 잊어버리며 똑같은 검색을 반복하고 있었다.

어딘가에 내용을 정리해둘 필요성을 느꼈고, 오랜만에 블로그 포스팅도 할 겸 해서 Spring Cloud Gateway 에 관련해서 내용을 정리해보고자 한다.

 

 

* 사용한 프레임워크 버전 *

springBootVersion 2.4.1

springCloudVersion 2020.0.0

 

 

 

Spring Cloud Gateway 란?

MSA 아키텍처에서 API Gateway 를 만들기 쉽도록 제공되는 라이브러리이다. routing, load balance, filter 등을 손쉽게 적용 가능하다.

 

 

Spring Cloud Gateway는 Servlet 기반 Spring MVC 와 호환이 잘 되지 않는다.

spring cloud gateway 는 Spring WebFlux, Reactor 등을 기반으로 한다. 기존 동기방식인 Servlet API 뿐만 아니라 동기식 라이브러리들은 모두 호환이 잘 안될 가능성이 있다. 여기서도 익숙한 방식인 javax.servlet.Filter 구현, HttpServletRequest, HttpSevletResponse 등을 사용할 수 없었고, 강제적으로 WebFlux 를 쓸 수 밖에 없었다.

또한 dependency에 Spring-web을 추가하면 에러창에서 저 의존성을 삭제해 달라는 메세지를 볼 수 있을 것이다..ㅠㅜ

 

스프링 공식 레퍼런스에도 아래와 같이 호환이 어려울 수 있다는 메세지를 찾아볼 수 있었다.


Spring Cloud Gateway is built on Spring Boot 2.xSpring WebFlux, and Project Reactor. As a consequence, many of the familiar synchronous libraries (Spring Data and Spring Security, for example) and patterns you know may not apply when you use Spring Cloud Gateway. If you are unfamiliar with these projects, we suggest you begin by reading their documentation to familiarize yourself with some of the new concepts before working with Spring Cloud Gateway.

 

 

 

각종 Filter들에 순서가 있었다.

기존에 Filter를 구현하는 대신 webflux 방식을 지원하는 필터인 WebFliter를 구현하여 사용할 수 있다. 그리고 Spring Cloud Gateway에서 제공되는 전역 필터 GlobalFilter와, 각 라우팅 경로별로 적용 가능한 GatewayFilter도 사용 가능했다.

처음에는 전역필터인 GlobalFilter로 사용자 검증을 통과하면 GatewayFilter로 각 경로별 필요한 필터를 적용하고자 했으나... 아무리 Order를 적용해도 GatewayFilter가 우선순위로 적용이 되었다. 따로 방법이 있는지는 모르겠지만, 적어도 나는 방법을 찾지 못했다.

여러 테스트 결과 적용되는 Filter의 순서는 아래와 같았다.

결국 가장 우선순위에 두고 싶은 전역필터는 WebFilter로, 후순위에 두고싶은 전역필터는 GlobalFilter로 구현하는 쪽을 선택했다.

 

 

 

Spring Cloud Loadbalancer 가 포함되어 있다.

Spring-Cloud-Starter-Gateway 에는 Spring-Cloud-Commons 가 포함되어 있고, 여기에는 Spring-Cloud-LoadBalancer가 있다. 그러므로 따로 LoadBalancer 라이브러리를 추가하지 않아도 기본적으로 포함되어 있다.

Discovery 라이브러리(ex. Eureka)와 함께 사용하면 현재 정상적으로 구동되고 있는 서버로만 라우팅이 가능하다!

 

 

 

 

 

프로젝트 셋팅부터 삽질했던... 부분을 위주로 정리해 보았다.

다음에는 spring cloud gateway에서 구현 가능한 기능들을 간단한 예시와 함께 포스팅 해 볼 예정이다!

 

 

 

 

 

 

 

 

잘못된 부분이나 의견이 있다면 말씀 부탁드립니다! 언제나 코멘트는 감사히 받겠습니다 :)