Spring Cloud Gateway中的WebFilter问题

时间:2019-02-16 01:28:50

标签: java spring spring-webflux spring-cloud-gateway

我将基于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导致的行为使其在一种情况下不能起作用。

0 个答案:

没有答案