Spring Web Flux 中的 ThreadLocal

问题描述 投票:0回答:2

我是 Spring Webflux 的新手。我正在尝试使用 spring webflux 实现 ThreadLocal。

我有一个要求,需要将标头从一个微服务传递到 Web 客户端中的另一个微服务。

我不想将标头从一个服务传递到另一个手动携带它并在每个请求中分配它的服务。

因此,当我可以设置 ThreadLocal 并可以在 webclient 调用中访问它时,就想到使用 ThreadLocal。

我试图找到一个示例应用程序,我可以在 spring webflux 中引用 ThreadLocal。

spring-webflux spring-webclient
2个回答
2
投票

你不应该在反应式环境中使用ThreadLocal。 Webflux(基于Reactor)是一个非阻塞框架。它重用线程,因此一个反应式管道的步骤可以在不同的线程中运行,并且多个请求可以同时使用同一线程 - 直到一个等待,将选择并执行另一操作。想象一下,如果您的请求将某些内容放入 threadlocal 并等待 - 例如 - 在数据库选择上,另一个请求可以覆盖该值,并且原始请求的下一个管道阶段将看到新值属于另一个请求。 Threadlocal 适用于每线程请求模型。

对于 webflux,您可以使用上下文。例如,将值放入管道中的

WebFilter
中,然后您可以在反应式管道的任何点检索它:

chain.filter(exchange).contextWrite(<your data>)

在管道中(在地图/平面图中...)

Mono.deferContextual(...)

这里是文档的链接

或者,您可以使用 Hooks 在每个操作上提升 ThreadLocal 的值,但这不是一个很好且万无一失的解决方案。


0
投票

这实际上是有支持的。在阅读 Project Reactor 的文档时,您可以发现它们启用了AutomaticContextPropagation(https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Hooks.html#enableAutomaticContextPropagation--)。
其作用是实现 Project Reactor 的上下文与 ThreadLocal 的使用之间的同步。然而,它需要使用这个库https://github.com/micrometer-metrics/context-propagation?tab=readme-ov-file

© www.soinside.com 2019 - 2024. All rights reserved.