在微服務架構中,一次請求可能會被多個服務處理,而每個服務又會產生相應的日誌,且每個服務也會有多個實例。在這種情況下,如果系統發生異常,沒有 Trace ID,那麼在進行日誌分析和追蹤時就會非常困難,因為我們無法將所有相關的日誌信息串聯起來。 如果將 Trace ID 添加到響應頭中,那麼在進行日誌分 ...
在微服務架構中,一次請求可能會被多個服務處理,而每個服務又會產生相應的日誌,且每個服務也會有多個實例。在這種情況下,如果系統發生異常,沒有 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