使用MDC或线程本地

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

我想宣传一下 X-Request-Id 当使用http调用其他服务时,从Nginx接收到的数据会被发送到K8s中的其他服务。

现在,我正在使用请求过滤器来抓取那个 X-Request-Id 头,并把它放到MDC中。

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

现在,我在k8s里面调用服务B的端点(所以没有Nginx的阻碍),我想获得那个 X-Request-Id 将其放入请求的头中。我在这里看到两个选项。

  1. 简单地从MDC中获取该值
  2. 除了将该头存储在MDC中之外,还将其存储在线程本地变量中(因为服务正在使用Dropwizard)。

我可能会用MDC来做,但我不确定这是否是最好的做法,或者是否会有一些陷阱问题。

java dropwizard thread-local mdc
1个回答
0
投票

我认为对于你的目的来说,使用MDC是不错的。MDC内部使用ThreadLocal。即使你使用ThreadLocal,为了更好的实现方式,你会把ThreadLocal变量封装在一个类中。MDC也是这样做的。


1
投票

我使用MDC和ThreadLocal来实现类似的目的,即向头文件传递一个transaction-id。在内部,MDC使用ThreadLocal,它有一些预定义的功能,比如给每个日志添加一个前缀。如果你放的数据有一定的商业用途,我建议使用ThreadLocal,否则,你可以选择MDC。

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