【全链路追踪】XXL-JOB添加TraceID

这篇具有很好参考价值的文章主要介绍了【全链路追踪】XXL-JOB添加TraceID。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

首先这个项目属于小型项目,由于人手以及时间限制,并未引入Skywalking等中间件来做调用链路追踪。Skywalking不在此次的讨论范围中。

其次介绍一下项目的相关背景

调用路径

项目中主要有两种调用路径

  1. Web请求走统一的网关入口,调用后端服务
  2. XXL-JOB定时任务执行调度

部署环境

Kubernetes

问题

走统一网关入口的请求不用担心,在网关那边加了TraceID,但是XXL-JOB由于是自动注册,且部署环境是在K8S内,XXL-JOB获取到的是Pod的IP,网关并未拦截到。
由于项目的逻辑较为复杂,XXL-JOB的调度任务属于其中比较重要的一块,对于前期开发的调试以及后期问题的确认,加上TraceID是非常有必要的。

二、方案

首先确认是的XXLJOB执行定时任务时,JobHandler没有TraceID,不考虑使用中间件的话,就只有两种方案了。

一种是改造XXL-JOB源码,在发起请求中添加TraceID;另一种则是在后端服务拦截到XXL-JOB的请求,在入口添加TraceID。

XXL-JOB的源码没有具体研究过,之前只是做过适配Oracle,改造起来有一定难度,所以最后采用的方案还是在后端服务拦截请求,添加TraceID。

在网上搜索了一下相关资料,发现实现起来还是比较简单的,一般都是通过spring aop的方式,在Slf4j的MDC中添加TraceID。
在这里简单介绍下MDC,之前我也没做过更多了解。

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多线程的方式来处理多个用户的请求。

MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问当需要记录日志时,只需要从 MDC 中获取所需的信息即可。

其实就是使用ThreadLocal来存储,而由于请求到Java后端服务时,Tomcat会分配一个线程,直至请求结束,这样就会保证我们在入口添加的TraceID,会传递到整条链路。
但是使用MDC调用存在两个问题:

  1. 子线程中日志TraceID丢失

  2. 跨服务调用日志TraceID丢失

同时项目中使用了Openfeign,在发起端使用 RequestInterceptor 来拦截,添加TraceID,然后在接收端使用 HandlerInterceptor 拦截。

即最终方案是 MDC+RequestInterceptor+HandlerInterceptor

整体的调用链路如下:

暂时无法在飞书文档外展示此内容

三、Demo示例

1、MDC

@Aspect
@Component
@Slf4j
public class XxlJobAopConfig {

    @Before("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
    public void beforeMethod() {
        MDC.put('traceId',
                UUID.randomUUID().toString().toLowerCase());
    }
}

2、RequestInterceptor

@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        template.header('traceId', MDC.get(HeaderExtraInfoConstants.traceId));
    }
}
@FeignClient(name = "test", url = "xxx", configuration = FeignRequestInterceptor.class)

3、HandlerInterceptor

@Slf4j
@Component
public class HeaderInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3) {
        MDC.remove('traceId');
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView arg3) {
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String traceId = request.getHeader(HeaderExtraInfoConstants.traceId);
        if (StringUtils.isEmpty(traceId)) {
            MDC.put('traceId', UUID.randomUUID().toString().toLowerCase());
        } else {
            MDC.put('traceId', traceId);
        }
        return true;
    }

}
@Configuration
public class InterceptorConfiguration extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HeaderInterceptor()).addPathPatterns("/**");
    }
}

4、logback.xml

%d{yyyy-MM-dd HH:mm:ss.SSS} ---> [%X{traceId}] ---> [%thread] ---> %-5level %logger{50} - %msg%n

四、后续改进思路

上述方案有较大的局限性,只适用于服务间通过feign调用的方式,如果有其他如okhttp的方式,需要再添加拦截器。对于多线程的问题也并未解决,常见的方式是通过重写线程池来解决。

  1. 丰富调用场景,添加拦截器

  2. 重写线程池

  3. 由于部署在K8S集群,可启用Istio进行服务治理文章来源地址https://www.toymoban.com/news/detail-673043.html

到了这里,关于【全链路追踪】XXL-JOB添加TraceID的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【xxl-job】分布式任务调度系统xxl-job搭建

    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍,请访问官网:分布式任务调度平台XXL-JOB 前提条件:任务调度中心(xxl-job admin)依赖于 mysql,所以必须要安装mysql才行!安装mysql有2种方式:docker部署或

    2024年02月16日
    浏览(47)
  • Xxl-job安装部署以及SpringBoot集成Xxl-job使用

    1、安装Xxl-job: 可以使用docker拉取镜像部署和源码编译两种方式,这里选择源码编译安装。 代码拉取地址: 官方开发文档: 2、打开项目 使用Maven打开项目,下载相关的jar包依赖。配置相关配置文件 这里可以参考官方开发文档进行配置。 3、初始化数据库 项目中包含数据库

    2023年04月25日
    浏览(41)
  • XXL-JOB任务分片

    单个任务:一个任务实例便可完成 单机单任务:单机模式下任何路由模式都只有一个实例执行 集群单任务:由路由策略(广播模式除外)选择其中一个实例完成 分片任务:集群部署,每个实例都同时执行一部分数据。分片方式:取模分片,范围分片 单机多任务分片:单机模式

    2024年02月08日
    浏览(59)
  • XXL-JOB详细说明

    单机:Timer、ExectorService、spring@scheduled 分布式:xxl-job、quartz、elastic-job 由调度中心和执行器组成,调度中心提供一个web管理配置任务和执行器,调度中心通过rpc触发执行器 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; 2、动态:支持动态修改任务状

    2024年02月10日
    浏览(68)
  • xxl-Job基础配置

    介绍: XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 几个特性: 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; 2、动态:支持动态修改

    2024年02月09日
    浏览(37)
  • Docker-compose搭建xxl-job(并配置Python3环境xxl-job执行器)

    注意:a.文件内IP替换成自己本机IP; b.数据库连接、用户密码根据自己情况修改; 注意:根据自己Python脚本需要添加python3第三方包; 注意:xxl-job-executor-sample-springboot-2.2.0.jar 为xxl-job的执行器jar包 可从github上拉取源码打包成jar 这里提供该文件csdn下载地址:https://download.csdn.

    2024年02月14日
    浏览(41)
  • 【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目

                                    💧 分布式任务调度平台 X X L − J O B 急速入门:从零开始将 X X L − J O B 接入到自己的项目 color{#FF1493}{分布式任务调度平台 XXL-JOB 急速入门:从零开始将 XXL-JOB 接入到自己的项目} 分布式任务调度平台 XX L − J OB 急速入门:从零

    2024年02月14日
    浏览(44)
  • xxl-job架构原理讲解

    调度中心是一个单独的Web服务,主要是用来触发定时任务的执行 它提供了一些页面操作,我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库,所以数据都是存在数据库中的 调度中心也支持集群模式,但是它们所依赖的数据库必须是同一个 所以同一个集群

    2024年02月21日
    浏览(35)
  • xxl-job-架构及原理

    分布式调度框架 服务端 1、根据执行器创建任务, 2、底层通过netty发起调度。 客户端 1、注册到服务端成为执行器 2、注册任务类,任务类需要实现JobHandler这个接口的类 2、接受调度请求,找到对应的bean,并把bean放到线程池(最大200个线程)中执行,不需要等待结果,请求

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包