目录
一、前后端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