Sleuth 簡(jiǎn)介
隨著業(yè)務(wù)的發(fā)展,系統(tǒng)規(guī)模變得越來(lái)越大,微服務(wù)拆分越來(lái)越細(xì),各微服務(wù)間的調(diào)用關(guān)系也越來(lái)越復(fù)雜??蛻舳苏?qǐng)求在后端系統(tǒng)中會(huì)經(jīng)過(guò)多個(gè)不同的微服務(wù)調(diào)用來(lái)協(xié)同產(chǎn)生最后的請(qǐng)求結(jié)果,幾平每一個(gè)請(qǐng)求都會(huì)形成一個(gè)復(fù)雜的分布式服務(wù)調(diào)用鏈路,在每條鏈路中任何一個(gè)依賴服務(wù)出現(xiàn)延遲超時(shí)或者錯(cuò)誤都有可能引起整個(gè)請(qǐng)求最后的失敗
這時(shí)需要一個(gè)能夠監(jiān)控微服務(wù)整個(gè)調(diào)用鏈的工具,跟蹤一個(gè)用戶請(qǐng)求的全過(guò)程(包括數(shù)據(jù)采集、數(shù)據(jù)傳輸、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析、數(shù)據(jù)可視化),捕獲這些跟蹤數(shù)據(jù),構(gòu)建微服務(wù)整個(gè)調(diào)用鏈的視圖,Spring Cloud Sleuth 就是這樣一個(gè)工具
服務(wù)追蹤系統(tǒng)的實(shí)現(xiàn)主要包括三個(gè)部分:
- 埋點(diǎn)數(shù)據(jù)收集:負(fù)責(zé)在服務(wù)端進(jìn)行埋點(diǎn),以收集服務(wù)調(diào)用的上下文數(shù)據(jù)
- 實(shí)時(shí)數(shù)據(jù)處理:負(fù)責(zé)將收集到的鏈路信息按照 Traccld 和 Spanld 進(jìn)行串聯(lián)和存儲(chǔ)
- 數(shù)據(jù)鏈路展示:把處理后的服務(wù)調(diào)用數(shù)據(jù)按照調(diào)用鏈的形式展示出來(lái)
下面我們?cè)賮?lái)看一下 Sleuth 的核心概念
- Trace:一組 Span 的集合,表示一條調(diào)用鏈路,例如,服務(wù) A 調(diào)用服務(wù) B,再調(diào)用服務(wù) C,A-B-C 鏈路就是一條 Trace,每個(gè)服務(wù)(例如 B)就是一個(gè)Span,如果在服務(wù) B 中再加入兩個(gè)線程,分別調(diào)用了 D、E,那么 D、E 就是 B 的子 Span
- TraceId:全局跟蹤 ID,用來(lái)標(biāo)記一次完整服務(wù)調(diào)用,所以一次服務(wù)調(diào)用相關(guān)的 Span 的 Traceld 都是相同的
- Span:基本工作單元,通過(guò) 64 位 ID 唯一標(biāo)識(shí),Span 還包含其他數(shù)據(jù)信息,比如摘要、時(shí)間藏事件、關(guān)鍵值注釋 (tags)、Span 的 ID 以及進(jìn)度 ID(通常是 IP 地址)
- Id:Span 的 ID,只要做到一個(gè) Traceld 下唯一即可
- Parentld:父 Span 的 ID,調(diào)用有層級(jí)關(guān)系,所以 Span 作為調(diào)用節(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu),也有層級(jí)關(guān)系
- Annotation:基本標(biāo)注列表,用來(lái)及時(shí)記錄一個(gè)事件的存在,一個(gè)標(biāo)注可以理解成 Span 生命周期中重要時(shí)刻的數(shù)據(jù)快照,比如一個(gè)標(biāo)注中一般包含發(fā)生時(shí)刻(timestamp)、事件類型(value)、端點(diǎn)(endpoint)等信息,事件類型包括以下幾種:
- cs(Clien Sent):客戶端發(fā)起一個(gè)請(qǐng)求,這個(gè) Annotion 注解描述 Span 的開始
- sr(ServerReceived):服務(wù)端獲得請(qǐng)求并準(zhǔn)備開始處理它,sr 減去 cs 即網(wǎng)絡(luò)延遲時(shí)間
- ss(Server Sent):表明請(qǐng)求處理的完成(請(qǐng)求返回客戶端),ss 減去 sr 即服務(wù)端需要的處理請(qǐng)求時(shí)間
- cr(Client Received):表明 Span 的結(jié)束,客戶端成功接收到服務(wù)端的回復(fù),cr 減去 cs 即客戶端從服務(wù)端獲取回復(fù)的所有時(shí)間
ZipKin 簡(jiǎn)介
Zipkin 是一個(gè)開源的分布式追蹤系統(tǒng),用于對(duì)服務(wù)間的調(diào)用鏈路進(jìn)行監(jiān)控追蹤。在微服務(wù)架購(gòu)下,用戶的一個(gè)請(qǐng)求可能涉及很多個(gè)后臺(tái)服務(wù)間的調(diào)用。Zipkin 可以追蹤(trace)調(diào)用鏈路、收集在各個(gè)微服務(wù)上所花的時(shí)間等信息,并上報(bào)到 Zipkin 服務(wù)器
Zipkin 提供可插拔數(shù)據(jù)存儲(chǔ)方式:In-Memory、MySQL、Cassandra 以及 Elasticsearch,為了方便在開發(fā)環(huán)境直接采用 In-Memory 方式進(jìn)行存儲(chǔ),生產(chǎn)數(shù)據(jù)量大的情況則推薦使用 Elasticsearch
Zipkin 主要由四個(gè)核心組件組成:
- Collector:接收或收集各應(yīng)用傳輸?shù)臄?shù)據(jù)
- Storage:存儲(chǔ)接收或收集過(guò)來(lái)的數(shù)據(jù),當(dāng)前支持 Memory、MySQL、Cassandra、ElasticSearch 等,默認(rèn)存儲(chǔ)在內(nèi)存中
- API(Query):負(fù)責(zé)查詢 Storage 中存儲(chǔ)的數(shù)據(jù),提供簡(jiǎn)單的 JSON API 獲取數(shù)據(jù),主要提供給 Web UI 使用
- UI:官方默認(rèn)提供的一個(gè)圖形用戶界面
Zipkin 以 Trace 結(jié)構(gòu)表示對(duì)一次請(qǐng)求的追蹤,把每個(gè) Trace 拆分為若于個(gè)有依賴關(guān)系的 Span,可以把每個(gè)處理請(qǐng)求的服務(wù)理解為一個(gè) Span。Zipkin 除了可以查看 Span 的依賴關(guān)系之外,還以瀑布圖的形式顯示每個(gè) Span 的耗時(shí)情況,可以清晰地看到各個(gè)服務(wù)的性能狀況。打開每個(gè) Span,還有更詳細(xì)的數(shù)據(jù)以鍵值對(duì)的形式呈現(xiàn),而且這些數(shù)據(jù)可以在裝備應(yīng)用的時(shí)候自行添加
Zipkin 下載地址:https://repo1.maven.org/maven2/io/zipkin/zipkin-server/
這里選擇 zipkin-server-2.24.3-exec.jar 版本,既然是一個(gè) jar 包,那么直接使用 java 命令運(yùn)行即可,訪問(wèn):http://localhost:9411/zipkin/ 可查看控制臺(tái)
如果使用 MySQL 進(jìn)行數(shù)據(jù)存儲(chǔ),需要事先搭建好 MySQL 數(shù)據(jù)庫(kù),執(zhí)行建表腳本,可在 GitHub 獲?。篽ttps://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
啟動(dòng) ZipKin,連接 MySQL,具體啟動(dòng)命令如下:
java -jar .\zipkin-server-2.24.3-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=test_db --MYSQL_USER=root --MYSQL_PASS=123
Spring Cloud Sleuth 整合 ZipKin
在 server-01 和 server-02 項(xiàng)目分別添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
在 server-01 和 server-02 項(xiàng)目分別添加配置
spring:
zipkin:
base-url: http://localhost:9411
enabled: true
sleuth:
enabled: true
如果 spring-cloud-sleuth-zipkin 位于類路徑中,則該應(yīng)用程序會(huì)生成并收集與 Zipkin 兼容的 Trace,默認(rèn)情況下,應(yīng)用程序通過(guò) HTTP 將 ace 信息發(fā)送到本地主機(jī)(端口 9411)上的 ZipKin 服務(wù)器,可以通過(guò)設(shè)置 spring.zipkin.base-url 來(lái)配置服務(wù)的地址
在 server-01 使用 Feign 調(diào)用 server-02 接口文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-711774.html
// server-01
@Slf4j
@RestController
public class TestCon {
@Autowired
private Server02FeignClient server02FeignClient;
@GetMapping("/test/getConfigByFeign")
public void getConfigByFeign() {
server02FeignClient.getConfig();
}
}
// server-02
@Slf4j
@RestController
public class TestCon {
@Value("${test.value}")
private String testValue;
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private String port;
@GetMapping("/test/getConfig")
public void getConfig() {
log.info("testValue: {} by {}-{}", testValue, applicationName, port);
}
}
查看 ZipKin 控制臺(tái),選擇 Dependencies 選項(xiàng)卡,點(diǎn)擊 RUN QUERY 查看具體請(qǐng)求鏈路,選擇 Find a trace 選項(xiàng)卡,單擊 RUN QUERY,可查看具體的請(qǐng)求信息文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711774.html
到了這里,關(guān)于服務(wù)鏈路追蹤 —— SpringCloud Sleuth的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!