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

Spring Cloud Gateway - Global Filter

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

공통적으로 적용시킬 때 사용하는 Filter이다.

가장 처음에 시작이 되고, 가장 마지막에 종료된다

Pre 같은 경우 CustomFilter보다 먼저 실행되고, Post 같은 경우 CustomFilter보다 늦게 종료된다.

GlobalFilter


@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> { // 해당 Factory를 구현해야한다.
    public GlobalFilter(){
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {

        return ((exchange, chain) ->{
            //Global Pre Filter
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();
            log.info("Global PRE Filter baseMessage: {}", config.getBaseMessage());
            if(config.isPreLogger()){
                log.info("Global Filter Start: request id -> {}", request.getId());
            }
            //Global Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(()->{
                if(config.isPostLogger()){
                    log.info("Global Filter End: response id -> {}", response.getStatusCode());
                }
            }));
        });
    }

    @Data
    public static class Config{
        //Configure 정보를 입력한다.
        private String baseMessage;
        private boolean preLogger;
        private boolean postLogger;
    }
}
  • Config 정보에 따라 Log를 찍거나 안 찍거나 할 수 있다.

applictaion.yml 

cloud:
  gateway:
    default-filters:
      - name: GlobalFilter
        args: #이러한 값을 타이핑 해서 사용하게 되면, 수정시 다시 빌드, 베포 과정이 필요하기 떄문에 외부에서 입력받게끔 해야 좋은 방식이다
          baseMessage: Spring Cloud Gateway Global Filter
          preLogger: true
          postLogger: true
  • 해당 부분을 추가하여 Global Filter를 적용시킨다.
  • yml파일을 통해 baseMessage, preLogger, postLogger값을 입력받게 된다
    • 좋지 않은 방법이다(후에 해당 파일을 수정 시 빌드, 베포 과정을 다시 해야 되기 때문에, 해당 값을 입력받는 것이 코드밖에 있어야 한다)

GlobalFilter가 가장 먼저 실행되고, 늦게 종료되는것을 확인 할 수 있다.

728x90