Dubbo Logback 远程调用携带traceid

背景

A项目有调用B项目的服务,A项目使用 logback 且有 MDC 方式做 traceid,调用B项目的时候,traceid 没传递过期,导致有时候不好排查问题和链路追踪

准备工作

因为使用的是 alibaba 的 dubbo 所以需要加入单独的包

ml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>transmittable-thread-local</artifactId>
    <version>2.14.5</version>
</dependency>

Dubbo拦截器代码

java 复制代码
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 {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String logUUid = null;
        if (RpcContext.getContext().isConsumerSide()) {
            // 消费者 作为消费者,上下文中有 trace id
            logUUid = MDC.get(LogUtils.LOG_TRACE_ID);
            RpcContext.getContext().setAttachment(LogUtils.LOG_TRACE_ID, logUUid);
            log.info("DubboLogTraceFilter 消费者 设置 trace id {}", logUUid);
        } else {
            // 生产者 取出 trace id
            logUUid = 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的类路径和名称

java 复制代码
com.wemew.filter.DubboLogTraceFilter

效果

A 服务

B 服务

相关推荐
Memory_荒年10 小时前
Dubbo面试通关秘籍:从“小白”到“源码大神”的终极指南
java·后端·dubbo
fy1216313 小时前
Spring Boot项目中解决跨域问题(四种方式)
spring boot·后端·dubbo
会飞的大可14 小时前
服务间通信:OpenFeign vs Dubbo 的 RPC 选型
网络协议·rpc·dubbo
Memory_荒年2 天前
Dubbo调优实战:从QPS 1000到10000的惊险过山车之旅
java·后端·dubbo
qq_297574672 天前
Dubbo 进阶文章第五篇:Dubbo 3.x高可用架构设计实战(集群+故障+灾备)
dubbo
量子炒饭大师2 天前
【C++模板进阶】——【非类型模板参数 / 模板的特化 / 模板分离编译】
开发语言·c++·dubbo·模板·非类型模板·模板的特化·模板分离编译
是2的10次方啊3 天前
Dubbo泛化调用:没有接口 Jar,为什么也能调服务?
dubbo
上海运维Q先生5 天前
K8s环境下在Pod中运行Pod中没有的命令-----nsenter
容器·kubernetes·dubbo
小江的记录本6 天前
【Logback】Logback 日志框架 与 SLF4J绑定、三层模块、MDC链路追踪、异步日志、滚动策略
java·spring boot·后端·spring·log4j·maven·logback
难忘经典6 天前
springboot中配置logback-spring.xml
spring boot·spring·logback