Spring 프레임워크 기반으로 개발된 API 게이트웨이로 사용자가 요청을 보낼떄 적절한 서비스로 안내해주는 역할
- Pre 필터: 요청이 처리되기 전에 실행
예시코드
@Component
public class CustomPreFilter implements GlobalFilter, Ordered {
//ServerWebExchange는 HTTP 요청과 응답을 캡슐화한 객체
//exchange.getRequest()`로 HTTP 요청 가져옴
//exchange.getResponse()`로 HTTP 응답을 가져옴
//chain.filter(exchange)는 다음 필터로 요청을 전달
private static final Logger logger = Logger.getLogger(CustomPreFilter.class.getName());
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest response = exchange.getRequest();
logger.info("Pre Filter: Request URI is " + response.getURI());
// Add any custom logic here
return chain.filter(exchange);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
- Post 필터 : 요청이 처리된 후, 응답이 반환되기 전에 실행
예시코드
//chain.filter(exchange)는 다음 필터로 요청을 전달
@Component
public class CustomPostFilter implements GlobalFilter, Ordered {
private static final Logger logger = Logger.getLogger(CustomPostFilter.class.getName());
@Override
public Mono<Void> filter(ServerWebExchange exchange, org.springframework.cloud.gateway.filter.GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
ServerHttpResponse response = exchange.getResponse();
logger.info("Post Filter: Response status code is " + response.getStatusCode());
// Add any custom logic here
}));
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
각 필터를 구현 하기 위해서는 인터페스를 구현하고 filter 메서드를 오버라이드 해야한다
아래와 같은 환경으로 실습을 진행
build.gradle 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
application.yaml 설정(예시)
server:
port: 1234 # 게이트웨이 서비스가 실행될 포트 번호
spring:
main:
web-application-type: reactive # Spring 애플리케이션이 리액티브 웹 애플리케이션으로 설정됨
application:
name: example # 애플리케이션 이름을 'example'로 설정
cloud:
gateway:
discovery:
locator:
enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
routes:
- id: example # 라우트 식별자
uri: lb://example # 'example'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/example/** # /example 시작하는 모든 요청을 이 라우트로 처리
discovery:
locator:
enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
eureka:
client:
service-url:
defaultZone: http://localhost:{ Eureka 서버 설정 포트}/eureka/
인스턴스 확인(유레카서버에 등록 확인)
필터 동작!
Spring Cloud Gateway 는 사용자(클라이언트)의 요청을 각각의 서비스로 매칭 시켜주고
필터를 통해 효과적으로 공통적인 요청과 응답을 관리하여 시스템의 유지보수성과 성능을 향상시킴