轉(zhuǎn)載本文需注明出處:微信公眾號(hào)EAWorld,違者必究。
前言:
隨著微服務(wù)架構(gòu)技術(shù)的普及和廣泛在企業(yè)應(yīng)用中落地,由于微服務(wù)架構(gòu)本身的特性,架構(gòu)由一系列相對(duì)獨(dú)立的細(xì)粒度的服務(wù)組成,一個(gè)完整的業(yè)務(wù)邏輯調(diào)用請(qǐng)求的背后可能牽涉后端幾個(gè)、幾十個(gè)甚至上百個(gè)服務(wù)接口,每個(gè)服務(wù)可能是由不同的團(tuán)隊(duì)開(kāi)發(fā),使用了不同的編程語(yǔ)言,還有可能部署在不同的機(jī)器上,分布在不同的數(shù)據(jù)中心,對(duì)于這樣的一個(gè)邏輯調(diào)用關(guān)系,如果在調(diào)用過(guò)程中發(fā)生問(wèn)題,比如說(shuō)調(diào)用失敗,或者調(diào)用過(guò)程響應(yīng)很慢,如何在這樣一個(gè)分布式環(huán)境下快速定位問(wèn)題所在、快速分析業(yè)務(wù)處理中的響應(yīng)慢的瓶頸在哪?多個(gè)微服務(wù)之間存在調(diào)用關(guān)系,如何在系統(tǒng)運(yùn)行時(shí)總覽一個(gè)系統(tǒng)中微服務(wù)間的拓?fù)潢P(guān)系?如何完整還原一次請(qǐng)求的鏈路情況?
以上這些問(wèn)題可以借助鏈路追蹤技術(shù)進(jìn)行解決。鏈路追蹤組件通過(guò)在微服務(wù)應(yīng)用中以代碼侵入或者非侵入的方式進(jìn)行數(shù)據(jù)表示、埋點(diǎn)、傳遞、收集、存儲(chǔ)、展示等技術(shù)手段,達(dá)到將一次分布式請(qǐng)求還原成調(diào)用鏈路,將一次分布式請(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)等等。
目錄:
1.鏈路追蹤的應(yīng)用場(chǎng)景
2.鏈路追蹤基本原理
3.鏈路追蹤的Demo實(shí)現(xiàn)
4.普元微服務(wù)平臺(tái)的鏈路追蹤應(yīng)用
1.鏈路追蹤的應(yīng)用場(chǎng)景
移動(dòng)平臺(tái)8.0打開(kāi)了以往eclipse平臺(tái)的枷鎖,全面擁抱了主流的VSCode編輯器,包括支持實(shí)用的cli命令行支持、及優(yōu)秀的跨平臺(tái)開(kāi)發(fā)框架ReactNative。
在微服務(wù)架構(gòu)下,分布式系統(tǒng)變得日趨復(fù)雜,越來(lái)越多的組件開(kāi)始走向分布式化,如微服務(wù)、分布式數(shù)據(jù)庫(kù)、分布式緩存等,使得后臺(tái)服務(wù)構(gòu)成了一種復(fù)雜的分布式網(wǎng)絡(luò),這樣一個(gè)場(chǎng)景下,對(duì)于用戶(hù)的每一次請(qǐng)求調(diào)用,后端執(zhí)行了多少組件間的調(diào)用無(wú)法知曉,由于分布式的調(diào)用,增加了程序調(diào)用異常的錯(cuò)誤率,在這樣的應(yīng)用場(chǎng)景下,新的架構(gòu)技術(shù)帶來(lái)了新的問(wèn)題。
場(chǎng)景下的關(guān)鍵問(wèn)題
1. 如何在請(qǐng)求發(fā)生異常時(shí)快速定義問(wèn)題所在
2. 如何在請(qǐng)求響應(yīng)慢的時(shí)候快速找出慢的原因
3. 如何通過(guò)日志文件快速定位問(wèn)題的根本原因
傳統(tǒng)的問(wèn)題排查手段
一般在系統(tǒng)發(fā)生問(wèn)題時(shí),比如系統(tǒng)異常或者系統(tǒng)性能出現(xiàn)問(wèn)題時(shí),通常都是從系統(tǒng)記錄的日志文件中找出蛛絲馬腳,而對(duì)于微服務(wù)架構(gòu)下的分布式部署,日志文件的分散,想從日志中查找問(wèn)題工作量很大。對(duì)于用戶(hù)某一次請(qǐng)求調(diào)用后端哪些服務(wù),每個(gè)服務(wù)執(zhí)行情況,想從日志中獲得更是不可能的事。
對(duì)于傳統(tǒng)的監(jiān)控告警平臺(tái)也緊針對(duì)平臺(tái)資源的監(jiān)控包括cpu、內(nèi)存、網(wǎng)絡(luò)帶寬情況等,對(duì)業(yè)務(wù)微服務(wù)應(yīng)用的指標(biāo)(平均響應(yīng)時(shí)間、慢端點(diǎn)情況等)的監(jiān)控顯得無(wú)從下手。
在這樣的背景下,新的監(jiān)控體系下的細(xì)分領(lǐng)域-鏈路追蹤問(wèn)世了。
首先,我們來(lái)看看在系統(tǒng)監(jiān)控的體系下具體的細(xì)分領(lǐng)域的專(zhuān)注點(diǎn):
Logging - 用于記錄離散的事件。例如,應(yīng)用程序的調(diào)試信息或錯(cuò)誤信息。它是我們?cè)\斷問(wèn)題的依據(jù)。
Metrics - 用于記錄可聚合的數(shù)據(jù)。例如,隊(duì)列的當(dāng)前深度可被定義為一個(gè)度量值,在元素入隊(duì)或出隊(duì)時(shí)被更新;HTTP 請(qǐng)求個(gè)數(shù)可被定義為一個(gè)計(jì)數(shù)器,新請(qǐng)求到來(lái)時(shí)進(jìn)行累加。
Tracing - 用于記錄請(qǐng)求范圍內(nèi)的信息。例如,一次遠(yuǎn)程方法調(diào)用的執(zhí)行過(guò)程和耗時(shí)。它是我們排查系統(tǒng)性能問(wèn)題的利器。
2.鏈路追蹤基本原理
在每個(gè)請(qǐng)求調(diào)用的入口和出口進(jìn)行代碼埋點(diǎn)記錄調(diào)用之間的關(guān)系、每個(gè)調(diào)用處理時(shí)間點(diǎn)信息。
通過(guò)調(diào)用關(guān)系梳理出一次請(qǐng)求的完整鏈路還原、請(qǐng)求具體到達(dá)哪臺(tái)機(jī)器。
通過(guò)每次處理記錄的時(shí)間點(diǎn),計(jì)算出相關(guān)的調(diào)用執(zhí)行時(shí)間、響應(yīng)時(shí)間、網(wǎng)絡(luò)延時(shí)。
對(duì)調(diào)用請(qǐng)求量進(jìn)行統(tǒng)計(jì)。
顯示鏈路拓?fù)浣Y(jié)構(gòu)、應(yīng)用依賴(lài)關(guān)系。
Trace:指一個(gè)請(qǐng)求經(jīng)過(guò)后端所有服務(wù)的路徑,每一條鏈路都用一個(gè)全局唯一的traceid來(lái)標(biāo)識(shí)。
Span:鏈路中的調(diào)用由span來(lái)表示,每個(gè)span由spanid和parentid來(lái)標(biāo)識(shí),可以記錄調(diào)用的父子關(guān)系。
Timestamp:調(diào)用點(diǎn)的時(shí)間戳,記錄每個(gè)執(zhí)行點(diǎn)的時(shí)間信息。
如果想知道一個(gè)接口在哪個(gè)環(huán)節(jié)出現(xiàn)了問(wèn)題,就必須清楚該接口調(diào)用了哪些服務(wù),以及調(diào)用的順序,如果把這些服務(wù)串起來(lái),看起來(lái)就像鏈條一樣,我們稱(chēng)其為調(diào)用鏈。
到現(xiàn)在,已經(jīng)知道調(diào)用順序和層級(jí)關(guān)系了,但是接口出現(xiàn)問(wèn)題后,還是不能找到出問(wèn)題的環(huán)節(jié),如果某個(gè)服務(wù)有問(wèn)題,那個(gè)被調(diào)用執(zhí)行的服務(wù)一定耗時(shí)很長(zhǎng),要想計(jì)算出耗時(shí),上述的三個(gè)標(biāo)識(shí)還不夠,還需要加上時(shí)間戳,時(shí)間戳可以更精細(xì)一點(diǎn),精確到微秒級(jí)。
只記錄發(fā)起調(diào)用時(shí)的時(shí)間戳還算不出耗時(shí),要記錄下服務(wù)返回時(shí)的時(shí)間戳,有始有終才能算出時(shí)間差,既然返回的也記了,就把上述的三個(gè)標(biāo)識(shí)都記一下吧,不然區(qū)分不出是誰(shuí)的時(shí)間戳。
3.鏈路追蹤的Demo實(shí)現(xiàn)
前面我們介紹了鏈路追蹤的技術(shù)原理,以及相關(guān)的實(shí)現(xiàn)鏈路追蹤的開(kāi)源組件,那么我們實(shí)際在項(xiàng)目中要怎么做,是否需要根據(jù)技術(shù)原理去實(shí)現(xiàn)底層的相關(guān)開(kāi)發(fā)。通過(guò)這個(gè)章節(jié),我簡(jiǎn)單的通過(guò)一個(gè)demo去演示如何在微服務(wù)架構(gòu)系統(tǒng)中完成鏈路追蹤的功能。
我們簡(jiǎn)單描述一下demo的相關(guān)情況,首先demo是要基于微服務(wù)架構(gòu)的,那么我們提供2個(gè)微服務(wù)應(yīng)用(訂單服務(wù)、產(chǎn)品服務(wù)),并且提供一個(gè)服務(wù)注冊(cè)發(fā)現(xiàn)中心,訂單服務(wù)會(huì)調(diào)用產(chǎn)品服務(wù),并且是通過(guò)注冊(cè)中心去發(fā)現(xiàn)服務(wù)調(diào)用服務(wù),這樣從前端請(qǐng)求調(diào)用訂單服務(wù),再由訂單服務(wù)調(diào)用產(chǎn)品服務(wù),完成了一個(gè)簡(jiǎn)單的鏈路調(diào)用,需求鏈路很短,只有兩次調(diào)用,足夠演示demo的鏈路追蹤功能。
通過(guò)demo將教打家一步一步的去實(shí)現(xiàn)鏈路的相關(guān)功能,包括還原請(qǐng)求的完整調(diào)用鏈路情況,能夠查看請(qǐng)求過(guò)程中訂單服務(wù),產(chǎn)品服務(wù)執(zhí)行的耗時(shí)情況,總的請(qǐng)求響應(yīng)時(shí)間,并且可以根據(jù)請(qǐng)求鏈路的traceid查看到對(duì)應(yīng)的請(qǐng)求處理的日志信息。
首先創(chuàng)建springboot項(xiàng)目,通過(guò)依賴(lài)eureka組件,提供服務(wù)的注冊(cè)中心,實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)。
添加依賴(lài)
Properties配置信息
再添加兩個(gè)springboot項(xiàng)目,一個(gè)訂單服務(wù),一個(gè)產(chǎn)品服務(wù)
由于服務(wù)需要注冊(cè)到注冊(cè)中心,因此兩個(gè)項(xiàng)目需要添加依賴(lài)
并添加配置信息
并且訂單服務(wù)需要調(diào)用產(chǎn)品服務(wù)的方法,在demo中我們使用feign的方式進(jìn)行服務(wù)調(diào)用,因此在訂單服務(wù)項(xiàng)目中需要添加依賴(lài)
由于是demo,因此我們服務(wù)中的方法就簡(jiǎn)單通過(guò)返回字符串的方式實(shí)現(xiàn)。
至此我們啟動(dòng)兩個(gè)微服務(wù)應(yīng)用,可以在注冊(cè)中心中看到兩個(gè)服務(wù)都已經(jīng)注冊(cè)上來(lái),再通過(guò)瀏覽器請(qǐng)求訂單服務(wù)的接口,可以看到后端通過(guò)調(diào)用產(chǎn)品服務(wù)的接口,并返回信息。
到目前為止,我們只是構(gòu)建好了微服務(wù)應(yīng)用,對(duì)應(yīng)鏈路追蹤功能還沒(méi)有實(shí)現(xiàn),其實(shí)在微服務(wù)架構(gòu)下實(shí)現(xiàn)鏈路追蹤很簡(jiǎn)單,畢竟有很多開(kāi)源的組件封裝了底層實(shí)現(xiàn)原理,我們只需要引用這些組件就可以實(shí)現(xiàn)鏈路追蹤功能,在demo中我通過(guò)skywalking來(lái)進(jìn)行鏈路追蹤,由于skywalking本身的特性無(wú)需代碼侵入,只需要以探針的方式啟動(dòng)微服務(wù)應(yīng)用即可。并自動(dòng)采集服務(wù)調(diào)用的相關(guān)信息,寫(xiě)入數(shù)據(jù)庫(kù),然后通過(guò)自帶的dashboard查看相關(guān)信息。
首先我們先下載skywalking
其中,agent目錄是應(yīng)用啟動(dòng)時(shí)用的代理,bin目錄是skywalking后端服務(wù)和dashboard,在bin目錄執(zhí)行startup.bat文件,啟動(dòng)服務(wù)。
在訂單服務(wù)和產(chǎn)品服務(wù)的項(xiàng)目啟動(dòng)配置中,加上jvm參數(shù),以探針?lè)绞絾?dòng)2個(gè)服務(wù)應(yīng)用
啟動(dòng)后,我們可以通過(guò)skywalking自帶的dashboard查看信息。
可以看到請(qǐng)求的鏈路情況,以及每個(gè)路徑上的處理時(shí)間,總的響應(yīng)時(shí)間等信息。
還有一個(gè)目標(biāo)就是,如何將鏈路跟我們實(shí)際的日志記錄進(jìn)行綁定,這樣方便在某個(gè)鏈路出現(xiàn)問(wèn)題時(shí),我們可以針對(duì)這個(gè)具體的鏈路去查看具體問(wèn)題原因。
在demo中,我們通過(guò)logback記錄日志,添加依賴(lài)
目前很多的鏈路追蹤組件都已經(jīng)實(shí)現(xiàn)了與日志組件的集成,只需要引入依賴(lài),即可完成將鏈路traceid對(duì)應(yīng)寫(xiě)入到日志中。
在代碼中加入寫(xiě)日志的代碼
增加配置信息,以及l(fā)ogback-spring.xml文件
可以看到控制臺(tái)日志中,記錄的日志前面都加上了TID信息,也就是traceid。
4.普元微服務(wù)平臺(tái)的鏈路追蹤應(yīng)用
上面的demo只是簡(jiǎn)單的驗(yàn)證了如何快速通過(guò)第三方組件實(shí)現(xiàn)微服務(wù)架構(gòu)下的鏈路追蹤功能,對(duì)于在實(shí)際項(xiàng)目應(yīng)用中我們需要進(jìn)行優(yōu)化和整合,這章節(jié)中介紹我們普元微服務(wù)平臺(tái)在鏈路追蹤中的相關(guān)應(yīng)用場(chǎng)景:
1. 系統(tǒng)拓?fù)浣Y(jié)構(gòu)
2. 應(yīng)用運(yùn)行時(shí)
3. 業(yè)務(wù)鏈路
4. 跟蹤日志
5. 服務(wù)統(tǒng)計(jì)
在鏈路追蹤下,系統(tǒng)可以根據(jù)請(qǐng)求調(diào)用關(guān)系繪制去系統(tǒng)拓?fù)浣Y(jié)構(gòu),通過(guò)系統(tǒng)拓?fù)浣Y(jié)構(gòu)你可以清楚知道當(dāng)前系統(tǒng)下有多少微服務(wù)應(yīng)用,微服務(wù)應(yīng)用間是否有調(diào)用關(guān)系,每個(gè)服務(wù)的具體概況。
由于微服務(wù)架構(gòu)下,一個(gè)系統(tǒng)的微服務(wù)相對(duì)比較多,如果沒(méi)有這個(gè)系統(tǒng)拓?fù)浣Y(jié)構(gòu),后期對(duì)系統(tǒng)的情況,尤其是系統(tǒng)間的調(diào)用依賴(lài)關(guān)系跟蹤也很困難。
應(yīng)用運(yùn)行時(shí),通過(guò)收集統(tǒng)計(jì)相關(guān)調(diào)用請(qǐng)求信息,計(jì)算相關(guān)性能指標(biāo),幫助系統(tǒng)管理員運(yùn)維人員快速了解系統(tǒng)的相關(guān)情況,主要是微服務(wù)應(yīng)用實(shí)例的能力指標(biāo),比如平均響應(yīng)時(shí)間、平均響應(yīng)成功率等指標(biāo)。
由于普元微服務(wù)平臺(tái)的架構(gòu)特性,每一個(gè)服務(wù)對(duì)應(yīng)多個(gè)應(yīng)用實(shí)例組,因此在查看時(shí)可以選擇具體實(shí)例組下的實(shí)例節(jié)點(diǎn)。幫助我們了解應(yīng)用節(jié)點(diǎn)的性能,以及慢節(jié)點(diǎn)情況。
業(yè)務(wù)鏈路,快速查看某個(gè)應(yīng)用、甚至應(yīng)用下某個(gè)具體的操作的完整鏈路調(diào)用情況,鏈路中每個(gè)過(guò)程處理的時(shí)間信息,每個(gè)鏈路上顯示traceid信息,并提供快速?gòu)?fù)制功能,方便用戶(hù)在跟蹤日志中快速查看此次鏈路對(duì)應(yīng)的日志信息。
根據(jù)請(qǐng)求中的時(shí)間信息,在請(qǐng)求響應(yīng)慢的時(shí)候追溯具體慢的操作。
鏈路調(diào)用的時(shí)序情況,通過(guò)不同顏色區(qū)分應(yīng)用系統(tǒng),可以查看具體調(diào)用的詳細(xì)信息(組件、url、請(qǐng)求方式、異常信息等)。
鏈路日志,前面我們已經(jīng)完成了請(qǐng)求完整鏈路的還原,不過(guò)這些信息還不能查出根本原因,對(duì)應(yīng)異常發(fā)生的根本原因,我們有時(shí)還需要通過(guò)系統(tǒng)記錄的日志文件進(jìn)行查看,通過(guò)日志文件記錄的錯(cuò)誤信息進(jìn)行排查根本原因。
我們?cè)诓榭慈罩疚募r(shí),也不是直接顯示日志文件所有內(nèi)容,而是通過(guò)以與鏈路對(duì)應(yīng)的方式,顯示每個(gè)鏈路環(huán)節(jié)中記錄的日志信息,查看異常詳細(xì)原因。
另外,在跟蹤日志模塊,我們針對(duì)性的過(guò)濾篩選錯(cuò)誤日志、事務(wù)日志等信息。
平臺(tái)通過(guò)鏈路組件采集的請(qǐng)求處理信息,對(duì)這些信息進(jìn)行統(tǒng)計(jì),從多個(gè)維度提供統(tǒng)計(jì)數(shù)據(jù)供運(yùn)維人員進(jìn)行參考分析
統(tǒng)計(jì)某個(gè)應(yīng)用、某個(gè)請(qǐng)求路徑的總請(qǐng)求數(shù)、正常響應(yīng)數(shù)、錯(cuò)誤響應(yīng)數(shù)、最長(zhǎng)處理時(shí)間、最少處理時(shí)間、平均處理時(shí)間以及各類(lèi)異常處理的統(tǒng)計(jì)
在平臺(tái)正常運(yùn)行一段時(shí)間后,運(yùn)維人員普遍關(guān)注平臺(tái)的運(yùn)行情況,尤其是哪些請(qǐng)求比較頻繁、哪些請(qǐng)求比較耗時(shí)、哪些請(qǐng)求錯(cuò)誤率比較高、哪些錯(cuò)誤數(shù)多,而這些信息對(duì)于運(yùn)維人員比較敏感,因此平臺(tái)中提供直接顯示統(tǒng)計(jì)數(shù)據(jù)的方式供參考。
本文主要介紹微服務(wù)架構(gòu)下的鏈路追蹤的應(yīng)用場(chǎng)景,主要解決哪些問(wèn)題,對(duì)于一個(gè)剛接觸鏈路追蹤的新人來(lái)說(shuō),如何快速上手將鏈路追蹤引入到項(xiàng)目中,也將我們普元微服務(wù)平臺(tái)下的鏈路追蹤的應(yīng)用簡(jiǎn)單介紹了一下,便于大家在項(xiàng)目中進(jìn)行實(shí)際的應(yīng)用參考。文中沒(méi)有對(duì)目前市場(chǎng)上開(kāi)源的鏈路追蹤的組件做過(guò)多介紹以及之間的比較,也沒(méi)有對(duì)skywalking這個(gè)組件的使用配置做詳細(xì)介紹,相關(guān)的這些知識(shí)我們有專(zhuān)欄介紹,大家可以查看歷史文章進(jìn)行了解。
關(guān)于作者:軒雨,普元產(chǎn)品經(jīng)理,主要負(fù)責(zé)公司微服務(wù)、容器云相關(guān)產(chǎn)品的研發(fā)和實(shí)施,在分布式架構(gòu)、微服務(wù)、DevOps、容器云、軟件工程等領(lǐng)域方向具有較深的積累,擁有十多年的產(chǎn)品研發(fā)與多個(gè)大型平臺(tái)項(xiàng)目管理經(jīng)驗(yàn)。
關(guān)于EAWorld:微服務(wù),DevOps,數(shù)據(jù)治理,移動(dòng)架構(gòu)原創(chuàng)技術(shù)分享。






