Dubbo Logback 远程调用携带traceid
背景
A项目有调用B项目的服务,A项目使用 logback 且有 MDC 方式做 traceid,调用B项目的时候,traceid 没传递过期,导致有时候不好排查问题和链路追踪
准备工作
因为使用的是 alibaba 的 dubbo 所以需要加入单独的包
<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.5</version>
</dependency>
Dubbo拦截器代码
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import com.dflm.weixin.util.LogUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;@Slf4j
@Activate(group = {"consumer", "provider"})
public class DubboLogTraceFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String logUUid = null;if (RpcContext.getContext().isConsumerSide()) {// 消费者 作为消费者,上下文中有 trace idlogUUid = MDC.get(LogUtils.LOG_TRACE_ID);RpcContext.getContext().setAttachment(LogUtils.LOG_TRACE_ID, logUUid);log.info("DubboLogTraceFilter 消费者 设置 trace id {}", logUUid);} else {// 生产者 取出 trace idlogUUid = RpcContext.getContext().getAttachment(LogUtils.LOG_TRACE_ID);log.info("DubboLogTraceFilter 生产者 取出 trace id {}", logUUid);MDC.put(LogUtils.LOG_TRACE_ID, logUUid);}try {return invoker.invoke(invocation);} finally {if (RpcContext.getContext().isProviderSide()) {MDC.remove(LogUtils.LOG_TRACE_ID);log.info("DubboLogTraceFilter 移除 trace id {}", logUUid);}}}
}
配置文件
在 resources 目录下面的META-INF文件夹中新建dubbo文件夹,新建文件com.alibaba.dubbo.rpc.Filter
注意的是代码中继承的Filter是哪个包就写哪个包,不然写成apach的是不会生效的,文件内容就是配置的Filter的类路径和名称
com.wemew.filter.DubboLogTraceFilter
效果
A 服务
B 服务