클라이언트의 요청을 받아 백엔드 서비스로 라우팅하고, 다양한 부가 기능을 제공하는 중간 서버 역할.
- 클라이언트 요청을 적절한 서비스로 전달하는 라우팅 기능
- 요청의 인증 및 권한을 검증
- 여러 서비스 인스턴스 간의 부하를 분산하는 로드 밸런싱 기능
- 요청 및 응답을 로깅하고 모니터링
- 요청과 응답을 변환하거나 필터링
Spring Cloud Gateway 주요 기능 ▼
- 요청의 URL 패턴에 따라 동적으로 라우팅
- 요청 전·후에 다양한 작업을 수행할 수 있는 필터 체인 제공
- 모니터링 및 요청의 인증 및 권한을 검증하는 보안 기능
build.gradle ▼
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
application.yml 라우팅 설정 ▼
spring:
cloud:
gateway:
routes: # Spring Cloud Gateway의 라우팅 설정
- id: order-service # 라우트 식별자
uri: lb://order-service # 'order-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/order/** # /order/** 경로로 들어오는 요청을 이 라우트로 처리
Spring Gloud Gateway 필터링 ▼
- 인터페이스를 구현하고 filter 메서드를 @Override 해야한다.
- Mono : 리액티브 프로그래밍에서 0 또는 1개의 데이터를 비동기 처리함. Mono<Void>는 아무 데이터도 반환하지 않는다. 즉, 결과가 없는 비동기 흐름을 의미한다. 스레드 자원을 효율적으로 사용하고, 여러 작업을 동시에 처리할 수 있다.
- Global Filter : 모든 요청에 대해 작동하는 필터
- Gateway Filter : 특정 라우트에만 적용되는 필터
- Pre 필터 : 요청을 가로채서 필요한 작업을 수행하고, 체인의 다음 필터로 요청을 전달한다. 이때 추가적인 비동기 작업을 수행할 필요가 없기 때문에 then 메서드를 사용할 필요가 없다.
- Post 필터 : 요청이 처리된 후, 응답이 반환되기 전에 실행된다. 체인의 다음 필터가 완료된 후에 실행되어야 하므로 다음 필터를 실행하고 then 메서드를 사용하여 응답이 완료된 후에 실행할 작업을 정의한다.
Pre 필터 ▼
public class CustomPreFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 다음 필터로 전달
return chain.filter(exchange);
}
// 순서를 제일 먼저
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
Post 필터 ▼
public class CustomPostFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange)
.then(Mono.fromRunnable(()->{
ServerHttpResponse response = exchange.getResponse();
}));
}
// 제일 나중에 실행
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
Mono에 대해서 간단하게 알아보자
Mono는 비동기 데이터 흐름을 관리하는 객체인 리액티브 타입으로, 비동기적인 단일 결과를 반환한다. 즉, 하나의 값이나 값이 아예 없을 경우를 나타낸다. 만약 여러 개의 값들을 스트림처럼 처리하려면 Flux를 사용하면 된다.
Mono는 비동기 작업을 관리하기 때문에, 해당 작업이 완료되기를 기다리지 않고 즉시 반환할 수 있다. 이런 방식은 서버의 성능을 높이고, 요청을 더 빠르게 처리하는 데 유리하다.
ex) JWT 검증이 실패해도 바로 처리되고, 다음 필터는 실행되지 않게 할 수 있다.
이후에 더 자세한 내용을 알아보자 🖐️🖐️
'🔥스파르타 TIL (MSA)' 카테고리의 다른 글
Spring Cloud 란? (3) - 서킷 브레이커 (1) | 2025.03.08 |
---|---|
Eureka 서버 사용해보기 (1) | 2025.03.08 |
Spring Cloud 란? (2) - 클라이언트 사이드 로드 밸런싱 (0) | 2025.02.08 |
Spring Cloud 란? (1) (0) | 2025.02.08 |
MSA 란? (0) | 2025.02.08 |