[MSA] Global Filter

jineey·2024년 11월 4일

MSA

목록 보기
4/36

API Gateway

Global Filter

📌 Global Filter란?

  • application.yml 파일에서 적용하려는 라우팅 정보에 개별 설정 추가가 필요했던 Custom Filter와 달리, 어떤 라우팅 정보가 실행되는 공통적으로 실행되는 필터
  • 가장 먼저 실행 ➡ 개별 Custom Filter 실행 ➡ 가장 마지막 종료

📌 소스코드

  • GlobalFilter.java 추가
package com.example.apigatewayservice.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 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());

            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 : request_id = {}", response.getStatusCode());
                }
            }));
        };
    }

    @Data
    public static class Config {
        private String baseMessage;
        private boolean preLogger;
        private boolean postLogger;
    }

}
  • Lombok을 사용하고 있기 때문에, @Data를 추가하여 별도의 Getter/Setter 만들 필요 없이 사용 가능
  • boolean 타입의 데이터는 is가 붙은 메서드가 추가되며, true/false 값 사용
  • application.yml 수정
spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: first-service
          uri: http://localhost:8081/
          predicates:
            - Path=/first-service/**
          filters:
            - CustomFilter
#              - AddRequestHeader=first-request,first-request-header2
#              - AddResponseHeader=first-response,first-response-header2
        - id: second-service
          uri: http://localhost:8082/
          predicates:
            - Path=/second-service/**
          filters:
            - CustomFilter
#              - AddRequestHeader=second-request,second-request-header2
#              - AddResponseHeader=second-response,second-response-header2
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway Global Filter
            preLogger: true
            postLogger: true


server:
  port: 8000

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka

spring.cloud.gateway.default-filters 설정 추가

📌 실행 결과

✅ Global Filter 가 가장 먼저 실행되고, 가장 마지막에 종료됨도 확인 가능하다.

profile
새싹 개발자

0개의 댓글