Global Filter

duckbill413·2024년 7월 30일
0

Spring Cloud

목록 보기
4/10
post-thumbnail

Global Filter

Custom Filter를 이용하여 상황에 맞는 필터를 걸어주었다면 Global Filter 를 이용해서 모든 필터에 적용되는 전역 필터를 생성해 줄 수 있다.

  • Global Filter, Custom Filter 실행 순서
    1. Global Filter start
    2. Custom Filter start
    3. Custom FIlter end
    4. Global Filter end
  • Global Filter 가 먼저 실행되고 그 사이에 Custom Filter가 먼저 실행된다.

Global Filter 생성 실습

  1. GlobalFilter class 생성

    기존의 Custom Filter를 생성했을때와 동일하게 AbstractGatewayFilterFactory를 상속받아 구현한다.

    @Slf4j
    @Component
    public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
        public GlobalFilter() {
            super(Config.class);
        }
    
        @Override
        public GatewayFilter apply(Config config) {
            // Global Pre Filter
            return (exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                ServerHttpResponse response = exchange.getResponse();
    
                log.info("Global Filter baseMessage: {}", config.getBaseMessage());
    
                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 {
            private String baseMessage;
            private boolean preLogger;
            private boolean postLogger;
        }
    }
  2. application.yml에 Global Filter 등록 및 변수 설정

    spring:
      application:
        name: api-gateway-service
      cloud:
        gateway:
          default-filters:
            - name: GlobalFilter
              args:
                baseMessage: String Cloud Gateway GlobalFilter
                preLogger: true
                postLogger: true
          routes:
            - id: first-service
              uri: http://localhost:8081/
              predicates:
                - Path=/first-service/**
              filters:
                - AddRequestHeader=first-request, first-request-header2
                - AddResponseHeader=first-response, first-response-header2
                - CustomFilter
            - id: second-service
              uri: http://localhost:8082/
              predicates:
                - Path=/second-service/**
              filters:
                - AddRequestHeader=second-request, second-request-header2
                - AddResponseHeader=second-response, second-response-header2
                - CustomFilter
    • default-filtersGlobalFilter를 등록
    • argsGlobalFilter.Config 변수를 설정
  3. GlobalFilter 테스트

    http://localhost:8000/first-service/check

    2024-07-11T20:56:23.526+09:00 : Global Filter baseMessage: String Cloud Gateway GlobalFilter
    2024-07-11T20:56:23.526+09:00 : Global Filter Start: request id -> 1084042e-4
    2024-07-11T20:56:23.528+09:00 : Custom PRE filter: request id -> 1084042e-4
    2024-07-11T20:56:23.534+09:00 : Custom POST filter: response code -> 200 OK
    2024-07-11T20:56:23.535+09:00 : Global Filter End: response code -> 200 OK
    • Global Filter가 먼저 실행되고 중간에 Custom Filter가 실행되는 것을 확인
    • application.yml의 변수가 제대로 할당된 것을 확인
profile
같이 공부합시다~

0개의 댓글