如何计算总执行时间并设置响应 header,即 Spring WebFlux 中每个请求的 x-runtime?

How to calculate total execution time and set in response header i.e. x-runtime for every request in Spring WebFlux?

不知道我的做法对不对?另外,请让我知道是否还有其他 work-around 可以实现此目的。

是否可以使用 WebFilter?

package request.middlewares;

import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

@Component
public class ResponseTimeCalculator implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        // is it possible here?
        exchange.getResponse().getHeaders().add("X-Runtime", "10ms");
        return chain.filter(exchange);
    }
}

如果您正在使用 Spring 启动,您应该为此使用 spring-boot-starter-actuator

如果您没有使用 Spring Boot,您仍然应该看看 Micrometer,它使用 Spring WebFlux 来收集此类数据。

请注意,您的方法存在很多缺陷:

  • 处理程序链可能 return 但实际响应 handling/writing 可能尚未完成
  • 使用简单的计时器不会考虑 GC 暂停
  • 查看测量样本并不重要,百分位数可以提供更多信息

无论如何,您可以查看 Spring Boot 的 MetricsWebFilter (here) 以了解如何使用 Micrometer 实现这一点。