Sleuth(Micrometer)+ZipKin分布式鏈路問(wèn)題小結(jié)
1.Sleuth進(jìn)入維護(hù)模式
替代方案 -> Micrometer Tracing
2.分布式鏈路追蹤概述
2.1 出現(xiàn)背景
在微服務(wù)框架中,一個(gè)由客戶端發(fā)起的請(qǐng)求在后端系統(tǒng)中會(huì)經(jīng)過(guò)多個(gè)不同的服務(wù)節(jié)點(diǎn)調(diào)用來(lái)協(xié)調(diào)產(chǎn)生最后的結(jié)果,每一個(gè)前端請(qǐng)求都會(huì)形成一條復(fù)雜的分布式服務(wù)調(diào)用鏈路,鏈路中的任何一環(huán)出現(xiàn)高延時(shí)或錯(cuò)誤都會(huì)引起整個(gè)請(qǐng)求最后的失敗。
隨著系統(tǒng)的復(fù)雜化,導(dǎo)致微服務(wù)的增多,調(diào)用鏈路的變長(zhǎng)
2.2 要解決的問(wèn)題
在大規(guī)模分布式與微服務(wù)集群下,如何實(shí)時(shí)的觀測(cè)系統(tǒng)的整體調(diào)用鏈路情況、如何快速發(fā)現(xiàn)并定位到問(wèn)題、如何盡可能精確的判斷故障對(duì)系統(tǒng)的影響范圍與影響程度、如何盡可能精確的梳理出服務(wù)之間的依賴關(guān)系,并判斷出服務(wù)之間的依賴關(guān)系是否合理、如何盡可能精確的分析整個(gè)系統(tǒng)調(diào)用鏈路的性能與瓶頸點(diǎn)、如何盡可能精確的分析系統(tǒng)的存儲(chǔ)瓶頸與容量規(guī)劃。
分布式鏈路追蹤技術(shù)要解決的問(wèn)題,分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請(qǐng)求還原成調(diào)用鏈路,進(jìn)行日志記錄,性能監(jiān)控并將一次分布式請(qǐng)求的調(diào)用情況集中展示。比如各個(gè)服務(wù)節(jié)點(diǎn)上的耗時(shí)、請(qǐng)求具體到達(dá)哪臺(tái)機(jī)器上、每個(gè)服務(wù)節(jié)點(diǎn)的請(qǐng)求狀態(tài)等等。
3.新一代Spring Cloud Sleuth:Micrometer
3.1 相關(guān)地址
Spring Cloud Sleuth will not work with Spring Boot 3.x onward. The last major version of Spring Boot that Sleuth will support is 2.x.
GitHub介紹,Spring Clour Sleuth不支持SpringBoot 3.x。
3.2 ZipKin
Micrometer負(fù)責(zé)收集數(shù)據(jù),ZipKin復(fù)雜數(shù)據(jù)的展現(xiàn)。因?yàn)槭占降臄?shù)據(jù)是一個(gè)個(gè)節(jié)點(diǎn),不直觀。
3.3 小總結(jié)
將前端請(qǐng)求到,后端系統(tǒng)響應(yīng)結(jié)果的這個(gè)過(guò)程中,所走過(guò)的分布式節(jié)點(diǎn),進(jìn)行日志記錄和性能監(jiān)控,并進(jìn)行Web展示。
3.4 其他的分布式鏈路追蹤的解決方案
技術(shù) | 說(shuō)明 |
---|---|
Cat | 由大眾點(diǎn)評(píng)開(kāi)源,基于Java開(kāi)發(fā)的實(shí)時(shí)應(yīng)用監(jiān)控平臺(tái),包括實(shí)時(shí)應(yīng)用監(jiān)控,業(yè)務(wù)監(jiān)控。集成方案是通過(guò)代碼埋點(diǎn)的方式來(lái)實(shí)現(xiàn)監(jiān)控,比如:攔截器,過(guò)濾器等。對(duì)代碼的侵入性很大,集成成本較高。風(fēng)險(xiǎn)較大。 |
ZipKin | 由大眾點(diǎn)評(píng)開(kāi)源,基于Java開(kāi)發(fā)的實(shí)時(shí)應(yīng)用監(jiān)控平臺(tái),包括實(shí)時(shí)應(yīng)用監(jiān)控,業(yè)務(wù)監(jiān)控。集成方案是通過(guò)代碼埋點(diǎn)的方式來(lái)實(shí)現(xiàn)監(jiān)控,比如:攔截器,過(guò)濾器等。對(duì)代碼的侵入性很大,集成成本較高。風(fēng)險(xiǎn)較大。 |
Pinpoint | Pinpoint是一款開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈分析,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件,UI功能強(qiáng)大,接入端無(wú)代碼侵入。 |
Skywalking | Skywalking是國(guó)人開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈分析,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件,UI功能較強(qiáng),接入端無(wú)代碼侵入。 |
4.分布式鏈路追蹤原理
一條鏈路通過(guò)Trace Id唯一標(biāo)識(shí),Span標(biāo)識(shí)發(fā)起的請(qǐng)求信息,各span通過(guò)parent id 關(guān)聯(lián)起來(lái)
5.Zipkin
5.1 官網(wǎng)
5.2 概述
Zipkin是一種分布式鏈路跟蹤系統(tǒng)圖形化的工具
,Zipkin 是 Twitter 開(kāi)源的分布式跟蹤系統(tǒng),能夠收集微服務(wù)運(yùn)行過(guò)程中的實(shí)時(shí)調(diào)用鏈路信息,并能夠?qū)?code>這些調(diào)用鏈路信息展示到Web圖形化界面上供開(kāi)發(fā)人員分析,開(kāi)發(fā)人員能夠從ZipKin中分析出調(diào)用鏈路中的性能瓶頸,識(shí)別出存在問(wèn)題的應(yīng)用程序,進(jìn)而定位問(wèn)題和解決問(wèn)題。
5.3 下載地址
https://zipkin.io/pages/quickstart.html
In this section we’ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source.
java 方式,下載的是jar包,直接執(zhí)行就好。
6.案例
6.1 Micrometer和Zipkin分工
Micrometer 采集數(shù)據(jù),Zipkin圖像展示
6.2 總體父工程POM
新增的
<properties> <micrometer-tracing.version>1.2.0</micrometer-tracing.version> <micrometer-observation.version>1.12.0</micrometer-observation.version> <feign-micrometer.version>12.5</feign-micrometer.version> <zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version> </properties> <!--micrometer-tracing-bom導(dǎo)入鏈路追蹤版本中心 1--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bom</artifactId> <version>${micrometer-tracing.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--micrometer-tracing指標(biāo)追蹤 2--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> <version>${micrometer-tracing.version}</version> </dependency> <!--micrometer-tracing-bridge-brave適配zipkin的橋接包 3--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <version>${micrometer-tracing.version}</version> </dependency> <!--micrometer-observation 4--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-observation</artifactId> <version>${micrometer-observation.version}</version> </dependency> <!--feign-micrometer 5--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> <version>${feign-micrometer.version}</version> </dependency> <!--zipkin-reporter-brave 6--> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> <version>${zipkin-reporter-brave.version}</version> </dependency>
由于Micrometer Tracing是一個(gè)門面工具自身并沒(méi)有實(shí)現(xiàn)完整的鏈路追蹤系統(tǒng),具體的鏈路追蹤另外需要引入的是第三方鏈路追蹤系統(tǒng)的依賴。
引入組件說(shuō)明
micrometer-tracing-bom
:導(dǎo)入鏈路追蹤版本中心,體系化說(shuō)明
micrometer-tracing
:指標(biāo)追蹤
micrometer-tracing-bridge-brave
:一個(gè)Micrometer模塊,用于與分布式跟蹤工具 Brave 集成,以收集應(yīng)用程序的分布式跟蹤數(shù)據(jù)。Brave是一個(gè)開(kāi)源的分布式跟蹤工具,它可以幫助用戶在分布式系統(tǒng)中跟蹤請(qǐng)求的流轉(zhuǎn),它使用一種稱為"跟蹤上下文"的機(jī)制,將請(qǐng)求的跟蹤信息存儲(chǔ)在請(qǐng)求的頭部,然后將請(qǐng)求傳遞給下一個(gè)服務(wù)。在整個(gè)請(qǐng)求鏈中,Brave會(huì)將每個(gè)服務(wù)處理請(qǐng)求的時(shí)間和其他信息存儲(chǔ)到跟蹤數(shù)據(jù)中,以便用戶可以了解整個(gè)請(qǐng)求的路徑和性能。
micrometer-observation
:一個(gè)基于度量庫(kù) Micrometer的觀測(cè)模塊,用于收集應(yīng)用程序的度量數(shù)據(jù)。
feign-micrometer
:一個(gè)Feign HTTP客戶端的Micrometer模塊,用于收集客戶端請(qǐng)求的度量數(shù)據(jù)。
zipkin-reporter-brave
:一個(gè)用于將 Brave 跟蹤數(shù)據(jù)報(bào)告到Zipkin 跟蹤系統(tǒng)的庫(kù)。
補(bǔ)充包:spring-boot-starter-actuator SpringBoot框架的一個(gè)模塊用于監(jiān)視和管理應(yīng)用程序。
6.3 服務(wù)提供者8001修改
6.3.1 pom修改
micrometer-tracing-bom不用引入
<!--micrometer-tracing指標(biāo)追蹤 1--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <!--micrometer-tracing-bridge-brave適配zipkin的橋接包 2--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <!--micrometer-observation 3--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-observation</artifactId> </dependency> <!--feign-micrometer 4--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> </dependency> <!--zipkin-reporter-brave 5--> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
6.3.2 YML修改
# ========================zipkin=================== management: zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans tracing: sampling: probability: 1.0 #采樣率默認(rèn)為0.1(0.1就是10次只能有一次被記錄下來(lái)),值越大收集越及時(shí)。
6.3.3 新建PayMicrometerController
import cn.hutool.core.util.IdUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; public class PayMicrometerController { /** * Micrometer(Sleuth)進(jìn)行鏈路監(jiān)控的例子 * @param id * @return */ @GetMapping(value = "/pay/micrometer/{id}") public String myMicrometer(@PathVariable("id") Integer id) { return "Hello, 歡迎到來(lái)myMicrometer inputId: "+id+" \t 服務(wù)返回:" + IdUtil.simpleUUID(); } }
6.4 API接口PayFeignApi修改
@GetMapping(value = "/pay/micrometer/{id}") String myMicrometer(@PathVariable("id") Integer id);
6.5 服務(wù)調(diào)用者80修改
6.5.1 POM
<!--micrometer-tracing指標(biāo)追蹤 1--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <!--micrometer-tracing-bridge-brave適配zipkin的橋接包 2--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <!--micrometer-observation 3--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-observation</artifactId> </dependency> <!--feign-micrometer 4--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> </dependency> <!--zipkin-reporter-brave 5--> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
6.5.2 YML修改
# zipkin圖形展現(xiàn)地址和采樣率設(shè)置 management: zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans tracing: sampling: probability: 1.0 #采樣率默認(rèn)為0.1(0.1就是10次只能有一次被記錄下來(lái)),值越大收集越及時(shí)。
6.5.3 業(yè)務(wù)類修改
import com.atguigu.cloud.apis.PayFeignApi; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class OrderMicrometerController { @Resource private PayFeignApi payFeignApi; @GetMapping(value = "/feign/micrometer/{id}") public String myMicrometer(@PathVariable("id") Integer id) { return payFeignApi.myMicrometer(id); } }
7.測(cè)試
訪問(wèn) localhost:x/feign/micrometer/1,會(huì)看到
{"code":"500","message":"No fallback available.","data":null,"timestamp":1729692505995}
進(jìn)入http://localhost:9411/
可以看到依賴關(guān)系,以及執(zhí)行時(shí)間等
從本章節(jié),也可以看出來(lái),約定大于配置的思想體現(xiàn),事先配置好各組件的版本信息,事半功倍。
到此這篇關(guān)于Sleuth(Micrometer)+ZipKin分布式鏈路追逐的文章就介紹到這了,更多相關(guān)Sleuth ZipKin分布式鏈路內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?集成Redisson實(shí)現(xiàn)分布式鎖詳細(xì)案例
這篇文章主要介紹了Spring?Boot?集成Redisson實(shí)現(xiàn)分布式鎖詳細(xì)案例,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08使用JAVA+Maven+TestNG框架實(shí)現(xiàn)超詳細(xì)Appium測(cè)試安卓真機(jī)教程
這篇文章主要介紹了使用JAVA+Maven+TestNG框架實(shí)現(xiàn)超詳細(xì)Appium測(cè)試安卓真機(jī)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01基于Spring + Spring MVC + Mybatis 高性能web構(gòu)建實(shí)例詳解
這篇文章主要介紹了基于Spring + Spring MVC + Mybatis 高性能web構(gòu)建實(shí)例詳解,需要的朋友可以參考下2017-04-04SpringBoot2使用JTA組件實(shí)現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測(cè)好用)
這篇文章主要介紹了SpringBoot2使用JTA組件實(shí)現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測(cè)好用),在Spring?Boot?2.x中,整合了這兩個(gè)JTA的實(shí)現(xiàn)分別是Atomikos和Bitronix,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Java消息摘要算法MAC實(shí)現(xiàn)與應(yīng)用完整示例
這篇文章主要介紹了Java消息摘要算法MAC實(shí)現(xiàn)與應(yīng)用,結(jié)合完整實(shí)例形式分析了java消息摘要算法MAC的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09SSH框架網(wǎng)上商城項(xiàng)目第24戰(zhàn)之Struts2中處理多個(gè)Model請(qǐng)求的方法
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第24戰(zhàn)之Struts2中處理多個(gè)Model請(qǐng)求的方法,感興趣的小伙伴們可以參考一下2016-06-06Java游戲開(kāi)發(fā)拼圖游戲經(jīng)典版
這篇文章主要介紹了Java游戲開(kāi)發(fā)拼圖游戲經(jīng)典版,對(duì)這方面感興趣的同學(xué)可以跟著教程試下2021-01-01