Spring Cloud로 개발하는 MSA/API Gateway Service

Spring Cloud Gateway - Logging Filter

webmaster 2022. 5. 3. 16:56
728x90

GateWayFilter

실제 GateWayFilter는 직접 생성할 수 없고 구현한 OrderedGatewayFilter로 생성할 수 있다.

요청 -> globalFilter -> CustomFilter -> logginFilter -> MicroService

LogginFilter

@Component
@Slf4j
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
    public LoggingFilter(){
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        GatewayFilter filter = new OrderedGatewayFilter((exchange, chain)->{
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();
            log.info("Logging PRE Filter baseMessage: {}", config.getBaseMessage());
            if(config.isPreLogger()){
                log.info("Logging Filter Start: request id -> {}", request.getId());
            }
            //Logging Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(()-> {
                if (config.isPostLogger()) {
                    log.info("Logging Filter End: response id -> {}", response.getStatusCode());
                }
            }));
        }, Ordered.LOWEST_PRECEDENCE); //순서를 입력 받는다.
        return filter;
    }

    @Data
    public static class Config{
        //Configure 정보를 입력한다.
        private String baseMessage;
        private boolean preLogger;
        private boolean postLogger;
    }
}
  • 두 번째 파라미터로 입력받는 우선순위에 따라 필터 적용 순서를 지정할 수 있다.
    • Ordered.HIGHEST_PRECEDENCE : 가장 높은 우선 순위
    • Ordered.LOWEST_PRECEDENCE : 가장 낮은 우선 순위

OrderedGatewayFilter

Logging Filter

  • 생성자로, GateWayFilter와, order를 받는다.
  • filter 메서드로 해당 Filter가 해야 될 동작을 정의를 할 수 있다.

실제 실행되는 순서를 확인할 수 있다.

application.yml

server:
  port: 8000

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

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args: #이러한 값을 타이핑 해서 사용하게 되면, 수정시 다시 빌드, 베포 과정이 필요하기 떄문에 외부에서 입력받게끔 해야 좋은 방식이다
            baseMessage: Spring Cloud Gateway Global Filter
            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/** #해당 정보 모두가 URI 뒤에 붇게 된다. http://localhost:8082/second-service/**
          filters:
#            - AddRequestHeader= second-request, second-request-header2
#            - AddResponseHeader= second-response, second-response-header2
            - name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi, there
                preLogger: true
                postLogger: true
  • firstService는 CustomFilter만 가지고 있다.
  • secondService는 CustomFilter, LogFilter 두 개다 가지고 있다
    • name 속성을 이용해서 구분한다.
  • args 옵션을 통해 값을 전달해 준다.
728x90