1.traceId用途
主要用于项目dubbo接口调用链日志追踪使用,可以获取完整的链路日志,协助排查问题。
2.traceId传递及代码实现
本方案是基于 org.slf4j.MDC 进行实现,会出现线程池中线程复用导致traceId重复问题,后面会说解决方案。
-
web项目(CONSUMER)
- com.alibaba.dubbo.rpc.Filter 文件,路径在src\main\resources\META-INF\dubbo目录下面,文件内容就是对应项目中指定的过滤器类路径
-
globalTraceFilter=com.xxx.filter.GlobalTraceFilter
-
- com.alibaba.dubbo.rpc.Filter 文件,路径在src\main\resources\META-INF\dubbo目录下面,文件内容就是对应项目中指定的过滤器类路径
-
GlobalTraceFilter类里面代码如下,实现dubbo的Filter接口:
package com.xxx.filter; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; import org.slf4j.MDC; import java.util.UUID; /** * @Description 过滤器传递tradeId(消费者) * @Version v1.0 */ @Activate(group = {CommonConstants.CONSUMER}) @Slf4j public class GlobalTraceFilter implements Filter { private static final String TRACE_ID = "TraceId"; @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { RpcContext rpcContext = RpcContext.getContext(); String traceId; if (rpcContext.isConsumerSide()) { traceId = MDC.get(TRACE_ID); if (traceId == null) { traceId = UUID.randomUUID().toString().replace("-", ""); } MDC.put(TRACE_ID, traceId); rpcCon