国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析

這篇具有很好參考價值的文章主要介紹了dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題場景

筆者之前一直使用SpringCloud Alibaba + dubbo2 + nacos1.4進行開發(fā),但是目前naocs2、dubbo3也已經推出有一段時間并逐漸達到生產環(huán)境可用狀態(tài),所以筆者也希望用最新版本的nacos2及dubbo3嘗嘗鮮。但在搭建框架的過程中遇到了鏈路追蹤的問題,所以在這里詳細記錄一下。

SpringCloud Alibaba + dubbo2 + nacos1

筆者基于dubbo2和nacos1的框架的依賴版本如下(這里只展示鏈路追蹤相關依賴):

SpringCloud Alibaba 2.2.5.RELEASE
Springboot 2.3.7.RELEASE
Dubbo 2.7.8 
Nacos 1.4.3
spring-cloud-starter-sleuth 3.0.0
brave-instrumentation-dubbo 5.13.7

基于dubbo2和nacos1,該依賴版本網上都有較為成熟的搭建方案。直接引入依賴,按照度娘上的配置一下yml文件,就能實現(xiàn)鏈路追蹤,配置過程不太困難。這里就不詳細介紹了。

SpringCloud Alibaba + dubbo3 + nacos2

在搭建基于dubbo3和nacos2的框架時也希望能實現(xiàn)鏈路追蹤。其中方案一和方案二是目前Dubbo3官方手冊列舉的實現(xiàn)方案。
方案一:Skywalking
聽說是最簡單的,但因為要額外部署Skywalking,所以我暫未嘗試這種方案。
方案二:OpenTelemetry或brave
我根據(jù)dubbo3的文檔進行依賴的引入和yml文件的配置,但是發(fā)現(xiàn)服務提供者日志正常寫入了traceId和spanId,但服務消費者無論traceId還是spanId都沒寫入,這個在dubbo的GitHub issue中也未有人提問,所以最終也沒找到解決方案。
方案三:sleuth+brave
我嘗試了沿用SpringCloud Alibaba + dubbo2 + nacos1框架時的sleuth+brave方案實現(xiàn)鏈路追蹤,但我引入sleuth+brave并根據(jù)SpringCloud Alibaba + dubbo2 + nacos1框架時的yml文件配置后,發(fā)現(xiàn)雖然服務消費者和服務提供者的日志都寫入了traceId和spanId但兩個服務的traceId不一致,變成各寫各的了,整個追蹤鏈條并未正確串聯(lián)起來。 最終通過查找GitHub上的issue終于找到一個brave的dubbo2擴展能兼容dubbo3的解決方案,在這里感謝@ShenFeng312這位大佬。
GitHub issue的comment鏈接如下:
https://github.com/apache/dubbo/issues/11650#issuecomment-1446313706

解決方案

筆者用的依賴版本如下:

SpringCloud Alibaba 2021.0.5.0
Springboot 2.7.8
Dubbo 3.2.4 
Nacos 2.2.0
spring-cloud-starter-sleuth 3.1.9
brave-instrumentation-dubbo 5.16.0

解決方案非常簡單,只需修改一行源碼即可。
修改brave.dubbo.TracingFilter#invoke中的RpcContext.getContext().getAttachments()改為invocation.getAttachments()
修改前:
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
修改后:
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
PS: 因為是要修改依賴的源碼,所以各位讀者可以復制該類、修改這行、增加Dubbo的SPI來指向自定義的TracingFilter。又或者自行重新打包jar。這里就不詳細敘述了。

原因

根據(jù)GitHub上https://github.com/apache/dubbo/issues/11650#issuecomment-1446313706中@ShenFeng312大佬的分析,主要是因為dubbo2和dubbo3的RpcContext中invcation的attachment屬性的實現(xiàn)方式改變了導致的。從issue的回復中其實也看到@ShenFeng312大佬也向brave提交了merge request,讓brave-instrumentation-dubbo能兼容dubbo3,但是brave的開發(fā)人員一直未同意合并,這里就不展開說了,大家有興趣可以自行去GitHub上看看。

疑問

根據(jù)知其然,也要知其所以然的想法,我嘗試分析其中的原因,但也產生了一些疑問,以下疑問也會在后續(xù)的排查過程中逐一解答。

疑問一:dubbo2中為什么直接用RpcContext.getContext().getAttachments()就能傳遞traceId而不用invocation.getAttachments()呢?
疑問二:為什么dubbo3中brave.dubbo.TracingFilter繼續(xù)用RpcContext.getContext().getAttachments()是不行的呢?
疑問三:dubbo3中的RpcContext.getContext().getAttachments()和invocation.getAttachments()有什么區(qū)別?

排查過程

追蹤brave.dubbo.TracingFilter#invoke方法的try…catch…部分可以看到,最終傳遞到下一個服務的參數(shù)是通過invocation的,而traceId和spanId是保存在invocation的attachment這個map中的。所以我們接下來排查的目標都是檢查并驗證最終invoke時invocation的attachment中有沒有traceId和spanId為準。
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud

排查疑問一:

dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
根據(jù)上述思路及brave.dubbo.TracingFilter#invoke方法中的注釋得知,其實clientHandler.handleSendWithParent(clientRequest, invocationContext)一直都只是在操作RpcContext.getContext()的attachment并未操作invocation中的attachment
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
而invocation中的attachment其實是直到invoker.invoke(invocation)時才在org.apache.dubbo.rpc.protocol.AbstractInvoker#invoke方法把RpcContext.getContext()的attachment注入到invocation中的attachment中
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
所以通過上面的代碼跟蹤可以發(fā)現(xiàn),dubbo2中雖然一直都是在操作RpcContext.getContext()的attachment,但會在AbstractInvoker#invoke方法中invoke下一個服務的前一刻把RpcCotext.getContext()的attachment注入到invocation中的attachment中,最終還是通過invocation中的attachment傳遞traceId給下一個服務的。
綜上所述,在dubbo2中通過RpcContext.getContext().getAttachments()來操作RpcContext的attachment最終都會在AbstractInvoker#invoke方法里被注入到invocation中的attachment中,所以dubbo2中是可以通過RpcContext.getContext().getAttachments()來傳遞traceId的

排查疑問二、三:

追蹤dubbo3中的RpcContext.getContext().getAttachments():
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
比對dubbo2中的RpcContext.getContext().getAttachments():
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
通過比較dubbo3和dubbo2的RpcContext.getContext().getAttachments()的實現(xiàn),可以發(fā)現(xiàn),dubbo3實現(xiàn)方式完全不同了,這個改動在dubbo3的官方手冊中其實是有提及的
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
正是因為RpcContext.getContext().getAttachments()的實現(xiàn)改動,dubbo3中RpcContext.getContext().getAttachments()返回的不是RpcContext中的attachment也不是invocation中的attachment。而是把RpcContext中的SERVER_ATTACHMENT、CLIENT_ATTACHMENT復制一份并返回。后面再怎么put參數(shù)進RpcContext中的attachment都沒有用了,即使后面在AbstractInvoker#invoke方法中把RpcContext中的attachment注入進invocation的attachment也沒用了,因為put參數(shù)的時候是put進RpcContext的attachment的副本,而不是RpcContext中的attachment本身
而且! 本身dubbo3中AbstractInvoker#invoke方法中把RpcContext中的attachment注入invocation的attachment的實現(xiàn)也變了
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
不過這里已經不重要了,因為put參數(shù)的時候是put進RpcContext中的attachment的副本,并未put進RpcContext的任何屬性中。
綜上所述,通過上述對源碼的分析也解釋了疑問二疑問三,解釋了dubbo3中的RpcContext.getContext().getAttachments()和invocation.getAttachments()有什么區(qū)別和為什么dubbo3中brave.dubbo.TracingFilter繼續(xù)用RpcContext.getContext().getAttachments()是不行的。

總結分析

總的來說,主要是dubbo3的RpcContext被拆分為四大模塊才導致brave的dubbo擴展不能直接用,但是其實改動起來還是比較簡單的。上述如果有說的不對的地方,還請各位大佬指正。下面筆者還畫了一張圖來幫助理解:
dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析,dubbo,spring cloud
最后,版權歸作者所有,任何形式轉載請聯(lián)系作者,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-684328.html

到了這里,關于dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應的原因分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【分布式鏈路追蹤技術】sleuth+zipkin

    【分布式鏈路追蹤技術】sleuth+zipkin

    目錄 1.概述 2.搭建演示工程 3.sleuth 4.zipkin 5.插拔式存儲 5.1.存儲到MySQL中 5.2.用MQ來流量削峰 6.聯(lián)系作者 當采用分布式架構后,一次請求會在多個服務之間流轉,組成單次調用鏈的服務往往都分散在不同的服務器上。這就會帶來一個問題: 故障難以溯源。 發(fā)起請求,然后請求

    2024年02月04日
    瀏覽(25)
  • 分布式鏈路追蹤專欄,Spring Cloud Sleuth:分布式鏈路追蹤之通信模型設計

    分布式鏈路追蹤專欄,Spring Cloud Sleuth:分布式鏈路追蹤之通信模型設計

    Spring Cloud Sleuth ?賦予分布式跟蹤的 ?Spring Boot? 自動配置的一鍵解決方案。 Spring Cloud Sleuth? 是基于 ?Brave? 的封裝,也是很多公司采用開源加自研的最佳解決方案。 那么從作為架構師或者技術專家如何去借鑒優(yōu)秀框架的設計理念和思想,本次? Chat? 將開啟作者既分布式鏈路

    2024年01月19日
    瀏覽(27)
  • day09-SpringCloud Sleuth+Zipkin-鏈路追蹤

    官網:spring-cloud/spring-cloud-sleuth: Distributed tracing for spring cloud (github.com) 分布式鏈路追蹤之Spring Cloud Sleuth+Zipkin最全教程! - bucaichenmou - 博客園 (cnblogs.com) 在微服務框架中,一個由客戶端發(fā)起的請求在后端系統(tǒng)中會經過多個不同的的服務節(jié)點調用,來協(xié)同產生最后的請求結果,

    2024年02月08日
    瀏覽(27)
  • 微服務sleuth+zipkin---鏈路追蹤+nacos配置中心

    微服務sleuth+zipkin---鏈路追蹤+nacos配置中心

    目錄 1.分布式鏈路追蹤 1.1.鏈路追蹤Sleuth介紹 1.2.如何完成sleuth 1.3.zipkin服務器 2.配置中心 2.1.常見配置中心組件 2.2.微服務集群共享一個配置文件 2.2.1實時刷新--配置中心數(shù)據(jù) 2.2.2.手動寫一個實時刷新的配置類 ----刷新配置文件 2.3.多個微服務公用一個配置 繼?微服務Gateway網關

    2024年02月17日
    瀏覽(16)
  • 十六、Spring Cloud Sleuth 分布式請求鏈路追蹤

    十六、Spring Cloud Sleuth 分布式請求鏈路追蹤

    1、為什么出出現(xiàn)這個技術?需要解決哪些問題 2、是什么? 官網: https://github.com/spring-cloud/spring-cloud-sleuth spring-cloud-sleuth 提供了一套完整的分布式鏈路追蹤的解決方案 ,并且兼容支持了 zipkin (展現(xiàn)) 3、解決 1、下載運行zipkin 下載jar包到本地 https://repo1.maven.org/maven2/io/zipkin/

    2024年02月12日
    瀏覽(26)
  • 商城-學習整理-高級-商城業(yè)務-Sentinel&限流&熔斷&降級&Sleuth+Zipkin鏈路追蹤(二十二)

    商城-學習整理-高級-商城業(yè)務-Sentinel&限流&熔斷&降級&Sleuth+Zipkin鏈路追蹤(二十二)

    什么是熔斷 A 服務調用 B 服務的某個功能,由于網絡不穩(wěn)定問題,或者 B 服務卡機,導致功能時間超長。如果這樣子的次數(shù)太多。我們就可以直接將 B 斷路了(A 不再請求 B 接口),凡是調用 B 的直接返回降級數(shù)據(jù),不必等待 B 的超長執(zhí)行。 這樣 B 的故障問題,就不會級聯(lián)影

    2024年02月11日
    瀏覽(27)
  • Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及與各中間件集成
Sleuth+Zipkin集成分布式鏈路追蹤

    Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及與各中間件集成 Sleuth+Zipkin集成分布式鏈路追蹤

    目錄 前言 源碼地址 官方中文文檔 使用版本 spring Spring Boot 3.1.0 中間件 使用到的組件與功能 環(huán)境安裝 虛擬機 nexus nacos 集成過程 工程搭建 父工程搭建 子工程 服務集成 nacos集成 配置文件 服務注冊與發(fā)現(xiàn)-discovery 服務注冊 啟動 服務發(fā)現(xiàn) 測試 配置管理-config 新增配置 ?測試

    2024年02月12日
    瀏覽(57)
  • 【Dubbo3云原生微服務開發(fā)實戰(zhàn)】「Dubbo前奏導學」 RPC服務的底層原理和實現(xiàn)

    【Dubbo3云原生微服務開發(fā)實戰(zhàn)】「Dubbo前奏導學」 RPC服務的底層原理和實現(xiàn)

    Dubbo是一款高效而強大的RPC服務框架,它旨在解決微服務架構下的服務監(jiān)控和通信問題。該框架提供了Java、Golang等多語言的SDK,使得使用者可以輕松構建和開發(fā)微服務。Dubbo具備遠程地址發(fā)現(xiàn)和通信能力,可通過Dubbo獨有的身臨其境的服務治理特驗為主導,以提高開發(fā)人員的功

    2024年02月05日
    瀏覽(21)
  • Springboot3.X整合Dubbo3.XSpringCloudAlibaba微服務 2022.0 + Springboot3.X 集成 Dubbo實現(xiàn)對外調用http內部調用RPC

    近期自己新開了一套SpringCloud Alibaba微服務項目,接口使用了對外HTTP,內部RPC的設計,具體點說就是外部用戶或客戶端通過Nginx訪問到Gateway網關再分發(fā)到各個服務,內部各個服務之間統(tǒng)一使用Dubbo RPC進行通信。下面是Springboot3.x集成Dubbo的分享: 1. 需要的關鍵依賴 2. 啟動程序入

    2024年02月15日
    瀏覽(25)
  • Spring boot結合SkyWalking-Trace工具類實現(xiàn)日志打印請求鏈路traceid

    Spring boot結合SkyWalking-Trace工具類實現(xiàn)日志打印請求鏈路traceid

    隨著業(yè)務的復雜化、解耦化,運維人員和開發(fā)人員需要對請求鏈路跟蹤來快速發(fā)現(xiàn)和定位問題,基于應用已經集成了SkyWalking的前提下,如何通過獲取SkyWalking生成的統(tǒng)一traceId并加入打印日志中,方便開發(fā)人員能夠根據(jù)鏈路ID快速搜索單個請求的全鏈路日志呢? trace-id的生成:

    2024年02月15日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包