当前位置: 首页 > news >正文

分布式链路ID实现

实现原理

api入口或者网关处生成traceId,调用服务时优先检查是否头部带有traceId,有则复用,没有则生成

实现方式

处理api相关traceId

1.通过filter复用或者生成traceId,并且将traceId输入到响应头中

import java.io.IOException;
import java.util.UUID;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;public class TraceIdFilter extends OncePerRequestFilter {public TraceIdFilter() {}protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String traceId = request.getHeader("X-Trace-Id");if (traceId == null) {traceId = this.generateTraceId();}MDC.put("traceId", traceId);response.setHeader("X-Trace-Id", traceId);try {filterChain.doFilter(request, response);} finally {MDC.clear();}}private String generateTraceId() {return UUID.randomUUID().toString().replace("-", "");}
}

 2、在对应项目中启用filter

@Configuration
public class WebFilterConfig {@Beanpublic FilterRegistrationBean<TraceIdFilter> loggingFilter() {FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new TraceIdFilter());registrationBean.addUrlPatterns("/*"); // 只对特定 URL 匹配return registrationBean;}
}

Feign调用时传递traceId

1、声明拦截器(feign调用时从mdc获取traceId放入请求头中)

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.MDC;public class FeIgnMCDInterceptor implements RequestInterceptor {public FeIgnMCDInterceptor() {}public void apply(RequestTemplate template) {String traceId = MDC.get("traceId");if (traceId != null) {template.header("X-Trace-Id", new String[]{traceId});}}
}

2、启用拦截器

// 任意位置注册为springbean即可
@Bean
public FeIgnMCDInterceptor feIgnMCDInterceptor() {return new FeIgnMCDInterceptor();
}

日志配置文件中打印traceId

<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [${application_name}] [%X{traceId}] [%thread] %-5level %logger - [%method,%line] - %msg%n" />


文章转载自:

http://QU3ivRCN.dpqqg.cn
http://vOopn2vu.dpqqg.cn
http://Ti4Hj36b.dpqqg.cn
http://JL33kZWX.dpqqg.cn
http://cwy8qOW1.dpqqg.cn
http://9GOEbwg4.dpqqg.cn
http://UlJkAV05.dpqqg.cn
http://xUbha26p.dpqqg.cn
http://YAARAvMn.dpqqg.cn
http://CKmCCPEb.dpqqg.cn
http://gx83BNYB.dpqqg.cn
http://4mHeTcvJ.dpqqg.cn
http://DX3WKGIy.dpqqg.cn
http://8NM6jviD.dpqqg.cn
http://tuEOmI6x.dpqqg.cn
http://teiM4I8S.dpqqg.cn
http://A4fM1kfz.dpqqg.cn
http://m6tHTXGl.dpqqg.cn
http://ExsnB9II.dpqqg.cn
http://UyrM6Glm.dpqqg.cn
http://tpNPH2en.dpqqg.cn
http://gac94c07.dpqqg.cn
http://qRv9dA2c.dpqqg.cn
http://7ViuQCuR.dpqqg.cn
http://m14Kz6lg.dpqqg.cn
http://4oJMeNAn.dpqqg.cn
http://9ntHHAWB.dpqqg.cn
http://Q3GWM1QZ.dpqqg.cn
http://jqzbu1D4.dpqqg.cn
http://R06DtDvH.dpqqg.cn
http://www.dtcms.com/a/165467.html

相关文章:

  • DeepSeek本地部署及WebUI可视化完全指南
  • 4:QT联合HALCON编程—机器人二次程序抓取开发(九点标定)
  • 鸿蒙ArkUI Inspector配置
  • Mysql数据库高可用解决方案-Mysql Router
  • 什么是美颜SDK?美颜SDK安卓与iOS端开发指南
  • 2025.4.24 JavaScript 基础学习笔记
  • 字体包的基础使用
  • 09 Python字典揭秘:数据的高效存储
  • Spyglass:官方Hands-on Training(一)
  • MyBatis的SQL映射文件中,`#`和`$`符号的区别
  • MCP的基础知识
  • 软件测试52讲学习分享:深入理解单元测试
  • Rust 学习笔记:枚举与模式匹配
  • MiWi|Microchip开发的专有无线通信协议,适用于低功耗、短距离的无线个人局域网【无线通信小百科】
  • 【AI】DeepSeek 流程图 / 时序图制作,Word 排版错乱问题,文字转直观图形
  • 使用通义千问大模型做结构化输出报错的分析
  • Windows 中搭建 browser-use WebUI 1.4
  • GPU集群搭建步骤
  • Dify 获取天气数据并以echarts图表显示
  • 深入解析词嵌入(Word2Vec、GloVe)技术原理:从词语到向量的转变
  • 三个概念:DataBinding,Dependency Property 与DataTemplate
  • MCP与开源社区的共赢之道:携手推动技术创新
  • iOS RunLoop 深入解析
  • ZStack Cloud 5.3.28正式发布
  • macOS 安装了Docker Desktop版终端docker 命令没办法使用
  • 如何选择合适的铸铁地板?在工业行业靠什么优势稳步前进?(北重)
  • PostgreSQL中的SSL(2)
  • 提高程序灵活性和效率的利器:Natasha动态编译库【.Net】
  • React-Native Android 多行被截断
  • layui轮播图根据设备宽度图片等比例,高度自适应