728x90
Spring Cloud Gateway - Logging Filter
Logging Filter는 커스텀 필터이다.
LoggingFilter.java 생성
OrderGatewayFilter 형식
@Override
public GatewayFilter apply(Config config) {
GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> {필터 내용}, 순서);
return filter;
}
@Component
@Slf4j
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest(); // exchange로부터 request, response 값을 얻는다
ServerHttpResponse response = exchange.getResponse();
log.info("Logging Filter baseMessage : {}", config.getBaseMessage());
if (config.isPreLogger()) {
log.info("Logging Filter Start: request id -> {}", request.getId());
}
// Custom Post Filter
// post filter를 적용하기 위해서 반환시켜주는 chain에 연결시켜서
return chain.filter(exchange).then(Mono.fromRunnable(() -> { // Mono : spring5에서 추가되었음
if (config.isPostLogger()) {
log.info("Logging Filter END: response code -> {}", response.getStatusCode());
}
}));
}, Ordered.HIGHEST_PRECEDENCE); // HIGHEST_PRECEDENCE : 우선 순위 가장 먼저.
return filter;
}
@Data
public static class Config {
// put the configuration properties
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
}
💡OrderedGatewayFilter
Gateway Filter를 구현시켜주는 자식 클래스 용도의 역할
application.yml
second-service만 적용해보자
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
# - AddRequestHeader=second-request, second-request-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter
- name: LoggingFilter # 추가적인 파라미터를 넣고 싶다면 "name:"을 넣어야 한다.
args:
baseMessage: Hi, there.
preLogger: true
postLogger: true
💡 필터 순서
- Global Filter PRE
- Custom Filter PRE
- Logging Filter PRE
- Logging Filter POST
- Custom Filter POST
- Global Filter POST
💡 Proxied Service
first-service, second-service처럼 추가로 구현했던 내용이다.
💡 LoggingFilter의 순서를 정할 수 있다.
Ordered.HIGHEST_PRECEDENCE : 가장 먼저
Ordered.LOWEST_PRECEDENCE : 가장 늦게
💡 Webflux
참고) Webflux란
기존 Spring에서 MVC패턴을 이용해서 ServletRequest와 ServletResponse 객체를 가지고 웹프로그램 작업을 했다.
Spring 5.0에서 새롭게 도입된 WebFlux 기능을 사용하면 HTTP ServletRequest와 ServletResponse 를 지원하지 않는다.
ServerRequest와 ServerResponse 두 가지 인스턴스를 가지고 작업을 해야한다.
ServerRequest와 ServerResponse를 사용할 수 있돌고 도와주는게 WebExchange 객체이다.
Gateway Filter Chain 객체로 다양한 필터, PreFilter, PostFiler, PreChain, PostChain 이렇게 연결 시켜서 작업할 수 있다.
실행결과 확인
postman 결과
apigateway-service 콘솔을 확인해보면
- Global Filter PRE
- Custom Filter PRE
- Logging Filter PRE
- Logging Filter POST
- Custom Filter POST
- Global Filter POST
순으로 출력되었다.
LoggingFilter순서를 Ordered.LOWEST_PRECEDENCE로 해두었기 때문이다.
Ordered.LOWEST_PRECEDENC로 설정하고 출력하면 Logging Filter가 가장 먼저 출력된 것을 알 수 있다.