Spring Cloud Gateway 란?

728x90
반응형
SMALL

Spring Cloud Gateway

SCG는 Spring Reactive 생태계 위에 구현된 API Gateway이다. 

일종의 Reverse Proxy 라고도 할 수 있다.

 

 

Proxy Server

Client <-> Server 사이에 중계기로써 대리로 통신을 수행하는 역할을 하는 Server
Client와 Server가 직접 통신하지 않고, Proxy Server를 이용하기에 보안, 트래픽 분산 등 장점이 있다.





Forward Proxy

일반적으로 알고있는 Proxy Server이다.
Client가 Server로 직접 요청하지 않고, Proxy Server를 이용하기에 Server측에서는 Client를 알 수 없다.

회사 내부 인트라넷이 대표적인 예시이다.

주요 역할은 캐싱, IP 우회, 제한된 사이트 접근이다.





Reverse Proxy

Forward Proxy와 동일하게 Client는 Server로 직접 요청하지 않고, Proxy Server를 통해 요청한다.
Client를 숨기는 Forward Proxy와 반대로 Reverse Proxy는 Server를 숨기는 역할을 한다.

nginX가 대표적인 예시이다.

주요 역할은 로드 밸런싱, 보안이다.

 

 

API Gateway는 모든 요청이 통과하는 곳이기에 성능이 중요하기에,

Tomcat이 아닌 Netty를 사용하여 non-Blocking 요청 처리를 제공한다.

 

Netflix Zuul 2.x 도 non-Blocking을 지원하지만, Spring 과 궁합이 잘 맞는 건 SCG이다.

vs Zuul 

Zuul은 Filter로만 동작하고, SCG는 Predicates + Filter를 조합하여 동작한다.
또한, Zuul은 Tomcat을 사용한다.

 

API Gateway

MSA 환경에서 중요한 역할을 하는 것이 API Gateway다.

Backend API Server 앞단에서 모든 요청의 관문 역할을 한다.

 

  • API 인가 / 인증
    • API 토큰 발급 (JWT, SAML 토큰 등)
  • API 라우팅
    • 로드 밸런싱 (L4 기능 + a)
  • 공통 로직 처리

 


동작 방식

 

https://www.javainuse.com/spring/cloud-filter

 

  • Client Request -> SCG Gateway Hanlder Mapping
  • Gateway Hanlder Mapping 에서 Route 조건 판단 후 Gateway Web Hanlder(Predicate)로 전달
  • Gateway Web Handler(Predicate)에서 요청과 관련된 Filter로 Request 전달
  • Pre Filter 실행 후 Proxy 요청 실행
  • Post Filter 실행 후 Client에게 Response

 

 


 

구성 요소

Route

Client Request를 어느 Server로 Routing 할 것인지를 나타낸다.

고유 id, 목적지 uri, predicates, filter 로 구성되어 있다.

주로 yaml에 설정한다.

spring:
	cloud:
		gateway:
        	httpClient:
            	connection-timeout: 5000
                response-timeout: 60s
            routes:
            	- id: backend-api
                  uri: https://backend-api.com
                  predicates:
                  	- Path=/api/backend/**
                  filters:
                  	- SampleFilterA
                    - SampleFilterB

 

Predicate

Client Request의 Path(경로)를 매칭하는 역할을 한다.

쉽게 조건이라고 생각하자.

 

 

Filter

Filter를 통해 Request & Response 조작이 가능하다.

 

  • Custom Filter
    • AbstractGatewayFilter를 상속받아 apply()를 override하여 사용한다.
    • Custom Filter는 yaml의 routes:filters에 명시해야 사용 가능하다.

 

  • Global Filter
    • 별도 명시 없이 공통적으로 사용 가능하다.

 

  • WebFilter
    • 별도 명시 없이 공통적으로 사용 가능하다.

 

WebFilter vs Global Filter vs GatewayFilter (AbstractGatewayFilterFactory == Custom Filter)


If you want to have a filter for every single route (for routes defined in the YAML as well as controllers / endpoints hosted in your gateway itself), WebFilter should be the way to go

If you want a filter for all the routes, but not for the endpoints hosted in your gateway, then you can go for Default Filters / Global Filters.

And lastly, you have GatewayFilters that can be configured for specific routes.

 

Filter 들은 @Order 애노테이션, Orderd Class를 사용하여 순서 설정도 가능하다.

숫자가 낮을 수록 우선순위가 빠르다.

 

Orider -1 is response write filter, must be called before that

 


참고

- https://stackoverflow.com/questions/58429556/globalfilter-vs-webfilter

- https://bcho.tistory.com/1005

- https://sujinhope.github.io/2021/06/13/Network-%ED%94%84%EB%A1%9D%EC%8B%9C(Proxy)%EB%9E%80,-Forward-Proxy%EC%99%80-Reverse-Proxy.html 

728x90
반응형
LIST