我可以仅使用 Zuul post 过滤器来获取请求的响应时间吗?

Can I get the request's response time using only a Zuul post filter?

我目前使用 Zuul 作为反向代理,Ribbon 作为负载均衡器,Eureka 作为服务发现。

是否可以仅使用 Zuul post 过滤器来获取请求的响应时间?我还可以获取进入和离开网关的请求的时间戳吗?

我猜这是可能的,但它会涉及过滤器、restTemplate 拦截器和 servlet 过滤器的组合 classes

如果他们是 Whosebug 的 plantuml 插件,我会给出图表

想法是,创建一个 preFilter 假设 TimeTrackerFilter 将在请求 "time-start-id" 中添加入口点时间戳 header,一个 userContextFilter 将拦截所有传入的 HTTP 请求并将 HTTP 请求映射到userContext class , UserContextClass 由一个 getter/setter 从 java.lang.ThreadLocal

检索和存储值的方法

UserContextHolder.java 将 UserContext 存储在 ThreadLocal 变量中,该变量可在处理用户请求的线程调用的任何方法中访问

UserContextINterceptor class 将 "time-start-id" 注入任何从 rest 模板执行的基于 http 的传出服务请求

a post 过滤器实际上将从请求上下文中获取 time-start-id,计算时间差异并添加一个新的 header "time taken ",值为时间差异响应

如果您不想在其他被调用的服务中看到开始时间 ID,仅使用前置和 post 过滤器就足够了(在这种情况下忽略 userContext 和拦截器)

注意: 当你想向 HTTP 请求 headers 添加一个值时,你可以使用 RequestContext 的 addZuulRequestHeader() 方法。此方法将维护已添加的 HTTP header 的单独映射 当请求通过 Zuul 服务器的过滤器时。该数据CON- 包含在 ZuulRequestHeader 映射中的将在目标服务被合并时合并 由您的 Zuul 服务器调用。