记录一次TraceId的问题
多服务部署的时候,各个服务通过httpClient进行调用时候,有时候出现问题,需要进行追查。但是如果没有一个标记,就会很迷茫,特别是多个服务来回调用,就无法快速定位问题。这个时候一般是使用MDC的 traceId来追踪。但是由于每个服务的traceId不同,在使用elk进行查询的时候,仍然不能快速定位。于是,决定统一traceId以方便快速定位。
原理:
发起请求经过Nginx的时候,第一次请求时 nginx 会生成X-Request-Id。 服务里面的拦截器会拦截获取,如果request的header头里面带有该X-Request-Id,则会直接读取,如果没有,会重新生成. 在使用mp-util的 MpHttpclient 时候,会将该值放到header头信息里面,以便在请求下个服务时候可以直接获取。从而从上游到下游统一traceId。

具体使用就是:封装http包的header部分,在每个调用方法的header里面添加traceId给下游。每个服务自己定义拦截器,在拦截器里面进行拦截。如果含有traceId就进行输入到日志里面,如果没有,则创建。拦截器
public class InitRequestAuthDataFilter extends OncePerRequestFilter {
// log 追踪ID
private final static String TRACE_KEY = "X-Request-Id";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {
//一、当前登录用户(用于日志输出)
SSOLoginUser loginUser = WebSessionUtil.getCurrentLoginUser();
if(loginUser==null) {
MDC.put("loginUser", "【游客身份】");
}else {
MDC.put("loginUser", "【"+ loginUser.getId() +"-"+ loginUser.getName() +"-"+ loginUser.getLoginName()+"】");
}
//二、用于页面渲染
request.setAttribute("currentLoginUser", loginUser );
//先从param里取,没有的话从header里取,还没有的话再创建
String reqId = request.getParameter("X-Request-Id");
if(reqId==null || "".equals(reqId.trim()) ) {
reqId = request.getHeader("X-Request-Id");
}
if(reqId==null || "".equals(reqId.trim()) ) {
reqId = UUID.randomUUID().toString().replace("-", "");
}
MDC.put(TRACE_KEY, reqId);
//该traceId是让日志打印出来的key值
MDC.put("traceId",reqId);
/**防止MDC 多次生成,引入的sq-component-log 有拦截 header 头信息**/
logger.info("header:" + request.getHeader("X-Request-Id"));
filterChain.doFilter(request, response);
MDC.remove(TRACE_KEY);
}
}
之后再日子里面进行验证


没问题后,再通过elk进行查询时候就方便多了:

记录一次TraceId的问题的更多相关文章
- springboot(五)读写分离,多个读库,Druid监控--待整理
1.修改mybatis.properties # 主数据源,默认的 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.d ...
- elasticsearch 复杂查询小记
以下接口调用都基于5.5版本 JSON 文档格式 { "_index": "zipkin-2017-09-06", "_type": &qu ...
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...
- spring Cloud网关之Spring Cloud Gateway
Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...
- SpringCloud微服务项目实战 - API网关Gateway详解实现
前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...
- ASP.NET Core整合Zipkin链路跟踪
前言 在日常使用ASP.NET Core的开发或学习中,如果有需要使用链路跟踪系统,大多数情况下会优先选择SkyAPM.我们之前也说过SkyAPM设计确实比较优秀,巧妙的利用Diagnosti ...
- Springcloud之gateway配置及swagger集成
前言 关于引入gateway的好处我网上找了下: 性能:API高可用,负载均衡,容错机制. 安全:权限身份认证.脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制). 日志:日志记 ...
- Spring Cloud Gateway应用篇(十三)
一.概述 在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成.其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能. ...
随机推荐
- Appium中wait_activity的使用以及XPATH定位
# -*- coding:utf-8 -*- from appium import webdriver from time import sleep desired_caps ={ 'platform ...
- 【PHP】系统部署
1.MySql数据库,单独创建用户和数据库 使用MySql-Front导入,避免使用Navicat导入 2.httpd-vhosts.conf配置 文件位于:D:\Xampp\apache\conf\ ...
- 2018南京区域赛G题 Pyramid——找规律&&递推
先手动推出前10项,再上BM板子求出递推式 $A_n = 5A_{n-1} - 10A_{n-2} + 10A_{n-3} - 5A_{n-4} + A_{n-5}$,根据特征根理论可求出特征方程 $ ...
- python --装饰器内容讲解
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能. 3.1 定义装饰器 ...
- JS实现继承的几种方法
父类: // 定义一个动物的类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = fu ...
- HOL的多表查询——内连接、外连接
1.内连接: 由于学生和班级是多对一的关系,班级对应学生是一对多的关系,因此,需要先对学生和班级进行配置. (1)创建Student类(多的一方): package pers.zhb.domain; ...
- 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2016 选座( ticket_chooser )
选座( ticket_chooser ) 不会正解,欢迎讨论 //60分 #include<cstdio> #define max(a,b) (a)>(b)?a:b #define ...
- test软件工程第三次作业
零.前言 本次作业要求个人编写程序,截止日期2019年9月25日23:00. 请先阅读<构建之法>第一章至第三章的内容,并在下方作业里体现出阅读后的成果.特别是第2章中的效能分析及个人软件 ...
- MyBatis(六):Mybatis Java API编程实现一对多、一对一
最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...
- linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】
本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...