十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容介紹了“Dubbo日志鏈路追蹤TraceId怎么選型”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、霍林郭勒ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的霍林郭勒網(wǎng)站制作公司
開(kāi)發(fā)排查系統(tǒng)問(wèn)題用得最多的手段就是查看系統(tǒng)日志,但是在分布式環(huán)境下使用日志定位問(wèn)題還是比較麻煩,需要借助 全鏈路追蹤ID 把上下文串聯(lián)起來(lái),本文主要分享基于 Spring Boot + Dubbo 框架下 日志鏈路追蹤ID 的實(shí)現(xiàn)方案選型思路。

全鏈路追蹤的核心思想:
為每條請(qǐng)求都單獨(dú)分配一個(gè)唯一的 traceId 用來(lái)標(biāo)識(shí)一條請(qǐng)求鏈路,該 traceId 會(huì)貫穿整個(gè)請(qǐng)求處理過(guò)程的所有服務(wù)
每個(gè)服務(wù)/線程都擁有自己的 spanId 標(biāo)識(shí),代表請(qǐng)求的其中一段處理步驟
一個(gè)請(qǐng)求包含一個(gè) traceId 和一個(gè)或多個(gè) spanId
日志全鏈路追蹤就是在每條系統(tǒng)日志里都添加顯示
traceId和spanId信息

這是 SkyWalking 的一個(gè)日志插件,通過(guò)這個(gè)插件可以在日志中輸出 traceId
配置依賴,在 pom 文件中添加以下內(nèi)容
org.apache.skywalking apm-toolkit-logback-1.x 8.1.0
配置日志模板,修改 logback-spring.xml 文件中 Appender 元素的 encoder 為以下內(nèi)容
%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{35} - %msg%n
ps:pattern 中的內(nèi)容按需修改,其中的 %tid 就是相當(dāng)于 traceId,默認(rèn) TID:N/A,當(dāng)有請(qǐng)求調(diào)用時(shí)會(huì)生成并顯示 traceId
優(yōu)點(diǎn):無(wú)需編碼,業(yè)務(wù)無(wú)入侵,可與 SkyWalking 的圖形化界面中使用該ID快速定位各種接口的調(diào)用關(guān)系。
缺點(diǎn):強(qiáng)耦合 SkyWalking 才能生效
必須添加sk的 javaagent
必須部署 SkyWalking 服務(wù)端
Sleuth 是 Spring Cloud 的組件之一,它為 Spring Cloud 實(shí)現(xiàn)了一種分布式追蹤解決方案,兼容Zipkin,HTrace與其他日志追蹤系統(tǒng)
配置父依賴,在 pom 文件中添加以下內(nèi)容管理版本號(hào)
org.springframework.cloud spring-cloud-sleuth 2.2.4.RELEASE pom import
配置依賴,在 pom 文件中添加以下內(nèi)容
org.springframework.cloud spring-cloud-starter-sleuth
適配dubbo,要讓 sleuth 支持 dubbo 框架,需要增加以下兩個(gè)步驟:
首先添加 dubbo 的插件依賴
io.zipkin.brave brave-instrumentation-dubbo-rpc 5.12.6
配置 dubbo 過(guò)濾器
dubbo: provider: filter: tracing consumer: filter: tracing
配置日志模板,修改 logback-spring.xml 文件中 Appender 元素的 encoder 為以下內(nèi)容
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{X-B3-TraceId},%X{X-B3-SpanId}] [%thread] %-5level %logger{35} - %msg%n utf-8
ps:pattern 中的內(nèi)容按需修改,其中的 %X{X-B3-TraceId} 為 traceId,%X{X-B3-SpanId} 為 spanId
優(yōu)點(diǎn):業(yè)務(wù)無(wú)入侵,有豐富的插件進(jìn)行擴(kuò)展包括定時(shí)任務(wù)、MQ等。
缺點(diǎn):brave-instrumentation-dubbo-rpc 不支持 dubbo 2.7.x 需要自行開(kāi)發(fā)插件。
使用 Logback 的 MDC 機(jī)制,在日志模板中加入 traceId 標(biāo)識(shí),取值方式為 %X{traceId}
系統(tǒng)入口(api網(wǎng)關(guān))創(chuàng)建 traceId 的值
使用 MDC 保存 traceId
修改 logback 配置文件模板格式添加標(biāo)識(shí) %X{traceId}
MDC(Mapped Diagnostic Context,映射調(diào)試上下文)是 log4j 和 logback 提供的一種方便在多線程條件下記錄日志的功能。
解決 traceId 跨線程丟失問(wèn)題

由于 MDC 內(nèi)部使用的是 ThreadLocal 所以只有本線程才有效,子線程和下游的服務(wù) MDC 里的值會(huì)丟失;
需要解決 Spring 的各種線程池與異步方法的父子線程間傳遞。
解決思路:重寫(xiě)一個(gè) MDCAdapter 使用阿里的 TransmittableThreadLocal 替換原來(lái)的 ThreadLocal 對(duì)象,解決各種線程池(ExecutorService / ForkJoinPool / TimerTask)父子進(jìn)程傳值問(wèn)題。
需要使用
TtlRunnable和TtlCallable來(lái)修飾傳入線程池的Runnable和Callable
解決 traceId 跨進(jìn)程丟失問(wèn)題
dubbo服務(wù)使用 org.apache.dubbo.rpc.Filter 創(chuàng)建一個(gè)過(guò)濾器進(jìn)行 traceId 傳遞
服務(wù)消費(fèi)者:負(fù)責(zé)傳遞鏈路追蹤 ID
服務(wù)提供者:負(fù)責(zé)接收 ID 并保存到 MDC 中
優(yōu)點(diǎn):業(yè)務(wù)無(wú)入侵,最小依賴,擴(kuò)展靈活,適配性強(qiáng)。
缺點(diǎn):需要自行實(shí)現(xiàn),有大量的開(kāi)發(fā)工作量。
| 方案 | 開(kāi)發(fā)工作量 | 可維護(hù)性 | 入侵性 | 性能 |
|---|---|---|---|---|
| apm-toolkit | 無(wú) | 低 | 業(yè)務(wù)無(wú)入侵 | 中 |
| sleuth | 中 | 中 | 業(yè)務(wù)無(wú)入侵 | 中 |
| 自研 | 高 | 高 | 業(yè)務(wù)無(wú)入侵 | 高 |
“Dubbo日志鏈路追蹤TraceId怎么選型”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!