本文轉(zhuǎn)載自:https://www.datawisher.cn/
什么是分布式追蹤
微服務(wù)的主要挑戰(zhàn)之一是調(diào)試問題和監(jiān)視問題的能力道伟。一個(gè)簡(jiǎn)單的操作可以觸發(fā)一系列的微服務(wù)調(diào)用,在被調(diào)用的微服務(wù)中跟蹤這些操作是非常繁瑣的。這是因?yàn)槊總€(gè)微服務(wù)都在與其他微服務(wù)隔離的環(huán)境中運(yùn)行,因此它們不會(huì)共享數(shù)據(jù)庫或日志文件等資源。除此之外赤套,我們可能還需要跟蹤為什么某個(gè)微服務(wù)調(diào)用在給定的業(yè)務(wù)流中花費(fèi)了如此多的時(shí)間。
分布式跟蹤模式解決了開發(fā)人員在構(gòu)建微服務(wù)時(shí)面臨的上述挑戰(zhàn)珊膜。在使用Spring Boot和Spring Cloud框架創(chuàng)建微服務(wù)時(shí),有一些有用的開源工具可用于分布式跟蹤宣脉。
Spring Cloud Sleuth: 一個(gè)Spring Cloud庫车柠,通過在HTTP請(qǐng)求頭文件上添加trace和span id,可以跟蹤后續(xù)微服務(wù)的進(jìn)度塑猖。該庫基于MDC(映射診斷上下文)概念竹祷,可以輕松提取放入上下文中的值并將它們顯示在日志中。
Zipkin: 基于java的分布式跟蹤應(yīng)用程序羊苟,幫助收集獨(dú)立服務(wù)之間傳播的每個(gè)請(qǐng)求的時(shí)間數(shù)據(jù)塑陵。它有一個(gè)簡(jiǎn)單的管理控制臺(tái),我們可以在其中看到后續(xù)服務(wù)生成的時(shí)間統(tǒng)計(jì)信息的可視化蜡励。
ELK棧: 三個(gè)開源工具- Elasticsearch, Logstash和Kibana組成了ELK棧令花。它們用于實(shí)時(shí)搜索阻桅、分析和可視化日志數(shù)據(jù)。Elasticsearch是一個(gè)搜索和分析引擎兼都。Logstash是一個(gè)服務(wù)器端數(shù)據(jù)處理管道嫂沉,它同時(shí)從多個(gè)源獲取數(shù)據(jù),對(duì)其進(jìn)行轉(zhuǎn)換扮碧,然后將其發(fā)送給Elasticsearch存儲(chǔ)趟章。Kibana讓我們用圖表和圖形來可視化這些數(shù)據(jù)。
如何把他們整合到一起工作
當(dāng)進(jìn)行HTTP調(diào)用時(shí)慎王,該調(diào)用被Sleuth截獲蚓土,并將必要的標(biāo)記添加到請(qǐng)求頭中。服務(wù)接收到HTTP響應(yīng)后赖淤,將數(shù)據(jù)異步發(fā)送到Zipkin蜀漆,以防止與跟蹤系統(tǒng)相關(guān)的延遲或故障延遲或破壞流。
Sleuth將兩種類型的ID添加到日志文件中漫蛔,一種稱為trace ID嗜愈,另一種稱為span ID。span ID表示基本的工作單元莽龟,例如發(fā)送HTTP請(qǐng)求蠕嫁。trace ID包含一組span ID,形成樹狀結(jié)構(gòu)毯盈。當(dāng)一個(gè)微服務(wù)調(diào)用下一個(gè)微服務(wù)時(shí)剃毒,trace ID將保持不變。
為方便起見搂赋,本例中的日志直接發(fā)布到Logstash赘阀,但是我們也可以使用Beats。Beats是一個(gè)簡(jiǎn)單的數(shù)據(jù)傳送器脑奠,它要么位于服務(wù)器上基公,要么位于容器上,監(jiān)聽日志文件的位置宋欺,然后將它們發(fā)送到Logstash進(jìn)行轉(zhuǎn)換轰豆,或發(fā)送到Elasticsearch。
安裝
1. 安裝Zipkin
curl -sSL https://zipkin.io/quickstart.sh | bash -sjava -jar zipkin.jar
通過訪問http://localhost:9411/zipkin/ 上的Zipkin web接口來驗(yàn)證設(shè)置齿诞。
2. 安裝ELK棧
在官網(wǎng)下載ELK, https://www.elastic.co/cn/start
$ bin/elasticsearch
$ bin/kibana
創(chuàng)建 logstash-microserver.conf 文件
input {
tcp {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
manage_template => false
index => "logstash-local"
}
}
端口5601上啟動(dòng)Kibana酸休,在端口9200上啟動(dòng)ElasticSearch,在端口5044上啟動(dòng)LogStash祷杈。
通過訪問 http://localhost:5601 上的web控制臺(tái)來驗(yàn)證kibana設(shè)置斑司。
使用下面的curl命令驗(yàn)證Elasticsearch
至此,所有安裝完成但汞!
項(xiàng)目實(shí)戰(zhàn)
創(chuàng)建3個(gè)微服務(wù)
microserver-amanda(28081)
microserver-bastone (28082)
microserver-cospa (28083)
修改 pom.xml
添加Sleuth和Zipkin依賴, 同時(shí)添加logstashd的logback依賴宿刮。
<!-- Zipkin and Sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- 添加了Zipkin的話互站,Sleuth可以不用重復(fù)依賴了 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- Dependencies for LogStash -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
配置 application.properties
推送數(shù)據(jù)到Zipkin
# Zipkin info
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.sampler.probability=1
修改 logback.xml
推送日志到Logstash。appender使用異步TCP將運(yùn)行在端口5044上的所有日志發(fā)布到Logstash糙置。同樣云茸,Beats也可以用于將日志發(fā)送到Logstash。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<mdc/>
<context/>
<version/>
<logLevel/>
<loggerName/>
<message/>
<pattern>
<pattern>
{
"appName": "microserver-amanda"
}
</pattern>
</pattern>
<threadName/>
<stackTrace/>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="logstash"/>
</root>
<logger name="org.springframework" level="INFO"/>
<logger name="com.explore" level="INFO"/>
</configuration>
所有需要使用分布式跟蹤功能的服務(wù)谤饭,都需要按上面的就行修改配置标捺。
運(yùn)行所有服務(wù)
在kibana上創(chuàng)建index,名叫logstash-local
揉抵,可通過過濾條件查看所有日志亡容。
zipkin顯示的鏈路追蹤圖