SpringCloud Gateway 3.x 响应头添加 Skywalking TraceId

瑞星  金牌会员 | 2023-4-24 15:05:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

在微服务架构中,一次请求可能会被多个服务处理,而每个服务又会产生相应的日志,且每个服务也会有多个实例。在这种情况下,如果系统发生异常,没有 Trace ID,那么在进行日志分析和追踪时就会非常困难,因为我们无法将所有相关的日志信息串联起来。
如果将 Trace ID 添加到响应头中,那么在进行日志分析和追踪时,配合日志收集分析平台,我们就可以通过这个 Trace ID 将所有相关的日志信息串联起来,便于分析和定位问题。
那么如何实现呢?微服务架构下 Api 网关是流量的统一出入口,在 Api 网关配置是最合适的,我们使用的 SpringCloud Gateway 作为微服务的应用网关,同时时 Skywalking 作为链路追踪工具。两者版本如下:

  • SpringCloud Gateway 3.1.4
  • Skywalking Agent 8.14.0

  • 下载并解压 Skywalking Agent,并将 Agent 根目录下的 optional-plugins/apm-spring-webflux-5.x-plugin-8.15.0.jar、optional-plugins/apm-spring-cloud-gateway-3.x-plugin-8.15.0.jar 移动至 plugins 目录下。
  • SpringCloud Gateway 添加 pom 依赖如下:
    1. <dependency>
    2.     <groupId>org.apache.skywalking</groupId>
    3.     <artifactId>apm-toolkit-trace</artifactId>
    4.     <version>8.14.0</version>
    5. </dependency>
    6. <dependency>
    7.     <groupId>org.apache.skywalking</groupId>
    8.     <artifactId>apm-toolkit-webflux</artifactId>
    9.     <version>8.14.0</version>
    10. </dependency>
    复制代码
  • SpringCloud Gateway 创建 GloablFilter 拦截器,添加 SKywalking TraceId 至响应头。
    1. @Component
    2. public class PutTraceIdIntoResponseHeaderFilter implements GlobalFilter {
    3.     @Override
    4.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    5.         String traceId = WebFluxSkyWalkingOperators.continueTracing(exchange, TraceContext::traceId);
    6.         exchange.getResponse().getHeaders().set("x-trace-id", traceId);
    7.         return chain.filter(exchange);
    8.     }
    9. }
    复制代码
如此,大功告成,调用接口测试即可~~~
原文地址:http://me.xpzzd.com/posts/add-skywalking-traceId-to-springcloud-gateway-response-header/
参考:https://github.com/apache/skywalking/discussions/10686

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表