多服务部署的时候,各个服务通过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的问题的更多相关文章

  1. springboot(五)读写分离,多个读库,Druid监控--待整理

    1.修改mybatis.properties # 主数据源,默认的 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.d ...

  2. elasticsearch 复杂查询小记

    以下接口调用都基于5.5版本 JSON 文档格式 { "_index": "zipkin-2017-09-06", "_type": &qu ...

  3. 微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

  4. Asp.Net Core2.2 源码阅读系列——控制台日志源码解析

      为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...

  5. spring Cloud网关之Spring Cloud Gateway

    Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...

  6. SpringCloud微服务项目实战 - API网关Gateway详解实现

    前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...

  7. ASP.NET Core整合Zipkin链路跟踪

    前言     在日常使用ASP.NET Core的开发或学习中,如果有需要使用链路跟踪系统,大多数情况下会优先选择SkyAPM.我们之前也说过SkyAPM设计确实比较优秀,巧妙的利用Diagnosti ...

  8. Springcloud之gateway配置及swagger集成

    前言 关于引入gateway的好处我网上找了下: 性能:API高可用,负载均衡,容错机制. 安全:权限身份认证.脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制). 日志:日志记 ...

  9. Spring Cloud Gateway应用篇(十三)

    一.概述 在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成.其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能. ...

随机推荐

  1. 缺jar包异常:java.lang.NoClassDefFoundError: org/springframework/core/convert/support/PropertyTypeDescriptor

    严重: StandardWrapper.Throwable java.lang.NoClassDefFoundError: org/springframework/core/convert/suppo ...

  2. Mybatis框架进行批量导入和删除有三种方式

    首先创建一个数据库 CREATE TABLE user (   id varchar(32) CHARACTER SET utf8 NOT NULL,   name varchar(50) CHARA ...

  3. python应用-解决应用题

       应用题: 30个人出海去玩,船瓦特了,要弄死15个人,其他人才能活下来,围成一圈,报数1,2,3...,谁报到9就弄死谁,以此类推. 直到剩下15个人为止.其中15个人是基督徒,其他15个不是基 ...

  4. sed命令基本用法

    sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑sed 适用于以下三种场合:编辑相对交互式文本编辑器而言太大的文件编辑命令太复杂,在交互式文本编辑器中难以输入的情况对文本扫描一遍,但是 ...

  5. Nginx——跨域造成的504问题

    前言 前台域名和后台域名是两个不同不同的二级域名,访问的时候造成了跨域,出现了504错误 解决 修改Nginx配置,将超时的时间设置为1200秒 keepalive_timeout 1200; pro ...

  6. GeoIP简介与资源,定位经纬度,获取用户IP

    所谓GeoIP,就是通过来访者的IP,定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术不算难题,关键在于有个精准的数据库.有了准确的数据源就奇货可居赚点小钱,可是发扬合作精神,集体贡 ...

  7. js编程思想:模型进化论--JS 的 new 到底是干什么的?

    想象我们在制作一个策略类战争游戏,玩家可以操作一堆士兵攻击敌方. 我们着重来研究一下这个游戏里面的「制造士兵」环节. 一个士兵的在计算机里就是一堆属性,如下图: 一.荒蛮时代:对象是数据的集合 我们只 ...

  8. 重温Elasticsearch

    什么是 Elasticsearch ? Elasticsearch (ES) 是一个基于 Lucene 构建的开源.分布式.RESTful 接口全文搜索引擎.还是一个分布式文档数据库,其中每个字段均是 ...

  9. Saint John Festival Gym - 101128J (凸包二分)

    Problem J: Saint John Festival \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出\(n\)个大点,和\(m\ ...

  10. graphql-compose graphql schema 生成工具集

    graphql-compose 是一个强大的graphql schema 生成工具集 包含以下特性 快速便捷的复杂类型生成 类型仓库,类型可以存储在schemacomposer 存储中 包含flowt ...