我将基于Java Webflux的Spring Cloud Gateway(https://spring.io/projects/spring-cloud-gateway)用作我的环境中的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"))
与此有关的怪异部分是WebFilter中的doAfterSuccessOrError
将按预期对proxypath2执行,但不会对proxypath1执行。但是,如果将.filters(f -> f.filter(baseFilter))
添加到proxypath1,则WebFilter将正常执行。 BaseFilter实际上只是这样做:
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return Mono.empty();
}
有人可以帮助我了解这种行为吗?我的理解是WebFilter应该始终同时执行前部分和后部分,并且我不理解GatewayFilter导致的行为使其在一种情况下不能起作用。