??為什么要服務(wù)追蹤?我們?cè)陂_發(fā)中經(jīng)常會(huì)碰到這樣的問題,我們調(diào)用別人的服務(wù)A耗時(shí)很多,這個(gè)時(shí)候我就去聯(lián)系服務(wù)A的負(fù)責(zé)人讓他幫排查下問題所在,但是服務(wù)A的負(fù)責(zé)人也很頭疼,說他的服務(wù)也調(diào)用了別人的服務(wù)B、C、D等等,那這個(gè)時(shí)候排查就非常麻煩了,所以我們需要進(jìn)行服務(wù)追蹤~
1.Spring Cloud Sleuth
1.1pom.xml
<!--包含sleuth和zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
1.2yaml配置文件
spring:
zipkin:
base-url: http://zipkin:9411/
sender:
type: web
sleuth:
sampler:
probability: 1
??這里多講一個(gè)就是sampler.probability,是因?yàn)樵诎l(fā)生服務(wù)調(diào)用的時(shí)候,sleuth會(huì)通過采樣的方式來獲取服務(wù)調(diào)用時(shí)間的,sleuth默認(rèn)是10%的抽樣統(tǒng)計(jì),為什么只有10%,假設(shè)說每個(gè)請(qǐng)求調(diào)用都進(jìn)行采樣的,會(huì)耗費(fèi)系統(tǒng)的性能,所以默認(rèn)10%,但是我們這里為了方便觀察,將采樣率寫成了100%
1.3啟動(dòng)zipkin Server
??這里建議大家使用docker來啟動(dòng)zipkin Server非常快速
2.分布式追蹤系統(tǒng)
2.1核心步驟
2.1.1數(shù)據(jù)采集
??數(shù)據(jù)采集過程中,由于各個(gè)系統(tǒng)的API不兼容,導(dǎo)致如果我們希望切換追蹤系統(tǒng),往往會(huì)有很大的改動(dòng),因此我們引入了OpenTracing規(guī)范,以解決不同分布式追蹤系統(tǒng)API不兼容的問題。OpenTracing的優(yōu)勢(shì)在于提供了平臺(tái)無關(guān)、廠商無關(guān)的API,使得開發(fā)人員便于切換追蹤系統(tǒng)。OpenTracing來自于大名鼎鼎的CNCF,現(xiàn)有的ZIPKIN、TRACER、JAEGER、GRPC等等都跟進(jìn)OpenTracing。OpenTracing數(shù)據(jù)模型中重要的概念就是trace--調(diào)用鏈,是通過歸屬此調(diào)用鏈的span來定義的。span和trace都是谷歌的開源項(xiàng)目。這里面還有一個(gè)專業(yè)術(shù)語叫Annotation,Annotation是用來即時(shí)記錄一個(gè)事件的,一些核心注解用來定義一個(gè)請(qǐng)求的開始和結(jié)束,可以理解成span生命周期中重要時(shí)刻的數(shù)據(jù)快照,比如一般包含發(fā)生時(shí)刻、事件類型等信息。事件類型一共有四種:
1.cs:客戶端發(fā)起請(qǐng)求的時(shí)間
2.cr:客戶端收到處理完請(qǐng)求的時(shí)間
3.ss:服務(wù)端處理完邏輯的時(shí)間
4.sr:服務(wù)端收到調(diào)用端請(qǐng)求的時(shí)間
所以客戶端調(diào)用時(shí)間=cr-cs,服務(wù)端處理時(shí)間=sr-ss
2.1.2數(shù)據(jù)存儲(chǔ)
2.1.3查詢展示
3.Zipkin
??ZipKin是twitter的開源項(xiàng)目,其架構(gòu)圖如下
ZipKin中的關(guān)鍵東西就是Collector、Storage、API、UI,Collection就是收集調(diào)用新,Storage存儲(chǔ)這些調(diào)用信息,默認(rèn)是放在內(nèi)存中的,如果怕重啟丟失可以放到數(shù)據(jù)庫中,API是暴露給外部訪問采集統(tǒng)計(jì)信息的,UI是為了方便展示數(shù)據(jù)采樣相信的模塊。下圖是zipkinUI的一個(gè)截圖:
3.1zipkin中的幾個(gè)關(guān)鍵概念
3.1.1traceId
??全局的跟蹤Id,是跟蹤的入口點(diǎn),根據(jù)需求來決定在哪里生成traceId,比如我們常見的一個(gè)Http請(qǐng)求,入口是web應(yīng)用,結(jié)束點(diǎn)就是請(qǐng)求的返回點(diǎn)。
3.1.2spanId
??下一層的請(qǐng)求跟蹤Id,一個(gè)traceId可以包含一個(gè)以上的spanId。
3.1.3parentId
??上一次請(qǐng)求跟蹤Id,用來將前后請(qǐng)求串聯(lián)起來。