当前位置: 首页 > 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://www.xdnf.cn/news/223831.html

相关文章:

  • PageOffice在线打开word文件,并实现切换文件
  • Microsoft 365 Copilot应用4月重大更新:正式支持个人版,开启AI办公新时代!
  • LeetCode LCP40 心算挑战题解
  • 西门子PLC S7-1200 电动机的软启动控制
  • 自定义Tool
  • 【网工第6版】第6章 网络安全③
  • Fiori学习专题二十五:Remote OData Service
  • 基于CATIA参数化球体建模的自动化插件开发实践——NX建模之球体命令的参考与移植
  • Transformer-CVPR2025-线性注意力-Breaking the Low-Rank Dilemma of Linear Attention
  • 【AI】DeepSeek 流程图 / 时序图制作,Word 排版错乱问题,文字转直观图形
  • 机器学习-07-分类评估函数进阶案例
  • 【数学建模国奖速成系列】优秀论文绘图复现代码(四)
  • Access开发:轻松一键将 Access 全库表格导出为 Excel
  • 游戏引擎学习第250天:# 清理DEBUG GUID
  • 栈与队列 Part 7
  • String、StringBuffer、StringBuilder 的区别
  • SpringMVC知识点总结(速查速记)
  • SIFT特征点检测
  • 产品经理.产品设计.产品设计工具
  • 什么是美颜SDK?美颜SDK安卓与iOS端开发指南
  • 【11408学习记录】英语书信通知写作模板大全:5个高分句式+使用场景解析,速存每日一句拆解练习!
  • 组网技术知识点
  • electron+vite+vue3 快速入门教程
  • C++23 std::invoke_r:调用可调用 (Callable) 对象 (P2136R3)
  • Postgresql源码(144)LockRelease常规锁释放流程分析
  • Linux -- SysremV 共享内存通信
  • 环形链表的约瑟夫问题
  • 从生成到上线:飞算JavaAl工程化能力拆解(含K8s部署脚本自动生成)
  • STM32printf重定向到串口含armcc和gcc两种方案
  • 高并发内存池(五):性能测试与性能优化