인프런 커뮤니티 질문&답변
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
안녕하세요, 이도원입니다.
올려주신 코드의 일부분 (Default Filter 부분, Global Filter)을 제가 가지고 있는 apigateway-service 프로젝트에 옮겨서 작업 했을 때, 아래와 같이 정상작동 되었습니다. application.yml 파일의 다른 부분, 예를 들어, server-port, eureka, routes 등의 설정은 정상적으로 작동되는대도 필터 부분만 작동되지 않는다면, 사용하신 apigateway-service 프로젝트의 spring boot + spring cloud의 버전을 확인해 보시고, 자바코드를 이용하여 작성된 필터 코드를 등록하는 방법(AbstractGatewayFilterFactory 상속)과 application.yml에 직접 필터를 적용하는 부분을 분리해서 따로따로 확인해 보시고 모든 필터가 작동되지 않는 것인지도 확인해 보시면 좋을 것 같습니다. 지속적인 문제가 발생하신다면, 아래 이메일로 작업하신 apigateway-service 프로젝트 코드를 압축하여 보내주시면, 제쪽에서도 확인해 보도록 하겠습니다.
감사합니다.
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에 언급된 내용을 살펴보시면 도움이 될 수 있습니다.





