Spring Cloud Sleuth
一般的,一個(gè)分布式服務(wù)跟蹤系統(tǒng)占业,主要有三部分:數(shù)據(jù)收集、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)展示纯赎。根據(jù)系統(tǒng)大小不同谦疾,每一部分的結(jié)構(gòu)又有一定變化。譬如犬金,對(duì)于大規(guī)模分布式系統(tǒng)念恍,數(shù)據(jù)存儲(chǔ)可分為實(shí)時(shí)數(shù)據(jù)和全量數(shù)據(jù)兩部分,實(shí)時(shí)數(shù)據(jù)用于故障排查(troubleshooting)晚顷,全量數(shù)據(jù)用于系統(tǒng)優(yōu)化峰伙;數(shù)據(jù)收集除了支持平臺(tái)無(wú)關(guān)和開發(fā)語(yǔ)言無(wú)關(guān)系統(tǒng)的數(shù)據(jù)收集,還包括異步數(shù)據(jù)收集(需要跟蹤隊(duì)列中的消息该默,保證調(diào)用的連貫性)瞳氓,以及確保更小的侵入性;數(shù)據(jù)展示又涉及到數(shù)據(jù)挖掘和分析栓袖。雖然每一部分都可能變得很復(fù)雜匣摘,但基本原理都類似。
服務(wù)追蹤的追蹤單元是從客戶發(fā)起請(qǐng)求(request)抵達(dá)被追蹤系統(tǒng)的邊界開始裹刮,到被追蹤系統(tǒng)向客戶返回響應(yīng)(response)為止的過程音榜,稱為一個(gè)“trace”。每個(gè) trace 中會(huì)調(diào)用若干個(gè)服務(wù)捧弃,為了記錄調(diào)用了哪些服務(wù)赠叼,以及每次調(diào)用的消耗時(shí)間等信息,在每次調(diào)用服務(wù)時(shí)违霞,埋入一個(gè)調(diào)用記錄嘴办,稱為一個(gè)“span”。這樣葛家,若干個(gè)有序的 span 就組成了一個(gè) trace户辞。在系統(tǒng)向外界提供服務(wù)的過程中,會(huì)不斷地有請(qǐng)求和響應(yīng)發(fā)生癞谒,也就會(huì)不斷生成 trace,把這些帶有span 的 trace 記錄下來刃榨,就可以描繪出一幅系統(tǒng)的服務(wù)拓?fù)鋱D弹砚。附帶上 span 中的響應(yīng)時(shí)間,以及請(qǐng)求成功與否等信息枢希,就可以在發(fā)生問題的時(shí)候桌吃,找到異常的服務(wù);根據(jù)歷史數(shù)據(jù)苞轿,還可以從系統(tǒng)整體層面分析出哪里性能差茅诱,定位性能優(yōu)化的目標(biāo)逗物。
- Span:基本工作單元,例如瑟俭,在一個(gè)新建的span中發(fā)送一個(gè)RPC等同于發(fā)送一個(gè)回應(yīng)請(qǐng)求給RPC翎卓,span通過一個(gè)64位ID唯一標(biāo)識(shí),trace以另一個(gè)64位ID表示摆寄,span還有其他數(shù)據(jù)信息失暴,比如摘要、時(shí)間戳事件微饥、關(guān)鍵值注釋(tags)逗扒、span的ID、以及進(jìn)度ID(通常是IP地址) span在不斷的啟動(dòng)和停止欠橘,同時(shí)記錄了時(shí)間信息矩肩,當(dāng)你創(chuàng)建了一個(gè)span,你必須在未來的某個(gè)時(shí)刻停止它肃续。
- Trace:一系列spans組成的一個(gè)樹狀結(jié)構(gòu)黍檩,例如,如果你正在跑一個(gè)分布式大數(shù)據(jù)工程痹升,你可能需要?jiǎng)?chuàng)建一個(gè)trace建炫。
- Annotation:用來及時(shí)記錄一個(gè)事件的存在,一些核心annotations用來定義一個(gè)請(qǐng)求的開始和結(jié)束
- CS - Client Sent -客戶端發(fā)起一個(gè)請(qǐng)求疼蛾,這個(gè)annotion描述了這個(gè)span的開始
- SR - Server Received -服務(wù)端獲得請(qǐng)求并準(zhǔn)備開始處理它肛跌,如果將其sr減去cs時(shí)間戳便可得到網(wǎng)絡(luò)延遲
- SS - Server Sent -注解表明請(qǐng)求處理的完成(當(dāng)請(qǐng)求返回客戶端),如果ss減去sr時(shí)間戳便可得到服務(wù)端需要的處理請(qǐng)求時(shí)間
- CR - Client Received -表明span的結(jié)束察郁,客戶端成功接收到服務(wù)端的回復(fù)衍慎,如果cr減去cs時(shí)間戳便可得到客戶端從服務(wù)端獲取回復(fù)的所有所需時(shí)間
Spring Cloud Sleuth的概念圖::
Sleuth作用:
- 耗時(shí)分析: 通過Sleuth可以很方便的了解到每個(gè)采樣請(qǐng)求的耗時(shí),從而分析出哪些服務(wù)調(diào)用比較耗時(shí);
- 可視化錯(cuò)誤: 對(duì)于程序未捕捉的異常皮钠,可以通過集成Zipkin服務(wù)界面上看到;
- 鏈路優(yōu)化: 對(duì)于調(diào)用比較頻繁的服務(wù)稳捆,可以針對(duì)這些服務(wù)實(shí)施一些優(yōu)化措施。
spring cloud sleuth可以結(jié)合zipkin麦轰,將信息發(fā)送到zipkin乔夯,利用zipkin的存儲(chǔ)來存儲(chǔ)信息,利用zipkin ui來展示數(shù)據(jù)款侵。接下來簡(jiǎn)單介紹一下zipkin:
ZipKin
Zipkin 是一個(gè)開放源代碼分布式的跟蹤系統(tǒng)末荐,由Twitter公司開源,它致力于收集服務(wù)的定時(shí)數(shù)據(jù)新锈,以解決微服務(wù)架構(gòu)中的延遲問題甲脏,包括數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn)块请。
每個(gè)服務(wù)向zipkin報(bào)告計(jì)時(shí)數(shù)據(jù)娜氏,zipkin會(huì)根據(jù)調(diào)用關(guān)系通過Zipkin UI生成依賴關(guān)系圖,顯示了多少跟蹤請(qǐng)求通過每個(gè)服務(wù)墩新,該系統(tǒng)讓開發(fā)者可通過一個(gè) Web 前端輕松的收集和分析數(shù)據(jù)贸弥,例如用戶每次請(qǐng)求服務(wù)的處理時(shí)間等,可方便的監(jiān)測(cè)系統(tǒng)中存在的瓶頸抖棘。
Zipkin提供了可插拔數(shù)據(jù)存儲(chǔ)方式:In-Memory茂腥、MySql、Cassandra以及Elasticsearch切省。接下來的測(cè)試為方便直接采用In-Memory方式進(jìn)行存儲(chǔ)最岗,生產(chǎn)推薦Elasticsearch。
- 引入依賴:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
</dependencies>
- 啟動(dòng)類:
使用@EnableZipkinServer注解朝捆,啟用Zipkin服務(wù)般渡。
@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class ZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}
- 配置文件:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 9000
spring:
application:
name: zipkin-server
配置完成后依次啟動(dòng)eureka、zipkin-server項(xiàng)目芙盘。訪問地址http://localhost:9000/zipkin/
即可看到Zipkin后臺(tái)頁(yè)面驯用。
- 在項(xiàng)目中添加zipkin支持:
先引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Spring應(yīng)用在監(jiān)測(cè)到Java依賴包中有sleuth和zipkin后,會(huì)自動(dòng)在RestTemplate的調(diào)用過程中向HTTP請(qǐng)求注入追蹤信息儒老,并向Zipkin Server發(fā)送這些信息蝴乔。
同時(shí)修改配置文件:
spring:
zipkin:
base-url: http://localhost:9000
sleuth:
sampler:
percentage: 1.0
- spring.zipkin.base-url指定了Zipkin服務(wù)器的地址
- spring.sleuth.sampler.percentage將采樣比例設(shè)置為1.0,說明全部都需要驮樊。
Spring Cloud Sleuth有一個(gè)Sampler策略薇正,可以通過這個(gè)實(shí)現(xiàn)類來控制采樣算法。采樣器不會(huì)阻礙span相關(guān)id的產(chǎn)生囚衔,但是會(huì)對(duì)導(dǎo)出以及附加事件標(biāo)簽的相關(guān)操作造成影響挖腰。 Sleuth默認(rèn)采樣算法的實(shí)現(xiàn)是Reservoir sampling,具體的實(shí)現(xiàn)類是PercentageBasedSampler练湿,默認(rèn)的采樣比例為: 0.1(即10%)猴仑。不過我們可以通過spring.sleuth.sampler.percentage來設(shè)置,所設(shè)置的值介于0.0到1.0之間肥哎,1.0則表示全部采集辽俗。
配置完成后啟動(dòng)項(xiàng)目,嘗試訪問服務(wù)篡诽,再進(jìn)入http://localhost:9000/zipkin/
查看追蹤記錄即可榆苞。