在微服務架構中,一次請求可能會被多個服務處理,而每個服務又會產生相應的日志,且每個服務也會有多個實體,在這種情況下,如果系統發生例外,沒有 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 依賴如下:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.14.0</version> </dependency> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-webflux</artifactId> <version>8.14.0</version> </dependency> - SpringCloud Gateway 創建 GloablFilter 攔截器,添加 SKywalking TraceId 至回應頭,
@Component public class PutTraceIdIntoResponseHeaderFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String traceId = WebFluxSkyWalkingOperators.continueTracing(exchange, TraceContext::traceId); exchange.getResponse().getHeaders().set("x-trace-id", traceId); return chain.filter(exchange); } }
如此,大功告成,呼叫介面測驗即可~~~
原文地址:http://me.xpzzd.com/posts/add-skywalking-traceId-to-springcloud-gateway-response-header/
參考:https://github.com/apache/skywalking/discussions/10686
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551032.html
標籤:Java
上一篇:一文詳解RocketMQ-Spring的原始碼決議與實戰
下一篇:返回列表
