Я использую Spring Cloud Gateway (https://spring.io/projects/spring-cloud-gateway) на основе Java Webflux в качестве шлюза API в моей среде и использую фильтры в течение непонятного времени. Цель - фильтр, который экономит время, когда запрос достигаетсервер, и регистрирует продолжительность, когда он возвращает ответ. Насколько я понимаю, WebFilter является способ сделать это, и добавил один, который иногда работает, но не другие. Во всех случаях, часть предварительного запроса происходит, но часто это не такнажмите на обратный вызов.
WebFilter выглядит следующим образом:
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
var time = System.currentTimeMillis();
return exchange
.getPrincipal()
.flatMap(principal -> {
return chain.filter(exchange);
})
.doAfterSuccessOrError((r, t) -> {
System.out.println("This frequently doesn't happen");
var duration = System.currentTimeMillis() - time;
recordTime(duration);
});
}
Я настраиваю маршруты с помощью RouteLocator:
return
builder.routes()
.route(r -> r.predicate("/proxypath1")
.uri("http://localhost:8080"))
.route(r -> r.predicate("/proxypath2")
.filters(f -> f.filter(baseFilter))
.uri("http://localhost:8080"))
Странная часть этого - doAfterSuccessOrError
из WebFilter будет выполняться, как и ожидалось, для proxypath2, но не для proxypath1. Однако, если мы добавим .filters(f -> f.filter(baseFilter))
в proxypath1, WebFilter будет работать нормально. BaseFilter буквально только делает это:
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return Mono.empty();
}
Может кто-топомогите мне понять это поведение? Насколько я понимаю, WebFilter всегда должен выполнять как до, так и после части, и я неОпределите поведение, которое вызывает GatewayFilter, которое заставляет его функционировать в одном случае, а не в другом.