Проблема с WebFilter в Spring Cloud Gateway - PullRequest
0 голосов
/ 16 февраля 2019

Я использую 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, которое заставляет его функционировать в одном случае, а не в другом.

...