강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

백재원님의 프로필 이미지
백재원

작성한 질문수

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

Spring Cloud Gateway - Logging Filter 적용 ➁

GlobalFilter, LoggingFilter가 동작하지 않습니다.

작성

·

38

·

수정됨

0

server:
  port: 8000

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

spring:
  application:
    name: apiGateway-service
  cloud:
    gateway:
      server:
        webflux:
          default-filters:
            - name: GlobalFilter
              args:
                baseMessage: Spring Cloud Gateway WebFlux Global Filter
                preLogger: true
                postLogger: true
          routes:
            - id: user-service
              uri: lb://USER-SERVICE
              predicates:
                - Path=/user-service/**
            - id: first-service
              uri: lb://MY-FIRST-SERVICE
              predicates:
                - Path=/first-service/**
              filters:
                - AddRequestHeader=f-request, 1st-request-header-by-yaml
                - AddResponseHeader=f-response, 1st-response-header-from-yaml
                - name: LoggingFilter
                  args:
                    baseMessage: Spring Cloud Gateway WebFlux Logging Filter
                    preLogger: true
                    postLogger: true


다음처럼 apigateway의 설정파일을 작성하였습니다. 하지만 두 필터가 모두 동작하지 않습니다. 필터 클래스 모두 강의와 동일하게 작성하였고, first-service와 apigateway-service 모두 유레카 서버에 잘 등록되며, api 게이트웨이 또한 동작을 정상적으로 합니다. 혹시 어느 부분에서 잘못되었는 지 알 수 있을까요?

답변 2

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

올려주신 코드의 일부분 (Default Filter 부분, Global Filter)을 제가 가지고 있는 apigateway-service 프로젝트에 옮겨서 작업 했을 때, 아래와 같이 정상작동 되었습니다. application.yml 파일의 다른 부분, 예를 들어, server-port, eureka, routes 등의 설정은 정상적으로 작동되는대도 필터 부분만 작동되지 않는다면, 사용하신 apigateway-service 프로젝트의 spring boot + spring cloud의 버전을 확인해 보시고, 자바코드를 이용하여 작성된 필터 코드를 등록하는 방법(AbstractGatewayFilterFactory 상속)과 application.yml에 직접 필터를 적용하는 부분을 분리해서 따로따로 확인해 보시고 모든 필터가 작동되지 않는 것인지도 확인해 보시면 좋을 것 같습니다. 지속적인 문제가 발생하신다면, 아래 이메일로 작업하신 apigateway-service 프로젝트 코드를 압축하여 보내주시면, 제쪽에서도 확인해 보도록 하겠습니다.

edowon0623@gmail.com

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
백재원님, 먼저 설정 파일을 확인할 때, WebFlux 설정이 제대로 적용되고 있는지 확인하셔야 합니다. Spring Cloud Gateway는 WebFlux 기반에서 작동하므로 Spring WebFlux가 프로젝트에 포함되어 있어야 합니다. Spring WebFlux가 포함되지 않으면 GlobalFilter와 같은 WebFlux 관련 설정이 작동하지 않습니다. spring-boot-starter-webflux 의존성이 build.gradle이나 pom.xml에 추가되어 있는지 확인해 보세요.

또한, 설정 파일에서 default-filters 리스트가 server.webflux 하위에 위치하고 있는 부분이 잘못되었습니다. spring.cloud.gateway 하위로 변경하여 다음과 같이 수정해 보세요:

spring:
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args:
            baseMessage: Spring Cloud Gateway WebFlux Global Filter
            preLogger: true
            postLogger: true
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/user-service/**
        - id: first-service
          uri: lb://MY-FIRST-SERVICE
          predicates:
            - Path=/first-service/**
          filters:
            - AddRequestHeader=f-request, 1st-request-header-by-yaml
            - AddResponseHeader=f-response, 1st-response-header-from-yaml
            - name: LoggingFilter
              args:
                baseMessage: Spring Cloud Gateway WebFlux Logging Filter
                preLogger: true
                postLogger: true

마지막으로, 작성한 필터 클래스들이 Spring 애플리케이션 컨텍스트에 빈으로 등록되어 있는지도 확인하시길 바랍니다. 필터 클래스에 @Component 어노테이션이나 적절한 빈 등록 코드가 있는지 체크해 주세요. 추가적으로 Spring Boot Reference Documentation에 언급된 내용을 살펴보시면 도움이 될 수 있습니다.

백재원님의 프로필 이미지
백재원

작성한 질문수

질문하기