공부/Spring

Spring Cloud로 개발하는 마이크로서비스 애플리케이션_API Gateway Service_5

데부한 2023. 2. 20. 00:23
반응형

 

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Spring Cloud Gateway - Custom Filter 적용

CustomFilter.java 생성

@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());

            // Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("Custom POST filter : response id -> {}", response.getStatusCode());
            }));
        };
    }

    public static class Config {
        // Put the configuration properties
    }
}

Mono 객체는 웹 플럭스라고 spring5에서 추가된 기능이다. 웹 서버 동기 방식이 아닌 비동기 방식에서 단일 값을 전달하기 위해 사용한다.

 

application.yml 필터 추가

          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - CustomFilter
// ....생략
          filters:
#            - AddRequestHeader=second-request, second-request-header2
#            - AddResponseHeader=second-response, second-response-header2
            - CustomFilter

기존에 적용했던 필터들을 주석처리 후 CustomFilter를 적용한다.

서버 종료 후 재시작한다.

 

check 메서드 추가

first-service의 FirstServiceController.java

@GetMapping("/check")
public String check() {
    return "Hi, there. This is a message from first Service";
}

 

second-service의 SecondServiceController.java

@GetMapping("/check")
public String check() {
    return "Hi, there. This is a message from second Service";
}

 

각 서버를 재시작한다.

크롬에서 확인한다.

 

apigateway-service 콘솔에 보면 filter가 잘 적용되어있는 걸 확인할 수 있다.

 

 

 

Spring Cloud Gateway - Global Filter

Custom Filter와 만드는 방식은 비슷하다. Custom Filter와의 차이점은 어떠한 Route 정보가 실행되더라도 공통적으로 적용할 수 있는 필터라는 점이다.

GlobalFilter는 어떤 Filter보다 먼저 실행되고, 또 제일 마지막에 실행된다. GlobalFilter와 CustomFilter 두 개 사용 시

  • GlobalFilter PRE
  • CustomFilter PRE
  • CustomFilter POST
  • GlobalFilter POST

순으로 로그가 출력 될 것이다.

 

GlobalFilter.java 생성

 

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

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

 

 

application.yml 설정

 spring:
    cloud:
      gateway:
        default-filters:
          - name : GlobalFilter
            args :
              baseMessage : Spring Cloud Gateway Global Filter
              preLogger : true
              postLogger : true

위와 같은 설정 정보는 수정할 때마다 서비스를 재실행해야하는 부담이 있다. 만약 배포되고 있는 서비스라면 과정은 더 번거로울 것이다. 그래서 많은 MSA 환경에서는 이러한 설정 정보를 외부에 따로 분리해두어 서비스를 재실행, 재배포하지 않도록 한다. (추후 더 설명)

 

서버 재실행 후 크롬에서 확인

apigateway-service 프로젝트 콘솔 확인

 

 


- 출처 : 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의

반응형