Api Gateway에 CustomFilter를 넣어보는 강의이다.
@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
}
public static class Config {
// Put the configuration properties
}
@Override
public GatewayFilter apply(Config config) {
// Custom PreFilter
return null;
});
}
}
@Override
public GatewayFilter apply(Config config) {
// Custom PreFilter
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 code -> {}", response.getStatusCode());
}));
});
}
server:
port: 8000
spring:
application:
name: api-gateway-service
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
filters:
# - AddRequestHeader=first-request, first-requests-header2
# - AddResponseHeader=first-response, first-response-header2
- CustomFilter
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
# - AddRequestHeader=second-request, second-requests-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
register-with-eureka: false
fetch-registry: false
@Data
public static class Config {
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
이렇게 야물파일에 값을 추가하는데, 이 녀석들이 setter로 작동하는 녀석들이라 setter가 없는 내 내부정적클래스에서는 이 녀석들을 받아들일 수가 없었던 것이었다.
아무튼 이렇게 하고 작동시키면 아래처럼 로그가 잘 나온다.
@Override
public GatewayFilter apply(Config config) {
// Custom PreFilter
GatewayFilter filter = new OrderedGatewayFilter((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Logging PRE filter : request id -> {}", request.getId());
// Custom Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("Logging POST filter : response code -> {}", response.getStatusCode());
}));
// 이 녀석!!!
}, Ordered.HIGHEST_PRECEDENCE);
return filter;
}
아까 Ordered를 Ordered.LOWEST_PRECEDENCE
이렇게 바꾸면
기대한 대로 로그가 뜨기는 한다.
그런데 이게 우리가 진정 의도한 것인가 하면 그건 아닌거같다. 그저 맨 나중에 실행되게 했을 뿐이다. yml파일에 로깅필터 아래에 다른 필터를 추가한다 해도 로깅필터가 맨 나중에 실행될 것이다.
그럼 어떻게 해야되는 것인가... 그걸 알려주고 강의가 끝날줄 알았는데 그냥 끝나버렸다.
나도 여기서 마무리해야 할거 같다!!