MDC日志追踪(二)应用场景与demo

目录

一、http接口链路-共享MDC

1、代码

(1)依赖

(2)filter

 (3)MDC util

(4) 业务接口

 (5)启动类

(6)配置

2、测试:

二、多线程-透传traceId

1、引入多线程

2、改进 

(1)TaskDecorator 

(2)在线程池中设置下

(3) 测试

三、event-传递traceId

1、producer

2、监听器 

 3、测试

四、MQ-传递traceId

五、binlog-传递traceId

六、跨服务调用


一、前后端http接口链路-共享MDC

1、代码
(1)依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>log-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/>
    </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--commom-->
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <!--        <finalName>my-service</finalName>-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
(2)filter
package org.example.filter;

import io.micrometer.common.util.StringUtils;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.example.util.TraceUtil;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.UUID;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@Slf4j
public class TraceFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("处理trace开始,优先级最高");
        HttpServletResponse httpServletResponse =  (HttpServletResponse) servletResponse;
        //1、获取traceId
        String traceId = TraceUtil.getTraceId();
        if (StringUtils.isBlank(traceId)) {
            log.warn("traceId为空");
            traceId = UUID.randomUUID().toString().replaceAll("-","");
            //为空,则塞到请求中
            traceId = TraceUtil.generate();
        }
        //2、返回给前端
        log.info("traceId={}",traceId);
        httpServletResponse.setHeader(TraceUtil.TRACE_ID, traceId);
        log.info("处理trace结束");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
package org.example.filter;

import jakarta.servlet.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;


@Order(1)
@Slf4j
@Component
public class OtherFilter implements Filter {


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("其他filter开始");
        log.info("其他filter结束");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
 (3)MDC util
package org.example.util;

import org.slf4j.MDC;

import java.util.UUID;

public class TraceUtil {
    public static final String TRACE_ID = "my-trace-id";

    public static String getTraceId() {
        return MDC.get(TRACE_ID);
    }

    public static String generate() {
        String id = UUID.randomUUID().toString().replaceAll("-","");
        MDC.put(TRACE_ID,id);
        return id;
    }
}
(4) 业务接口
package org.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.service.UserService;
import org.example.util.TraceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RequestMapping("/user")
@RestController
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getById")
    public String getById(Int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值