Sleuth官網(wǎng)地址? ?http://cloud.spring.io/spring-cloud-static/Camden.SR7/#_spring_cloud_sleuth
? ? ? ? 微服務(wù)之間是通過輕量級的通訊協(xié)議進(jìn)行通信祭芦,而網(wǎng)絡(luò)常常也相對脆弱、網(wǎng)絡(luò)資源也相當(dāng)有限憔鬼。 如果我們能夠跟蹤每一個請求龟劲,了解請 求經(jīng)過哪些微服務(wù)、請求的耗時轴或、網(wǎng)絡(luò)延遲昌跌、業(yè)務(wù)邏輯耗時這些指標(biāo),這樣我們就能夠更好的分析系統(tǒng)的瓶頸照雁、針對的解決系統(tǒng)問題蚕愤。因此、我們微服務(wù)體系中加上跟蹤還是很有必要的饺蚊。
RabbitMQ用于的微服務(wù)和Zipkin服務(wù)端的通信(取代微服務(wù)和Zipkin服務(wù)端通過http通信萍诱,實現(xiàn)了微服務(wù)和Zipkin服務(wù)端的解耦,微服務(wù)不需要知道Zipkin服務(wù)端的網(wǎng)絡(luò)地址污呼,一些情況下微服務(wù)可能和Zipkin服務(wù)端網(wǎng)絡(luò)不通(Zipkin服務(wù)端宕機(jī))裕坊,使用http通信收集方式將無法工作)
Zipkin提供了一個很友好的界面、利于分析追蹤數(shù)據(jù)(沒有嘗試過使用elk分析追蹤數(shù)據(jù)(不再需要zipkin服務(wù)端燕酷,直接分析日志數(shù)據(jù)))籍凝。
Mysql或Elasticsearch實現(xiàn)了追蹤數(shù)據(jù)的持久化(Zipkin默認(rèn)是將追蹤數(shù)據(jù)存在內(nèi)存中,如服務(wù)端重啟或宕機(jī)苗缩,會導(dǎo)致歷史數(shù)據(jù)丟失饵蒂,所以追蹤數(shù)據(jù)持久化很有必要).
Spring Cloud Sleuth 提供了一套分布式跟蹤解決方案,先了解一下它的術(shù)語:
Span:基本工作單元挤渐,例如苹享,在一個新建的span中發(fā)送一個RPC等同于發(fā)送一個回應(yīng)請求給RPC,span通過一個64位ID唯一標(biāo)識,trace以另一個64位ID表示得问,span還有其他數(shù)據(jù)信息囤攀,比如摘要、時間戳事件宫纬、關(guān)鍵值注釋(tags)焚挠、span的ID、以及進(jìn)度ID(通常是IP地址)
span在不斷的啟動和停止漓骚,同時記錄了時間信息蝌衔,當(dāng)你創(chuàng)建了一個span,你必須在未來的某個時刻停止它蝌蹂。
Trace:一系列spans組成的一個樹狀結(jié)構(gòu)噩斟,例如,如果你正在跑一個分布式大數(shù)據(jù)工程孤个,你可能需要創(chuàng)建一個trace剃允。
Annotation:用來及時記錄一個事件的存在,一些核心annotations用來定義一個請求的開始和結(jié)束
cs ? - Client Sent -客戶端發(fā)起一個請求齐鲤,這個annotion描述了這個span的開始
sr ? - Server Received -服務(wù)端獲得請求并準(zhǔn)備開始處理它斥废,如果將其sr減去cs時間戳便可得到網(wǎng)絡(luò)延遲
ss ?- Server Sent -注解表明請求處理的完成(當(dāng)請求返回客戶端),如果ss減去sr時間戳便可得到服務(wù)端需要的處理請求時間
cr ?- Client Received -表明span的結(jié)束给郊,客戶端成功接收到服務(wù)端的回復(fù)牡肉,如果cr減去cs時間戳便可得到客戶端從服務(wù)端獲取回復(fù)的所有所需時間
將Span和Trace在一個系統(tǒng)中使用Zipkin注解的過程圖形化:
原有微服務(wù)整合Spring Cloud Sleuth Zipkin 和 RabbitMQ
對原有微服務(wù)只要加依賴和配置就可以了
1. ?在需要跟蹤的微服務(wù)pom中添加如下依賴:
2. ?在其配置文件中加入rabbitmq和sleuth的配置:
spring.sleuth.sampler.percentage:指定需要取樣的請求百分比统锤,默認(rèn)值是0.1,分布式系統(tǒng)中吩屹,數(shù)據(jù)量也許會應(yīng)該大跪另。所以,可以根據(jù)各自的項目情況煤搜,設(shè)置合適的采樣非常重要免绿。這里因為是開發(fā)階段,我把采樣設(shè)置成了1.0擦盾,即100%嘲驾。
如果不使用中間件(rabbitmq),還需要配置一個參數(shù)指定Zipkin服務(wù)器地址(默認(rèn)訪問http://localhost:9411)
spring.zipkin.base-url:http://192.168.1.178:9411
這里配置的地址需改成自己設(shè)置的Zipkin地址迹卢。
Zipkin服務(wù)端:
1. 創(chuàng)建一個artifactId為zipkin-service 的Maven工程辽故,并為項目添加如下pom依賴:
如果使用mysql做數(shù)據(jù)的持久化的話誊垢,這兩個依賴不能少掉弛。
2. 編寫配置文件,在application.yml中添加如下內(nèi)容:
zipkin.storage.type配置持久化類型,這里配置了elasticsearch芋肠,如果要使用mysql的話乎芳,需改為mysql
3. 編寫啟動類,使用@EnableZipkinStreamServer注解帖池,生命一個Zipkin Server奈惑。
我這里加了@EnableDiscoveryClient注解,把 zipkin-service也當(dāng)成微服務(wù)注冊
4. Zipkin界面介紹
可以根據(jù)時間睡汹、微服務(wù)肴甸、請求類型等刷選trace列表
可視化界面有利于我們分析為服務(wù)之間的依賴關(guān)系,可以選擇時間來刷選
5. elasticsearch
elasticsearch的安裝部署這里就不說了
6. mysql
Zipkin的jar包中有個mysql.sql文件帮孔,用于初始化數(shù)據(jù)庫表結(jié)構(gòu) 雷滋。
初次寫文章,如有錯誤文兢、疏漏請大家多多包涵指教。(由于不知道代碼如何在簡書上展示焕檬,所以全部是截圖的)
QQ:656765117 ? ? ?郵件:hz656765117@163.com ??
附上Zipkin服務(wù)端代碼: http://git.oschina.net/huangzhuo92/zipkin-service