앞 내용을 보고 오는 것을 추천합니다.
@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
public GlobalFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Global Filter baseMessage: {}, {}", config.getBaseMessage(), request.getRemoteAddress());
if (config.isPreLogger()) {
log.info("Global Filter Start: request id -> {}", request.getId());
}
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;
}
}
public GatewayFilter apply(Config config)
→ 실제 필터의 로직을 구현하는 부분입니다. 이 메서드는 config
인스턴스에 설정된 값에 따라 로깅을 수행하고, 그 다음 필터 체인으로 요청과 응답을 전달하는 역할을 한다.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:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- uri: lb://user-service
predicates:
- Path=/user-service/**
- uri: lb://mate-service
predicates:
- Path=/mate-service/**
- uri: lb://product-service
predicates:
- Path=/product-service/**
- uri: lb://stock-service
predicates:
- Path=/stock-service/**
- uri: lb://order-service
predicates:
- Path=/order-service/**
baseMessage
→ 이 값은 로깅 메시지의 일부로 사용됩니다. 여기서는 "Spring Cloud Gateway Global Filter"라는 값이 설정되어 있습니다.preLogger
→ 이 값이 true
로 설정되면, 각 요청이 처리되기 전에 로깅이 수행됩니다. 즉, 요청이 들어올 때마다 로그가 남겨집니다.postLogger
→ 이 값이 true
로 설정되면, 각 요청 처리 후에 로깅이 수행됩니다. 즉, 응답이 보내질 때마다 로그가 남겨집니다.