第六章 Sleuth--鏈路追蹤

本文介紹微服務(wù)架構(gòu)中最重要的設(shè)計(jì)模式:微服務(wù)之間的數(shù)據(jù)通訊衡便。更多請(qǐng)看全文。

第一章:微服務(wù)的架構(gòu)介紹發(fā)展
第二章:微服務(wù)環(huán)境搭建
第三章:Nacos Discovery--服務(wù)治理
第四章:Sentinel--服務(wù)容錯(cuò)
第五章:Gateway--服務(wù)網(wǎng)關(guān)
第六章:Sleuth--鏈路追蹤
第七章:Rocketmq--消息驅(qū)動(dòng)

6.1 鏈路追蹤介紹

在大型系統(tǒng)的微服務(wù)化構(gòu)建中,一個(gè)系統(tǒng)被拆分成了許多模塊矾瑰。這些模塊負(fù)責(zé)不同的功能淋淀,組合成系統(tǒng)鲸拥,最終可以提供豐富的功能顷啼。在這種架構(gòu)中贷掖,一次請(qǐng)求往往需要涉及到多個(gè)服務(wù)藕夫。

互聯(lián)網(wǎng)應(yīng)用構(gòu)建在不同的軟件模塊集上孽糖,這些軟件模塊,有可能是由不同的團(tuán)隊(duì)開發(fā)毅贮、可能使用不同的編程語言來實(shí)現(xiàn)办悟、有可能布在了幾千臺(tái)服務(wù)器,橫跨多個(gè)不同的數(shù)據(jù)中心滩褥,也就意味著這種架構(gòu)形式也會(huì)存在一些問題

于是就出現(xiàn)了下面幾個(gè) 問題

如何快速發(fā)現(xiàn)問題病蛉?
如何判斷故障影響范圍?
如何梳理服務(wù)依賴以及依賴的合理性瑰煎?
如何分析鏈路性能問題以及實(shí)時(shí)容量規(guī)劃铺然?

image

分布式鏈路追蹤(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)等等革骨。

常見的鏈路追蹤技術(shù)有下面這些:

cat 由大眾點(diǎn)評(píng)開源,基于Java開發(fā)的實(shí)時(shí)應(yīng)用監(jiān)控平臺(tái)析恋,包括實(shí)時(shí)應(yīng)用監(jiān)控良哲,業(yè)務(wù)監(jiān)控 。 集成方案是通過代碼埋點(diǎn)的方式來實(shí)現(xiàn)監(jiān)控助隧,比如: 攔截器臂外,過濾器等。 對(duì)代碼的侵入性很大喇颁,集成成本較高漏健。風(fēng)險(xiǎn)較大。

zipkin 由Twitter公司開源橘霎,開放源代碼分布式的跟蹤系統(tǒng)蔫浆,用于收集服務(wù)的定時(shí)數(shù)據(jù),以解決微服務(wù)架構(gòu)中的延遲問題姐叁,包括:數(shù)據(jù)的收集瓦盛、存儲(chǔ)、查找和展現(xiàn)外潜。該產(chǎn)品結(jié)合spring-cloud-sleuth使用較為簡單原环, 集成很方便, 但是功能較簡單处窥。

pinpoint Pinpoint 是韓國人開源的基于字節(jié)碼注入的調(diào)用鏈分析嘱吗,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件滔驾,UI功能強(qiáng)大谒麦,接入端無代碼侵入。

SkyWalking 是本土開源的基于字節(jié)碼注入的調(diào)用鏈分析哆致,以及應(yīng)用監(jiān)控分析工具绕德。特點(diǎn)是支持多種插件,UI功能較強(qiáng)摊阀,接入端無代碼侵入耻蛇。目前已加入Apache孵化器。

Sleuth 是 Spring Cloud 提供的分布式系統(tǒng)中鏈路追蹤解決方案胞此。

注意:Spring Cloud Alibaba 技術(shù)棧中并沒有提供自己的鏈路追蹤技術(shù)的臣咖,我們可以采用 Sleuth + Zinkin 來做鏈路追蹤解決方案

6.2 Sleuth 入門

6.2.1 Sleuth 介紹

Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案。它大量借用了 Google Dapper 的設(shè)計(jì)豌鹤, 先來了解一下Sleuth中的術(shù)語和相關(guān)概念亡哄。

Trace:由一組 Trace Id 相同的 Span 串聯(lián)形成一個(gè)樹狀結(jié)構(gòu)。為了實(shí)現(xiàn)請(qǐng)求跟蹤布疙,當(dāng)請(qǐng)求到達(dá)分布式系統(tǒng)的入口端點(diǎn)時(shí)蚊惯,只需要服務(wù)跟蹤框架為該請(qǐng)求創(chuàng)建一個(gè)唯一的標(biāo)識(shí)(即 TraceId )愿卸,同時(shí)在分布式系統(tǒng)內(nèi)部流轉(zhuǎn)的時(shí)候,框架始終保持傳遞該唯一值截型,直到整個(gè)請(qǐng)求的返回趴荸。那么我們就可以使用該唯一標(biāo)識(shí)將所有的請(qǐng)求串聯(lián)起來,形成一條完整的請(qǐng)求鏈路宦焦。

Span:代表了一組基本的工作單元发钝。為了統(tǒng)計(jì)各處理單元的延遲,當(dāng)請(qǐng)求到達(dá)各個(gè)服務(wù)組件的時(shí)候波闹,也通過一個(gè)唯一標(biāo)識(shí)( SpanId )來標(biāo)記它的開始酝豪、具體過程和結(jié)束。通過 SpanId 的開始和結(jié)束時(shí)間戳精堕,就能統(tǒng)計(jì)該 span 的調(diào)用時(shí)間孵淘,除此之外,我們還可以獲取如事件的名稱歹篓。請(qǐng)求信息等元數(shù)據(jù)瘫证。

Annotation:用它記錄一段時(shí)間內(nèi)的事件,內(nèi)部使用的重要注釋:

  • cs(Client Send)客戶端發(fā)出請(qǐng)求庄撮,開始一個(gè)請(qǐng)求的生命
  • sr(Server Received)服務(wù)端接受到請(qǐng)求開始進(jìn)行處理背捌, sr-cs = 網(wǎng)絡(luò)延遲(服務(wù)調(diào)用的時(shí)間)
  • ss(Server Send)服務(wù)端處理完畢準(zhǔn)備發(fā)送到客戶端,ss - sr = 服務(wù)器上的請(qǐng)求處理時(shí)間
  • cr(Client Reveived)客戶端接受到服務(wù)端的響應(yīng)洞斯,請(qǐng)求結(jié)束毡庆。 cr - sr = 請(qǐng)求的總時(shí)間
image

6.2.2 Sleuth入門

微服務(wù)名稱, traceId, spanid, 是否將鏈路的追蹤結(jié)果輸出到第三方平臺(tái)

[api-gateway,3977235f83191553,3977125f73391553s,false]

[service-order,3977125f75391553,57547b5bf71s8s242,false]

[service-product,3977125f73391553,449f5b3f4ef8ds5c5,false]

1)接下來通過之前的項(xiàng)目案例整合Sleuth,完成入門案例的編寫巡扇。

<!--鏈路追蹤 Sleuth-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

2)啟動(dòng)微服務(wù)扭仁,調(diào)用之后,我們可以在控制臺(tái)觀察到sleuth的日志輸出

image

其中5399d5cb061971bd 是 TraceId 厅翔, 5399d5cb061971bd 是 SpanId,依次調(diào)用有一個(gè)全局的 TraceId搀突,將調(diào)用鏈路串起來刀闷。仔細(xì)分析每個(gè)微服務(wù)的日志,不難看出請(qǐng)求的具體過程仰迁。

6.3 Zipkin 的集成

6.3.1 ZipKin 介紹

Zipkin 是 Twitter 的一個(gè)開源項(xiàng)目甸昏,它基于 Google Dapper 實(shí)現(xiàn),它致力于收集服務(wù)的定時(shí)數(shù)據(jù)徐许,以解決微服務(wù)架構(gòu)中的延遲問題施蜜,包括數(shù)據(jù)的收集、存儲(chǔ)雌隅、查找和展現(xiàn)翻默。

我們可以使用它來收集各個(gè)服務(wù)器上請(qǐng)求鏈路的跟蹤數(shù)據(jù)缸沃,并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實(shí)現(xiàn)對(duì)分布式系統(tǒng)的監(jiān)控程序,從而及時(shí)地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源修械。

除了面向開發(fā)的 API 接口之外趾牧,它也提供了方便的 UI組件 來幫助我們直觀的搜索跟蹤信息和分析請(qǐng)求鏈路明細(xì),比如:可以查詢某段時(shí)間內(nèi)各用戶請(qǐng)求的處理時(shí)間等肯污。

Zipkin 提供了可插拔數(shù)據(jù)存儲(chǔ)方式:In-Memory翘单、MySqlCassandra 以及 Elasticsearch蹦渣。

image

上圖展示了 Zipkin 的基礎(chǔ)架構(gòu)哄芜,它主要由 4 個(gè)核心組件構(gòu)成:

  • Collector:收集器組件,它主要用于處理從外部系統(tǒng)發(fā)送過來的跟蹤信息柬唯,將這些信息轉(zhuǎn)換為 Zipkin 內(nèi)部處理的 Span 格式认臊,以支持后續(xù)的存儲(chǔ)、分析权逗、展示等功能美尸。
  • Storage:存儲(chǔ)組件,它主要對(duì)處理收集器接收到的跟蹤信息斟薇,默認(rèn)會(huì)將這些信息存儲(chǔ)在內(nèi)存中师坎,我們也可以修改此存儲(chǔ)策略,通過使用其他存儲(chǔ)組件將跟蹤信息存儲(chǔ)到數(shù)據(jù)庫中堪滨。
  • RESTful API:API 組件胯陋,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息袱箱,或是外接系統(tǒng)訪問以實(shí)現(xiàn)監(jiān)控等遏乔。
  • Web UI:UI 組件,

Zipkin 分為兩端发笔,一個(gè)是 Zipkin 服務(wù)端盟萨,一個(gè)是 Zipkin 客戶端,客戶端也就是微服務(wù)的應(yīng)用了讨。 客戶端會(huì)配置服務(wù)端的 URL 地址捻激,一旦發(fā)生服務(wù)間的調(diào)用的時(shí)候,會(huì)被配置在微服務(wù)里面的 Sleuth 的監(jiān)聽器監(jiān)聽前计,并生成相應(yīng)的 Trace 和 Span 信息發(fā)送給服務(wù)端胞谭。

6.3.2 ZipKin 服務(wù)端安裝

服務(wù)端也分兩種方式一種是自己導(dǎo)依賴做一個(gè)服務(wù)端,還有就是直接使用第三方男杈,由于時(shí)間關(guān)系丈屹,這里我直接使用第三方,一般開發(fā)也是使用這種用的較多

1)下載 ZipKin 的 jar 包

訪問上面的網(wǎng)址伶棒,即可得到一個(gè)jar包旺垒,這就是 ZipKin 服務(wù)端的jar包

2)通過命令行彩库,輸入下面的命令啟動(dòng)ZipKin Server 就像啟動(dòng) jar 包一樣啟動(dòng) zipkin 服務(wù)端,

java -jar zipkin-server-2.12.9-exec.jar

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

image

6.3.3 Zipkin客戶端集成

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

1)在每個(gè)微服務(wù)上添加依賴

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

2)添加配置

spring:
  zipkin:
    base-url: http://127.0.0.1:9411/  #zipkin server的請(qǐng)求地址
    discovery-client-enabled: false
  sleuth:
    sampler:
      probability: 1.0 #采樣的百分比

3)訪問微服務(wù)

http://localhost:7000/order-serv/order/prod/1

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

image

5)點(diǎn)擊其中一條記錄鞭达,可觀察一次訪問的詳細(xì)線路司忱。

image

6.4 ZipKin 數(shù)據(jù)持久化

Zipkin Server 默認(rèn)會(huì)將追蹤數(shù)據(jù)信息保存到內(nèi)存,但這種方式不適合生產(chǎn)環(huán)境畴蹭。Zipkin 支持將追蹤數(shù)據(jù)持久化到 mysql 數(shù)據(jù)庫或 elasticsearch 中坦仍。

6.4.1 使用 mysql 實(shí)現(xiàn)數(shù)據(jù)持久化

1)創(chuàng)建 mysql 數(shù)據(jù)環(huán)境

新建數(shù)據(jù)庫:zipkin,因?yàn)樗J(rèn)數(shù)據(jù)庫名稱是zipkin叨襟。

如果想使用其他名稱也可以繁扎。下面會(huì)介紹如何配置自定義的數(shù)據(jù)庫名稱。

SQL參考: 官網(wǎng)

image

2)在啟動(dòng) ZipKin Server 的時(shí)候,指定數(shù)據(jù)保存的 mysql 的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root

6.4.2 使用 elasticsearch 實(shí)現(xiàn)數(shù)據(jù)持久化

1)下載 elasticsearch

下載地址

2)啟動(dòng) elasticsearch

image

3)在啟動(dòng) ZipKin Server 的時(shí)候糊闽,指定數(shù)據(jù)保存的 elasticsearch 的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ESHOST=localhost:9200
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梳玫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子右犹,更是在濱河造成了極大的恐慌提澎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件念链,死亡現(xiàn)場離奇詭異盼忌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掂墓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谦纱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人君编,你說我怎么就攤上這事跨嘉。” “怎么了吃嘿?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵偿荷,是天一觀的道長。 經(jīng)常有香客問我唠椭,道長,這世上最難降的妖魔是什么忍饰? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任贪嫂,我火速辦了婚禮,結(jié)果婚禮上艾蓝,老公的妹妹穿的比我還像新娘力崇。我一直安慰自己斗塘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布亮靴。 她就那樣靜靜地躺著馍盟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧吊。 梳的紋絲不亂的頭發(fā)上贞岭,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音搓侄,去河邊找鬼瞄桨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛讶踪,可吹牛的內(nèi)容都是我干的芯侥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乳讥,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼柱查!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起云石,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤唉工,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后留晚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酵紫,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年错维,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奖地。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赋焕,死狀恐怖参歹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隆判,我是刑警寧澤犬庇,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站侨嘀,受9級(jí)特大地震影響臭挽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咬腕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一欢峰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦纽帖、人聲如沸宠漩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扒吁。三九已至,卻和暖如春室囊,著一層夾襖步出監(jiān)牢的瞬間雕崩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工波俄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晨逝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓懦铺,卻偏偏與公主長得像捉貌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冬念,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ??Spring Cloud Sleuth是Spring Cloud的一個(gè)組件急前,它的主要功能是在分布式系統(tǒng)中提供服...
    CarlosBen閱讀 1,106評(píng)論 0 4
  • 1. 什么是調(diào)用鏈 一個(gè)業(yè)務(wù)功能可能需要多個(gè)服務(wù)協(xié)作才能實(shí)現(xiàn)醒陆,一個(gè)請(qǐng)求到達(dá)服務(wù)A,服務(wù)A需要依賴服務(wù)B裆针,服務(wù)B又依...
    匆匆歲月閱讀 1,146評(píng)論 0 7
  • 太困了刨摩,但我還是想說兩句,因?yàn)槲遗旅魈焱耸蓝帧Uf實(shí)話澡刹,我是個(gè)不喜歡做數(shù)學(xué)題的人,我學(xué)了比較多的c基礎(chǔ)后耘婚,看了二分搜索...
    goleo閱讀 173評(píng)論 0 0
  • 不知道是從哪天開始的 是第一次安慰自己大三就去死 還是在一次準(zhǔn)備了很久的四級(jí)考試上頭腦空白成智障 開始慢慢聽不懂別...
    不許差不多閱讀 114評(píng)論 0 0
  • 你問罢浇,窗邊的綠蘿好不好看。 我想沐祷,那是一群天使的化身嚷闭。 小紅帽于我,是信仰赖临。每次胞锰,穿行于混雜的交通...
    蒲小紅閱讀 213評(píng)論 0 0