400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Dubbo日志链路追踪TraceId怎么选型

本篇内容介绍了“Dubbo日志链路追踪TraceId怎么选型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

我们提供的服务有:网站设计制作、成都网站建设、微信公众号开发、网站优化、网站认证、霍林郭勒ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的霍林郭勒网站制作公司

一、目的

开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Dubbo 框架下 日志链路追踪ID 的实现方案选型思路。

Dubbo日志链路追踪TraceId怎么选型

全链路追踪的核心思想:

日志全链路追踪就是在每条系统日志里都添加显示 traceIdspanId 信息

Dubbo日志链路追踪TraceId怎么选型

二、方案选型

2.1. 方案一(apm-toolkit)

这是 SkyWalking 的一个日志插件,通过这个插件可以在日志中输出 traceId

2.1.1. 使用方式

配置依赖,在 pom 文件中添加以下内容


    org.apache.skywalking
    apm-toolkit-logback-1.x
    8.1.0

配置日志模板,修改 logback-spring.xml 文件中 Appender 元素的 encoder 为以下内容


    
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{35} - %msg%n
    

ps:pattern 中的内容按需修改,其中的 %tid 就是相当于 traceId,默认 TID:N/A,当有请求调用时会生成并显示 traceId

2.1.2. 总结

2.2. 方案二(sleuth)

SleuthSpring Cloud 的组件之一,它为 Spring Cloud 实现了一种分布式追踪解决方案,兼容Zipkin,HTrace与其他日志追踪系统

2.2.1. 使用方式

配置父依赖,在 pom 文件中添加以下内容管理版本号


    
        
            org.springframework.cloud
            spring-cloud-sleuth
            2.2.4.RELEASE
            pom
            import
        

配置依赖,在 pom 文件中添加以下内容


    org.springframework.cloud
    spring-cloud-starter-sleuth

适配dubbo,要让 sleuth 支持 dubbo 框架,需要增加以下两个步骤:

首先添加 dubbo 的插件依赖


    io.zipkin.brave
    brave-instrumentation-dubbo-rpc
    5.12.6

配置 dubbo 过滤器

dubbo:
  provider:
    filter: tracing
  consumer:
    filter: tracing

配置日志模板,修改 logback-spring.xml 文件中 Appender 元素的 encoder 为以下内容


    %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{X-B3-TraceId},%X{X-B3-SpanId}] [%thread] %-5level %logger{35} - %msg%n
    utf-8

ps:pattern 中的内容按需修改,其中的 %X{X-B3-TraceId} 为 traceId,%X{X-B3-SpanId} 为 spanId

2.2.2. 总结

2.3. 方案三(自研)

2.3.1. 无入侵增加 traceId

使用 LogbackMDC 机制,在日志模板中加入 traceId 标识,取值方式为 %X{traceId}

  1. 系统入口(api网关)创建 traceId 的值

  2. 使用 MDC 保存 traceId

  3. 修改 logback 配置文件模板格式添加标识 %X{traceId}

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。

2.3.2. 跨线程传递

解决 traceId 跨线程丢失问题

Dubbo日志链路追踪TraceId怎么选型

由于 MDC 内部使用的是 ThreadLocal 所以只有本线程才有效,子线程和下游的服务 MDC 里的值会丢失;

需要解决 Spring 的各种线程池与异步方法的父子线程间传递。

解决思路:重写一个 MDCAdapter 使用阿里的 TransmittableThreadLocal 替换原来的 ThreadLocal 对象,解决各种线程池(ExecutorService / ForkJoinPool / TimerTask)父子进程传值问题。

需要使用 TtlRunnableTtlCallable 来修饰传入线程池的 RunnableCallable

2.3.3. 跨进程传递

解决 traceId 跨进程丢失问题

dubbo服务使用 org.apache.dubbo.rpc.Filter 创建一个过滤器进行 traceId 传递

2.3.4. 总结

三、方案总结

方案开发工作量可维护性入侵性性能
apm-toolkit业务无入侵
sleuth业务无入侵
自研业务无入侵

“Dubbo日志链路追踪TraceId怎么选型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


本文名称:Dubbo日志链路追踪TraceId怎么选型
分享网址:http://mzwzsj.com/article/jpheds.html

其他资讯

让你的专属顾问为你服务