Spring Cloud Sleuth
Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案贮尉,并且兼容支持了 zipkin,你只需要在pom文件中引入相應(yīng)的依賴即可哥谷。
微服務(wù)架構(gòu)上通過業(yè)務(wù)來劃分服務(wù)的,通過REST調(diào)用概而,對外暴露的一個接口呼巷,可能需要很多個服務(wù)協(xié)同才能完成這個接口功能,如果鏈路上任何一個服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)超時赎瑰,都會形成導(dǎo)致接口調(diào)用失敗王悍。
隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會越來越復(fù)雜餐曼。
Spring Cloud Sleuth的專業(yè)術(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注解的過程圖形化:
Spring Cloud Zipkin
Spring cloud提供了spring-cloud-sleuth-zipkin來方便集成zipkin實現(xiàn)染厅,Zipkin是Twitter的一個開源項目,它基于Google Dapper實現(xiàn)津函。
我們可以使用它來收集各個服務(wù)器上請求鏈路的跟蹤數(shù)據(jù)肖粮,并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實現(xiàn)對分布式系統(tǒng)的監(jiān)控程序,從而及時地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源尔苦。
除了面向開發(fā)的API接口之外涩馆,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請求鏈路明細(xì)。
上圖展示了Zipkin的基礎(chǔ)架構(gòu)允坚,它主要有4個核心組件構(gòu)成:
- Collector:收集器組件魂那,它主要用于處理從外部系統(tǒng)發(fā)送過來的跟蹤信息,將這些信息轉(zhuǎn)換為Zipkin內(nèi)部處理的Span格式稠项,以支持后續(xù)的存儲涯雅、分析、展示等功能展运。
- Storage:存儲組件活逆,它主要對處理收集器接收到的跟蹤信息,默認(rèn)會將這些信息存儲在內(nèi)存中拗胜,我們也可以修改此存儲策略蔗候,通過使用其他存儲組件將跟蹤信息存儲到數(shù)據(jù)庫中。
- RESTful API:API組件埂软,它主要用來提供外部訪問接口锈遥。比如給客戶端展示跟蹤信息,或是外接系統(tǒng)訪問以實現(xiàn)監(jiān)控等勘畔。
- Web UI:UI組件所灸,基于API組件實現(xiàn)的上層應(yīng)用。通過UI組件用戶可以方便而有直觀地查詢和分析跟蹤信息咖杂。
新建一個基礎(chǔ)Spring的Maven Moudle工程命名為zipkin庆寺,引用所需的依賴:
<parent>
<groupId>com.wkedong.springcloud</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
這里依賴了zipkin相關(guān)的服務(wù)和Mysql數(shù)據(jù)庫(zipkin數(shù)據(jù)存入數(shù)據(jù)庫進(jìn)行持久化保存)
注:需要支持zipkin追蹤的應(yīng)用需要在pom文件里依賴以下內(nèi)容,這里不一一贅述
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
application.yml
配置文件如下:
server:
port: 6040
spring:
application:
name: zipkin
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_cloud_zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
接下來我們修改應(yīng)用主類:
/**
* @author wkedong
*/
@EnableZipkinServer
@SpringBootApplication
public class ZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}
@EnableZipkinServer
注解表示該應(yīng)用為zipkin服務(wù)
啟動該應(yīng)用并訪問http://localhost:6040 ,出現(xiàn)zipkin查看的UI圖形頁面:
啟動Eureka诉字,Config懦尝,ServiceProducer知纷,ServiceConsumer并訪問Consumer接口/testGet接口,觀察控制臺輸出
- Consumer下輸出:
2019-02-16 09:45:35.717 INFO [service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true] 16052 --- [nio-7010-exec-1] c.w.s.s.controller.ConsumerController : ===<call testGet>===
- Producer下輸出:
2019-02-16 09:45:36.177 INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.controller.ProducerController : ===<call testGet>===
2019-02-16 09:45:36.177 INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.s.impl.ProducerServiceImpl : /testGet, instanceId:HANWEB-PC:service-producer:6070, host:HANWEB-PC
從上面的控制臺輸出內(nèi)容中陵霉,我們可以看到多了一些形如[service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true]的日志信息琅轧,而這些元素正是實現(xiàn)分布式服務(wù)跟蹤的重要組成部分,它們每個值的含義如下:
- 第一個值:service-consumer踊挠,它記錄了應(yīng)用的名稱乍桂,也就是application.properties中spring.application.name參數(shù)配置的屬性。
- 第二個值:b97e2da610e3a31a效床,Spring Cloud Sleuth生成的一個ID睹酌,稱為Trace ID,它用來標(biāo)識一條請求鏈路剩檀。一條請求鏈路中包含一個Trace ID憋沿,多個Span ID。
- 第三個值:b97e2da610e3a31a沪猴,Spring Cloud Sleuth生成的另外一個ID辐啄,稱為Span ID,它表示一個基本的工作單元运嗜,比如:發(fā)送一個HTTP請求壶辜。
- 第四個值:true,表示是否要將該信息輸出到Zipkin等服務(wù)中來收集和展示担租。(這里有些人可能是false砸民,因為在各個應(yīng)用配置文件中sleuth:sampler:percentage: #zipkin收集率為配置,未配置的默認(rèn)值為0.1即10%的收集率翩活,改為1即可100%收集)
上面四個值中的Trace ID和Span ID是Spring Cloud Sleuth實現(xiàn)分布式服務(wù)跟蹤的核心阱洪。
在一次服務(wù)請求鏈路的調(diào)用過程中,會保持并傳遞同一個Trace ID菠镇,從而將整個分布于不同微服務(wù)進(jìn)程中的請求跟蹤信息串聯(lián)起來冗荸,以上面輸出內(nèi)容為例,service-consumer和service-producer同屬于一個前端服務(wù)請求來源利耍,所以他們的Trace ID是相同的蚌本,處于同一條請求鏈路中。
-
現(xiàn)在查看zipkin管理頁面:
-
可以看到多了一個訪問Traces記錄隘梨,點擊進(jìn)去:
得到Sleuth收集到的跟蹤到詳細(xì)信息程癌,其中包括了請求服務(wù)名,請求接口轴猎,請求時間消耗等嵌莉。
-
點擊依賴分析:
查看Zipkin Server根據(jù)跟蹤信息分析生成的系統(tǒng)請求鏈路依賴關(guān)系圖
文章目錄:
整體demo的GitHub地址:Spring-Cloud