我想宣传一下 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
将其放入请求的头中。我在这里看到两个选项。
我可能会用MDC来做,但我不确定这是否是最好的做法,或者是否会有一些陷阱问题。
我认为对于你的目的来说,使用MDC是不错的。MDC内部使用ThreadLocal。即使你使用ThreadLocal,为了更好的实现方式,你会把ThreadLocal变量封装在一个类中。MDC也是这样做的。
我使用MDC和ThreadLocal来实现类似的目的,即向头文件传递一个transaction-id。在内部,MDC使用ThreadLocal,它有一些预定义的功能,比如给每个日志添加一个前缀。如果你放的数据有一定的商业用途,我建议使用ThreadLocal,否则,你可以选择MDC。