使用 MDC 或 Threadlocal

Luk*_*s F 4 java thread-local mdc dropwizard

当使用 http 调用它们时,我想将从X-Request-IdNginx 接收到的信息传播到 k8s 中的其他服务。

现在,我正在使用请求过滤器来捕获该X-Request-Id标头并将其放入 MDC。

        final String nginxRequestId = requestContext.getHeaderString("X-Request-Id");
        if (nginxRequestId != null) {
            MDC.put("infra_request", nginxRequestId);
        }
Run Code Online (Sandbox Code Playgroud)

现在,我正在 k8s 内调用服务 B 的端点(因此没有 Nginx 的阻碍),我想获取它X-Request-Id以将其放入请求的标头中。我在这里可以看到两个选项:

  1. 只需从 MDC 获取该值即可
  2. 除了将该标头存储在 MDC 中之外,还将该标头存储在线程局部变量中(因为该服务正在使用 Dropwizard)

我可能会使用 MDC 来完成此操作,但我不确定这是否是最佳实践,或者是否存在一些问题/问题。

小智 5

我使用 MDC 和 ThreadLocal 来实现类似的目的,将事务 ID 传递到标头。在内部,MDC 使用 ThreadLocal,它具有一些预定义的功能,例如为每个日志添加前缀。如果您放置的数据有一定的业务用途,我建议使用 ThreadLocal,否则,您可以使用 MDC。