有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当RedistreLimiter阻止请求时,java Spring云网关全局筛选器未执行

我已经实现了一个全局预过滤器和一个全局后过滤器来记录请求事件。我还使用了带有RedistreLimiter的RequestRateLimiterFactory过滤器,以避免可能会淹没服务的请求峰值

我想使用pre和post筛选器记录两个事件

  1. 已注意到来自apiKey X的请求
  2. 该请求已被速率限制器接受或拒绝

当速率限制器接受一个请求并转发它时,就没有问题了,前过滤器和后过滤器都会执行,我可以记录我需要的数据。 问题是,当速率限制器阻止请求时,pre和postfilter都没有被执行,因此我无法记录或检索此事件以获取度量

尽管SpringCloudGateway通过一系列过滤器工作,但我认为上述问题可能是由RequestRateLimiterFactory类的isAllowed方法引起的。此方法在请求被拒绝时设置已完成请求,而不是将交换传递给下一个筛选器。但是我一直在研究,我没有做任何有用的事情来解决这个问题

return limiter.isAllowed(routeId, key).flatMap(response -> {

            for (Map.Entry<String, String> header : response.getHeaders().entrySet()) {
                exchange.getResponse().getHeaders().add(header.getKey(), header.getValue());
            }

            if (response.isAllowed()) {
                return chain.filter(exchange);
            }

            setResponseStatus(exchange, config.getStatusCode());
            return exchange.getResponse().setComplete();
        });

共 (0) 个答案