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 우회, 제한된 사이트 접근이다.
Forward Proxy와 동일하게 Client는 Server로 직접 요청하지 않고, Proxy Server를 통해 요청한다.
Reverse Proxy
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)
- 공통 로직 처리
동작 방식
- 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
'Develope > Spring & Springboot' 카테고리의 다른 글
[Spring-Data-Rest] REST API 자동 생성 (0) | 2022.07.31 |
---|---|
[Spring] Spring Triangle - DI, AOP, PSA (0) | 2022.06.29 |
[Spring] PSA - Portable Service Abstraction (0) | 2022.06.29 |
[Spring] AOP - Aspect Oriented Programming (0) | 2022.06.28 |
[Spring] Inversion of Control & Dependency Injection (0) | 2022.06.28 |