Micrometer+ZipKin分布式鏈路追蹤

在這里插入圖片描述

目錄

  • 背景
  • Micrometer
    • Micrometer與ZipKin之間的關系
    • 專業術語
    • 分布式鏈路追蹤原理
  • ZipKin
    • 安裝下載
  • Micrometer+ZipKin 案例演示
  • 相關文獻

背景

一個系統頁面上的按鈕點擊到結果反饋,在微服務框架里,是由N個服務組成返回結果,中間可能經過a->b->c->b->a,或a->b->a->c等等簡單或復雜重復的服務調用,如果調用鏈路某一節點出錯導致服務崩潰,將無法快速定位問題解決。

在大規模分布式與微服務集群下,出現問題時,需要:
1、可實時觀察系統整理調用鏈路情況
2、快速發現并定位問題
3、精準判斷故障對系統的影響范圍和程度
4、梳理服務之間的依賴關系,并判斷依賴關系是否合理是否可優化
5、精準分析調用鏈的性能瓶頸以及容量規劃

以上分布式鏈路追蹤技術可以解決的問題,分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請求還原成調用鏈路,進行日志記錄,性能監控并將一次分布式請求的調用情況集中展示。比如各個服務節點上的耗時、請求具體到達哪臺機器上、每個服務節點的請求狀態等等。

Micrometer

springcloud 對分布式鏈路追蹤提供了支持:Spring Cloud Sleuth 為分布式跟蹤提供 Spring Boot 自動配置,但目前Spring Cloud Sleuth 的最后一個次要版本是 3.1,已停止更新,以后使用推薦 Micrometer Tracing
在這里插入圖片描述

Micrometer與ZipKin之間的關系

可能會有同志們在想,既然有了Micrometer作為鏈路追蹤,那么還要ZipKin干嘛?
在這里插入圖片描述
看以上圖,可理解為,Micrometer作為鏈路追蹤可以采集到整條完整鏈路的所有請求信息,但是以數據方式呈現在日志當中,雖然也可以直接觀看,但想要更客觀統計和分析,仍然有局限性。ZipKin支持接入Micrometer的數據,作為儀表板,可以清晰看見每條鏈路的請求響應數據。
在這里插入圖片描述

專業術語

Span:基本工作單位。例如,發送 RPC 是一個新的跨度,向 RPC 發送響應也是如此。跨度還包含其他數據,例如描述、時間戳事件、鍵值注釋(標記)、導致這些值的跨度的 ID 以及進程 ID(通常為 IP 地址)
Trace:形成樹狀結構的一組跨度。例如,如果運行分布式大數據存儲,則 PUT 跟蹤可能由請求形成。
Annotation/Event:用于及時記錄事件的存在。
Tracer:處理跨度生命周期的庫。它可以通過報告器/導出器創建、啟動、停止和報告跨度到外部系統。
Tracing context:要使分布式跟蹤正常工作,跟蹤上下文(跟蹤標識符、跨度標識符等)必須通過進程(例如通過線程)和網絡傳播。
Log correlation:跟蹤上下文的某些部分(例如跟蹤標識符、跨度標識符)可以填充到給定應用程序的日志中。然后,可以將所有日志收集到單個存儲中,并通過跟蹤 ID 對它們進行分組。這樣,就可以從按時間順序排列的所有服務中獲取單個業務操作(跟蹤)的所有日志。
Latency analysis tools:收集導出的跨度并可視化整個跟蹤的工具。允許輕松分析延遲。

分布式鏈路追蹤原理

在這里插入圖片描述
見上圖,分布式鏈路追蹤是怎么知道服務的上游和下游是誰呢?

那么一條鏈路追蹤會在每個服務調用的時候加上Trace ID(全局唯一id) 和 Span ID(每次請求的id)

鏈路通過TraceId唯一標識,

Span標識發起的請求信息,各span通過parent id 關聯起來 (Span:表示調用鏈路來源,通俗的理解span就是一次請求信息)

在這里插入圖片描述
簡單來說
在這里插入圖片描述

第一個節點:Span ID = A,Parent ID = null,Service 1 接收到請求。

第二個節點:Span ID = B,Parent ID= A,Service 1 發送請求到 Service 2 返回響應給Service 1 的過程。

第三個節點:Span ID = C,Parent ID= B,Service 2 的 中間解決過程。

第四個節點:Span ID = D,Parent ID= C,Service 2 發送請求到 Service 3 返回響應給Service 2 的過程。

第五個節點:Span ID = E,Parent ID= D,Service 3 的中間解決過程。

第六個節點:Span ID = F,Parent ID= C,Service 3 發送請求到 Service 4 返回響應給 Service 3 的過程。

第七個節點:Span ID = G,Parent ID= F,Service 4 的中間解決過程。

通過 Parent ID 就可找到父節點,整個鏈路即可以進行跟蹤追溯了。

ZipKin

Zipkin 是一個分布式跟蹤系統。它有助于收集解決服務架構中的延遲問題所需的計時數據。功能包括此數據的收集和查找。
如果日志文件中有跟蹤 ID,則可以直接跳轉到該 ID。否則,您可以根據服務、操作名稱、標簽和持續時間等屬性進行查詢。將為您總結一些有趣的數據,例如在服務中花費的時間百分比,以及操作是否失敗。
在這里插入圖片描述
Zipkin UI 還顯示一個依賴關系圖,顯示每個應用程序經過的跟蹤請求數。這有助于識別聚合行為,包括錯誤路徑或對已棄用服務的調用。
在這里插入圖片描述

安裝下載

官方支持三種安裝下載:Java、Docker 或從源代碼運行。
java下載:https://zipkin.io/pages/quickstart
在這里插入圖片描述
下載完成后運行jar

java -jar zipkin-server-3.0.0-rc0-exec.jar

在這里插入圖片描述
啟動完成之后訪問http://your_host:9411,成功
在這里插入圖片描述

Micrometer+ZipKin 案例演示

Micrometer+ZipKin兩者各自分工

  • Micrometer:數據采集
  • ZipKin:圖形展示

本案例采用兩個服務模塊演示,a服務提供者、b服務調用者

總父工程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導入鏈路追蹤版本中心  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指標追蹤  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是一個門面工具自身并沒有實現完整的鏈路追蹤系統,具體的鏈路追蹤另外需要引入的是第三方鏈路追蹤系統的依賴:

micrometer-tracing-bom:導入鏈路追蹤版本中心,體系化說明

micrometer-tracing:指標追蹤

micrometer-tracing-bridge-brave:一個Micrometer模塊,用于與分布式跟蹤工具 Brave 集成,以收集應用程序的分布式跟蹤數據。Brave是一個開源的分布式跟蹤工具,它可以幫助用戶在分布式系統中跟蹤請求的流轉,它使用一種稱為"跟蹤上下文"的機制,將請求的跟蹤信息存儲在請求的頭部,然后將請求傳遞給下一個服務。在整個請求鏈中,Brave會將每個服務處理請求的時間和其他信息存儲到跟蹤數據中,以便用戶可以了解整個請求的路徑和性能。

micrometer-observation
一個基于度量庫 Micrometer的觀測模塊,用于收集應用程序的度量數據。

feign-micrometer:一個Feign HTTP客戶端的Micrometer模塊,用于收集客戶端請求的度量數據。

zipkin-reporter-brave:一個用于將 Brave 跟蹤數據報告到Zipkin 跟蹤系統的庫。

補充包:spring-boot-starter-actuator SpringBoot框架的一個模塊用于監視和管理應用程序(服務的健康檢查)

a服務提供方pom依賴引入

<!--micrometer-tracing指標追蹤  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>

yml配置

# ========================zipkin===================
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采樣率默認為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。

編寫接口

/*** Micrometer(Sleuth)進行鏈路監控的例子* @param id* @return*/@GetMapping(value = "/pay/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id);

b服務調用方pom依賴引入

 <!--micrometer-tracing指標追蹤  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>

a、b服務之間的pom引入是一樣的 不需要吧zipkin的依賴引入,因為總父工程的pom里面已經有了,子服務不需要引入。

yml配置

# zipkin圖形展現地址和采樣率設置
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采樣率默認為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。

接口調用

@RestController
@Slf4j
public class OrderMicrometerController
{@Resourceprivate PayFeignApi payFeignApi;@GetMapping(value = "/feign/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return payFeignApi.myMicrometer(id);}
}

服務啟動后,調用接口http://localhost/feign/micrometer/1

打開網址http://your_host:9411,看到對應界面
在這里插入圖片描述
在這里插入圖片描述
可清楚看到鏈路的每個服務節點的詳細信息,包括斷路器等都可檢測到。

相關文獻

micrometer官網:https://docs.micrometer.io/micrometer/reference/overview.html
zipkin官網:https://zipkin.io/

當然除了Micrometer還有其他技術可以做鏈路追蹤,具體情況參考自家公司的服務架構、項目流量決定,Skywalking作為鏈路追蹤也是不錯的
在這里插入圖片描述

就先說到這 \color{#008B8B}{ 就先說到這} 就先說到這
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一個愛分享 J a v a 、生活的小人物, \color{#008B8B}{一個愛分享Java、生活的小人物,} 一個愛分享Java、生活的小人物,
咱們來日方長,有緣江湖再見,告辭! \color{#008B8B}{咱們來日方長,有緣江湖再見,告辭!} 咱們來日方長,有緣江湖再見,告辭!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36748.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Electron】Electron入門實現

Electron 學習筆記 Electron 是一個開源框架&#xff0c;允許開發者使用網頁技術&#xff08;HTML、CSS 和 JavaScript&#xff09;來構建跨平臺的桌面應用程序。它由 GitHub 開發并維護&#xff0c;最初是為了支持開發 Atom 編輯器。Electron 結合了 Chromium&#xff08;用于…

密碼學及其應用 —— 對稱加密技術

1. 對稱加密、流加密和塊加密 1.1 對稱加密 對稱加密&#xff08;也稱為密鑰加密&#xff09;是一種加密方式&#xff0c;其中加密和解密使用相同的密鑰。這種加密方法基于二進制層面的操作&#xff0c;如XOR&#xff08;異或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目錄 一、Redis Stream1.1 場景1&#xff1a;多個客戶端可以同時接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;發消息 &#xff09;1.1.2 XREAD - 從stream中讀取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 從stream指定區間讀取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本開發指南

DevExpressMVVM WPF 環境安裝 前言重要Bug&#xff08;必看&#xff09;環境安裝控件目錄Theme 主題LoginWindow 登陸窗口INavigationService 導航服務DockLayout Dock類型的畫面布局TreeView 樹狀列表注意引用類型的時候ImageSource是PresentationCore程序集的博主找了好久&am…

[筆記] keytool 導入服務器證書和證書私鑰

背景 我當前手頭已有一個服務器證書和對應的私鑰&#xff0c;現在需要轉換為 Java KeyStore 格式使用&#xff0c;找了一大圈才發現 keytool 無法直接導入服務器證書和私鑰&#xff0c;當然證書可以直接導入&#xff0c;但是私鑰是無法直接導入。找了一大圈發現可以先將服務器…

LeetCode題解:1669. 合并兩個鏈表,JavaScript,詳細注釋

原題鏈接&#xff1a; https://leetcode.cn/problems/merge-in-between-linked-lists/ 解題思路&#xff1a; 注意該題傳入的a和b是鏈表的索引&#xff0c;而不是節點的值先遍歷list1&#xff0c;找到a-1和b1節點將a-1的next指向list2的頭節點在將list2的尾節點的next指向b1節…

Navicat 外網連接 mysql (1、通過SSH方式內網訪問 2、對外開放3306端口)

1、通過SSH方式內網訪問 直接常規方式使用IP、賬號密碼連接&#xff0c;失敗 SSH方式&#xff1a; 常規 選項卡中&#xff1a;localhost錄入數據庫賬號密碼 SSH 選項卡中&#xff1a;勾選使用SSH&#xff0c;輸入服務器IP、賬號、密碼 如果出現該錯誤&#xff0c;可能是服務器…

計算機網絡重點名詞解釋整理

名詞解釋 GPTVersion 一、網絡協議 網絡協議 數據交換的規則 組成&#xff1a;語義、語法、定時 二、DHCP DHCP 動態規劃主機配置協議 作用&#xff1a;讓計算機自動獲取IP地址 特點&#xff1a;即插即用&#xff0c;不需要手動設置 三、信號的基本調制方法以及定義 …

Windows下activemq開啟jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq開啟jmx 1.進入activemq conf目錄&#xff0c;備份activemq.xml文件 2.編輯activemq.xml文件&#xff0c;在broker節點增加useJmx"true" <broker xmlns"http://active…

C++循環隊列 自定義queue

原理解析 看main部分的注釋&#xff0c;對照著函數&#xff0c;應該能看懂。 #include <iostream> class Queue {public:static constexpr int MAX_SIZE 5;int items[MAX_SIZE];int front, rear;Queue() : front(-1), rear(-1) {}void enqueue(int value) {if ((rear …

理解 Vue.js 中的 immediate: true

理解 Vue.js 中的 immediate: true 在使用 Vue.js 時&#xff0c;監聽器 (watchers) 是一種非常重要的工具&#xff0c;它允許我們觀察和響應數據的變化。在定義監聽器時&#xff0c;我們通常會在組件的 watch 選項中添加相關配置。immediate: true 是其中的一個配置選項。本文…

無線通訊幾種常規天線類別簡介

天線對于無線模塊來說至關重要&#xff0c;合適的天線可以優化通信網絡&#xff0c;增加其通信的范圍和可靠性。天線的選型對最后的模塊通信影響很大&#xff0c;不合適的天線會導致通信質量下降。針對不同的市場應用&#xff0c;天線的材質、安置方式、性能也大不一樣。下面簡…

近期計算機領域的熱點技術

隨著科技的飛速發展&#xff0c;計算機領域的新技術、新趨勢層出不窮。本文將探討近期計算機領域的幾個熱點技術趨勢&#xff0c;并對它們進行簡要的分析和展望。 一、人工智能與機器學習 人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;是近年來計算…

基于Vue 3.x與TypeScript的PPTIST本地部署與無公網IP遠程演示文稿

文章目錄 前言1. 本地安裝PPTist2. PPTist 使用介紹3. 安裝Cpolar內網穿透4. 配置公網地址5. 配置固定公網地址 前言 本文主要介紹如何在Windows系統環境本地部署開源在線演示文稿應用PPTist&#xff0c;并結合cpolar內網穿透工具實現隨時隨地遠程訪問與使用該項目。 PPTist …

[gpt胡說八道篇] 使用Docker快速啟動Doris

Docker 是一種輕量級的虛擬化技術&#xff0c;我們可以利用 Docker 快速的在本地啟動一個 Doris 的實例&#xff0c;方便進行開發和測試。下面我們來看一下如何操作。 1. 拉取 Docker 鏡像 首先&#xff0c;我們需要從 Docker Hub 上拉取 Doris 的鏡像。打開終端&#xff0c;輸…

Qt Qvariant

QVariant 是 Qt 框架中的一個非常強大的類&#xff0c;它用于存儲各種不同類型的數據&#xff0c;并提供了一種統一的方式來處理這些數據。QVariant 可以存儲大多數基本數據類型&#xff0c;如整數、浮點數、字符串、日期時間等&#xff0c;以及更復雜的數據類型&#xff0c;如…

ChatGPT的原理可以通俗易懂地介紹

ChatGPT的原理可以通俗易懂地介紹如下&#xff1a; 基礎架構&#xff1a; ChatGPT基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;尤其是GPT-3的架構進行構建。GPT模型是一種基于Transformer架構的預訓練語言模型&#xff0c;特別…

基于STM32的智能水質監測系統

目錄 引言環境準備智能水質監測系統基礎代碼實現&#xff1a;實現智能水質監測系統 4.1 數據采集模塊4.2 數據處理與分析4.3 控制系統實現4.4 用戶界面與數據可視化應用場景&#xff1a;水質管理與優化問題解決方案與優化收尾與總結 1. 引言 智能水質監測系統通過使用STM32嵌…

RISC-V知識總結 —— 向量(擴展)指令集

資源1:晏明 - RISC-V向量擴展指令架構及LLVM自動向量化支持 - 202112118 - 第13屆開源開發工具大會&#xff08;OSDTConf2021&#xff09;_嗶哩嗶哩_bilibili資源2:張先軼 - 基于RISC-V向量指令集優化基礎計算軟件生態【第12屆開源開發工具大會&#xff08;OSDT2020&#xff09…

設計模式(實際項目)-狀態機模式

需求背景&#xff1a;存在狀態流轉的預約單 一.數據庫設計 CREATE TABLE appointment (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主鍵id,appoint_type int(11) NOT NULL COMMENT 預約類型(0:線下查房...),appoint_user_id bigint(20) NOT NULL COMMENT 預約人…