Spring Cloud Gateway Filter
2024. 10. 29. 20:28ㆍSpring Boot
이번에는 API Gateway에 Filter를 적용시켜보겠다
기본적으로 다양한 종류의 Filter를 기본적으로 제공하지만
이번 글에서는Custom Filter에 대하여 다루겠다.
우선 필터의 종류는 2가지가 있다
전체에 기본적으로 적용되는 Global Filter와 각각의 서비스에 적용 시키는 일반 Filter
GlobalFilter 예시)
1.filter를 바로 bean으로 등록하는 방식
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {
// Pre 필터
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// chain.filter()를 리턴하기 전에 요청 조작과 관련된 코드를 추가
log.info("custom global filter");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
}
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public GlobalFilter CustomGlobalFilter() {
return new CustomGlobalFilter();
}
}
2.factory bean을 등록하는 방식
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
public GlobalFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
// Custom Pre Filter
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Global filter baseMessage : {}", config.getBaseMessage());
log.info("test");
if(config.isPreLogger())
log.info("Global filter Start : request id -> {}", request.getId());
// Custom Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if(config.isPostLogger())
log.info("Global filter End : response code -> {}", response.getStatusCode());
}));
});
}
@Data
public static class Config{
// Put the configuration properties...
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
}
spring.cloud.gateway.default-filters[0].name=GlobalFilter
spring.cloud.gateway.default-filters[0].args.baseMessage=Spring Cloud Gateway Global Filter
spring.cloud.gateway.default-filters[0].args.preLogger=true
spring.cloud.gateway.default-filters[0].args.postLogger=true
일반 Filter 예시)
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
// Custom Pre Filter
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Custom Pre filter : request id -> {}", request.getId());
log.info("base Message : {}", config.baseMessage);
// Custom Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("Custom Post filter : response id -> {}", response.getStatusCode());
}));
});
}
@Data
public static class Config{
private String baseMessage;
}
}
spring.cloud.gateway.routes[0].filters[0] = CustomFilter
spring.cloud.gateway.routes[0].filters[0].args.baseMessage = testing base message
'Spring Boot' 카테고리의 다른 글
| JPQL (0) | 2024.11.28 |
|---|---|
| Spring Cloud Eureka (0) | 2024.10.29 |
| Spring Cloud Gateway (2) | 2024.10.25 |
| Redis Cache (0) | 2024.10.11 |
| WebMVC와 WebFlux를 동시 사용 할 경우 WebSocket (0) | 2024.08.14 |