Spring Cloud Gateway Filter

2024. 10. 29. 20:28Spring 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