【问题标题】:Passing Correlation Id across Microservices requests: Which is the best strategy?跨微服务请求传递 Correlation Id:最好的策略是什么?
【发布时间】:2021-12-13 22:16:43
【问题描述】:

假设有一个 微服务 X 必须调用 微服务 Y 的示例场景。需要将后续调用与 Correlation-ID 相关联。 Micoservices 基于 Java (Spring Boot) 并公开 REST 和 GRPC api:

  1. "X ms" 被称为将 Correlation-Id 传递到 header
  2. X ms”中的拦截器拦截请求并将“somewhere”(例如,对于 JAVA MDC) Correlation-Id
  3. X ms控制器被触发并将业务逻辑的执行委托给业务层中的服务类方法
  4. Service 类方法 做了一些事情,并通过从 加载 Correlation-Id 来调用 "Y ms" “某处”

存储上下文数据(如相关 ID)的更好位置是什么?为什么?

  1. 设计具有特定签名的方法,以便在内部方法之间传递上下文数据。
  2. 使用 MDC。
  3. 使用 ThreadLocal。
  4. 在需要的地方注入 RequestContext(用于 REST)或使用上下文 (GRPC)
  5. 其他

谢谢!

【问题讨论】:

    标签: java logging microservices thread-local mdc


    【解决方案1】:

    我不会使用 ThreadLocal 或 MDC(基于线程本地),因为如果有一天您想要迁移到基于事件循环的服务(例如使用 reactor / web-flux),它将锁定您的实现细节.

    您可以在 Context 对象内的方法中自己传播上下文,该对象将在您的层之间流动(从控制器到业务逻辑再到 DAL)。这样做的好处是您对此非常明确,这可能是更易于维护的代码。

    您还可以考虑查看 spring sleuth(也与 zipkin 集成)。它的核心本质上是基于 MDC,但它也应该支持 reactor。

    【讨论】:

    • 是的,跨方法调用传播请求上下文的想法实际上是最简单的。我问自己这是否也是最优雅的方式,因为在我看来,这种方式的设计方法引入了很多样板代码。我也会看看Spring Sleuth项目,看起来很有趣。谢谢你,里奥。
    • 当然,乐于助人。我同意顺便说一句关于优雅和样板,但也考虑到,如果你是传播这一点的人,你将有更好的控制、可见性和可维护性(当你在项目中有多个人并长时间参与时很重要)。
    猜你喜欢
    • 2019-03-21
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多