背景
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 服務