微服務—鏈路追蹤(Sleuth+Zipkin)


1、鏈路追蹤介紹
在大型系統的微服務化構建中,一個系統被拆分成了許多模塊。這些模塊負責不同的功能,組合成系統,最終可以提供豐富的功能。在這種架構中,一次請求往往需要涉及到多個服務。互聯網應用構建在不同的軟件模塊集上,這些軟件模塊,有可能是由不同的團隊開發、可能使用不同的編程語言來實現、有可能布在了幾千台服務器,橫跨多個不同的數據中心。

2、為什么需要鏈路追蹤?
微服務架構是通過業務來划分服務的,使用 REST 調用。對外暴露的一個接口,可能需要很多個服務協同才能完成這個接口功能,如果鏈路上任何一個服務出現問題或者網絡超時,都會形成導致接口調用失敗。隨着業務的不斷擴張,服務之間互相調用會越來越復雜。

2.1、那該如何解決呢?

sleuth : 鏈路追蹤器
zipkin:鏈路分析器(可視化)

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

2.2、常見的鏈路追蹤技術有下面這些:
(1)cat 由大眾點評開源,基於Java開發的實時應用監控平台,包括實時應用監控,業務監控 。 集成 方案是通過代碼埋點的方式來實現監控,比如: 攔截器,過濾器等。 對代碼的侵入性很大,集成成本較高。風險較大。

(2)zipkin 由Twitter公司開源,開放源代碼分布式的跟蹤系統,用於收集服務的定時數據,以解決微 服務架構中的延遲問題,包括:數據的收集、存儲、查找和展現《圖形化》。該產品結合spring-cloud-sleuth 使用較為簡單, 集成很方便, 但是功能較簡單。

(3)pinpoint Pinpoint是韓國人開源的基於字節碼注入的調用鏈分析,以及應用監控分析工具。特點 是支持多種插件,UI功能強大,接入端無代碼侵入。

(4)SkyWalking是本土開源的基於字節碼注入的調用鏈分析,以及應用監控分析工具。特點是支持多 種插件,UI功能較強,接入端無代碼侵入。目前已加入Apache孵化器。
Sleuth (日志記錄每一條鏈路上的所有節點,以及這些節點所在的機器,和耗時。)

(5)log4j SpringCloud 提供的分布式系統中鏈路追蹤解決方案。

注意:SpringCloud alibaba技術棧中並沒有提供自己的鏈路追蹤技術的,我們可以采用Sleuth + Zipkin來做鏈路追蹤解決方案。

3、Sleuth
3.1、Sleuth介紹
SpringCloud Sleuth主要功能就是在分布式系統中提供追蹤解決方案。它大量借用了Google Dapper的設計, 先來了解一下Sleuth中的術語和相關概念。

3.2、相關術語
(1)Trace (一條完整鏈路–包含很多span(微服務接口))
由一組Trace Id(貫穿整個鏈路)相同的Span串聯形成一個樹狀結構。為了實現請求跟蹤,當請求到達分布式系統的入口端點時,只需要服務跟蹤框架為該請求創建一個唯一的標識(即TraceId),同時在分布式系統內部流轉的時候,框架始終保持傳遞該唯一值,直到整個請求的返回。那么我們就可以使用該唯一標識將所有的請求串聯起來,形成一條完整的請求鏈路。
(2)Span
代表了一組基本的工作單元。為了統計各處理單元的延遲,當請求到達各個服務組件的時候,也通過一個唯一標識(SpanId)來標記它的開始、具體過程和結束。通過SpanId的開始和結束時間戳,就能統計該span的調用時間,除此之外,我們還可以獲取如事件的名稱。請求信息等元數據。
(3)Annotation
用它記錄一段時間內的事件,內部使用的重要注釋:
  cs(Client Send)客戶端發出請求,開始一個請求的生命
  sr(Server Received)服務端接受到請求開始進行處理, sr-cs = 網絡延遲(服務調用的時間)
  ss(Server Send)服務端處理完畢准備發送到客戶端,ss - sr = 服務器上的請求處理時間
  cr(Client Reveived)客戶端接受到服務端的響應,請求結束。 cr - sr = 請求的總時間
3.3、Sleuth入門
接下來通過我之前的項目案例整合Sleuth,完成入門案例的編寫。

在pom.xml文件添加Sleuth依賴

 <!--sleuth依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

啟動微服務,調用之后,我們可以在控制台觀察到sleuth的日志輸出

 

 

其中shop-getway中的 f2d0f9e1ad17ecda是TraceId, shop-product中的ad5e994c06101a23是SpanId,依次調用有一個全局的TraceId,將調用鏈路串起來。仔細分析每個微服務的日志,不難看出請求的具體過程。

查看日志文件並不是一個很好的方法,當微服務越來越多日志文件也會越來越多,通過Zipkin可以將日志聚合,並進行可視化展示和全文檢索。

4、Zipkin
4.1、ZipKin介紹
Zipkin 是 Twitter 的一個開源項目,它基於Google Dapper實現,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲展現、查找和我們可以使用它來收集各個服務器上請求鏈路的跟蹤數據,並通過它提供的REST API接口來輔助我們查詢跟蹤數據以實現對分布式系統的監控程序,從而及時地發現系統中出現的延遲升高問題並找出系統性能瓶頸的根源,除了面向開發的 API 接口之外,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請求鏈路明細,比如:可以查詢某段時間內各用戶請求的處理時間等。
Zipkin 提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。

上圖展示了 Zipkin 的基礎架構,它主要由 4 個核心組件構成:

(1)Collector:收集器組件,它主要用於處理從外部系統發送過來的跟蹤信息,將這些信息轉換為Zipkin 內部處理的 Span 格式,以支持后續的存儲、分析、展示等功能。
(2)Storage:存儲組件,它主要對處理收集器接收到的跟蹤信息,默認會將這些信息存儲在內存中,我們也可以修改此存儲策略,通過使用其他存儲組件將跟蹤信息存儲到數據庫中。
(3)RESTful API:API 組件,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是外接系統訪問以實現監控等。
(4)Web UI:UI 組件,基於 API 組件實現的上層應用。通過 UI 組件用戶可以方便而有直觀地查詢和分析跟蹤信息。
Zipkin分為兩端,一個是 Zipkin 服務端,一個是 Zipkin 客戶端,客戶端也就是微服務的應用。客戶端會配置服務端的 URL 地址,一旦發生服務間的調用的時候,會被配置在微服務里面的 Sleuth 的監聽器監聽,並生成相應的 Trace 和 Span 信息發送給服務端。

4.2、ZipKin服務端安裝
1、下載ZipKin的jar包

官網下載: https://zipkin.io/pages/quickstart.html

 2、進入cmd黑窗口—通過命令行,輸入下面的命令啟動ZipKin Server

到剛才下載的jar文件目錄:

 

 執行下面命令:

java -jar zipkin-server-2.23.2-exec.jar

出現如下界面:

 3、通過瀏覽器訪問 http://localhost:9411訪問。

4.3、Zipkin客戶端集成

ZipKin客戶端和Sleuth的集成非常簡單,只需要在微服務中添加其依賴和配置即可。

1、在每個微服務上添加依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

2、添加配置

#配置zipkin
  zipkin:
    base-url: http://192.168.31.60:9411
    discovery-client-enabled: false # 不要讓nacos把zipkin注冊進去(可以不寫) sleuth: sampler: probability: 1.0

3、訪問微服務

這是我自己的訪問路徑,你們在訪問的時候換成自己的訪問路徑

http://192.168.31.60:9000/order/payOrder?pid=1&num=2

4、訪問zipkin的UI界面,觀察效果

 5、點擊其中一條記錄,可觀察一次訪問的詳細線路

 

4.4、ZipKin數據持久化
Zipkin Server默認會將追蹤數據信息保存到內存,但這種方式不適合生產環境。Zipkin支持將追蹤數據持久化到mysql數據庫或elasticsearch中。

4.4.1、使用mysql實現數據持久化
1、創建mysql數據環境(創建數據庫及表)

View Code

2、關閉zipkin服務,重新打開cmd黑窗口輸入以下數據來啟動在啟動ZipKin Server的時候,指定數據保存的mysql的信息。

java -jar zipkin-server-2.23.2-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=192.168.31.60 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123@qwe

根據自己的信息更改以下對應數據信息

MYSQL_HOST:本機IP
MYSQL_TCP_PORT:端口號
MYSQL_DB:數據庫名
MYSQL_USER:用戶名
MYSQL_PASS:密碼
啟動之后就實現了數據持久化(將鏈路追蹤信息存放到mysql數據庫中),重新啟動后再次打開訪問zipkin的UI界面,鏈路信息將不會消失。

ref:(22條消息) 微服務—鏈路追蹤(Sleuth+Zipkin)_shi_AXing_a的博客-CSDN博客_zipkin鏈路追蹤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM