?? 學(xué)技術(shù)、更要掌握學(xué)習(xí)的方法,一起學(xué)習(xí),讓進(jìn)步發(fā)生
???? 作者:一只IT攻城獅 ,關(guān)注我,不迷路 。
??學(xué)習(xí)建議:1、養(yǎng)成習(xí)慣,學(xué)習(xí)java的任何一個(gè)技術(shù),都可以先去官網(wǎng)先看看,更準(zhǔn)確、更專業(yè)。
??學(xué)習(xí)建議:2、然后記住每個(gè)技術(shù)最關(guān)鍵的特性(通常一句話或者幾個(gè)字),從主線入手,由淺入深學(xué)習(xí)。
?? 《SpringCloud入門(mén)實(shí)戰(zhàn)系列》解鎖SpringCloud主流組件入門(mén)應(yīng)用及關(guān)鍵特性。帶你了解SpringCloud主流組件,是如何一戰(zhàn)解決微服務(wù)諸多難題的。
???? ???? ???? SpringCloud 入門(mén)實(shí)戰(zhàn)系列不迷路 ???? ????????:
- SpringCloud 入門(mén)實(shí)戰(zhàn)(一)什么是SpringCloud?
- SpringCloud 入門(mén)實(shí)戰(zhàn)(二)-SpringCloud項(xiàng)目搭建
- SpringCloud 入門(mén)實(shí)戰(zhàn)(三)-Eureka注冊(cè)中心集成
- SpringCloud入門(mén) 實(shí)戰(zhàn)(四)-Zookeeper、Consul注冊(cè)中心集成
- SpringCloud入門(mén)實(shí)戰(zhàn)(五)-Ribbon負(fù)載均衡集成
- SpringCloud入門(mén)實(shí)戰(zhàn)(六)-OpenFeign服務(wù)調(diào)用集成
- SpringCloud入門(mén)實(shí)戰(zhàn)(七)-Hystrix入門(mén)簡(jiǎn)介
- SpringCloud入門(mén)實(shí)戰(zhàn)(七)-Hystrix服務(wù)降級(jí)
- SpringCloud入門(mén)實(shí)戰(zhàn)(七)-Hystrix服務(wù)熔斷
- SpringCloud入門(mén)實(shí)戰(zhàn)(七)-Hystrix服務(wù)限流
- SpringCloud入門(mén)實(shí)戰(zhàn)(七)-Hystrix Dashboard圖形化監(jiān)控
- SpringCloud入門(mén)實(shí)戰(zhàn)(八)-Gateway服務(wù)網(wǎng)關(guān)集成
- SpringCloud入門(mén)實(shí)戰(zhàn)(九)- Config配置中心
- SpringCloud入門(mén)實(shí)戰(zhàn)(十)- SpringCloud Bus消息總線
- SpringCloud入門(mén)實(shí)戰(zhàn)(十一)- SpringCloud Stream 消息驅(qū)動(dòng)
- SpringCloud入門(mén)實(shí)戰(zhàn)(十二)-Sleuth+Zipkin分布式請(qǐng)求鏈路跟蹤詳解
一、Spring Cloud Sleuth概述
Spring Cloud Sleuth:官網(wǎng)
Spring Cloud Sleuth為Spring Cloud實(shí)現(xiàn)分布式跟蹤解決方案。
微服務(wù)跟蹤(sleuth)其實(shí)是一個(gè)工具,它在整個(gè)分布式系統(tǒng)中能跟蹤一個(gè)用戶請(qǐng)求的過(guò)程(包括數(shù)據(jù)采集,數(shù)據(jù)傳輸,數(shù)據(jù)存儲(chǔ),數(shù)據(jù)分析,數(shù)據(jù)可視化),捕獲這些跟蹤數(shù)據(jù),就能構(gòu)建微服務(wù)的整個(gè)調(diào)用鏈的視圖,這是調(diào)試和監(jiān)控微服務(wù)的關(guān)鍵工具。
SpringCloudSleuth有幾個(gè)特點(diǎn):
特點(diǎn) | 說(shuō)明 |
---|---|
提供鏈路追蹤 | 通過(guò)sleuth可以很清楚的看出一個(gè)請(qǐng)求經(jīng)過(guò)了哪些服務(wù), 可以方便的理清服務(wù)間的調(diào)用關(guān)系 |
性能分析 | 通過(guò)sleuth可以很方便的看出每個(gè)采集請(qǐng)求的耗時(shí),分析出哪些服務(wù)調(diào)用比較耗時(shí),當(dāng)服務(wù)調(diào)用的耗時(shí),隨著請(qǐng)求量的增大而增大時(shí),也可以對(duì)服務(wù)的擴(kuò)容提供一定的提醒作用 |
數(shù)據(jù)分析及優(yōu)化鏈路 | 對(duì)于頻繁地調(diào)用一個(gè)服務(wù),或者并行地調(diào)用等, 可以針對(duì)業(yè)務(wù)做一些優(yōu)化措施 |
可視化 | 對(duì)于程序未捕獲的異常,可以在zipkpin界面上看到 |
二、基本術(shù)語(yǔ)
Spring Cloud Sleuth借用了Dapper的術(shù)語(yǔ)。
1、Span (跨度)
工作的基本單位。通俗的理解span就是一次請(qǐng)求信息,發(fā)送一個(gè)遠(yuǎn)程調(diào)度任務(wù)就會(huì)產(chǎn)生一個(gè)Span。 Span 由一個(gè)64位ID唯一標(biāo)識(shí)的,Trace 是用另一個(gè)64位ID唯一標(biāo)識(shí)的,Span 還有其他數(shù)據(jù)信息,比如摘要、時(shí)間戳事件、Span的ID、進(jìn)度ID、鍵值注釋(標(biāo)簽),導(dǎo)致它們的跨度的ID以及進(jìn)程ID(通常是IP地址)。創(chuàng)建跨度后,必須在將來(lái)的某個(gè)時(shí)刻停止。
2、Trace(跟蹤)
類似于樹(shù)結(jié)構(gòu)的span集合,表示一條調(diào)用鏈路,存在唯一標(biāo)識(shí)。請(qǐng)求一個(gè)微服務(wù)系統(tǒng)的API接口,這個(gè)API接口,需要調(diào)用多個(gè)微服務(wù),調(diào)用每個(gè)微服務(wù)都會(huì)產(chǎn)生一個(gè)新的Span,所有由這個(gè)請(qǐng)求產(chǎn)生的Span組成了這個(gè)Trace。
啟動(dòng)跟蹤的初始范圍稱為root span。該跨度的跨度id的值等于跟蹤ID。
3、Annotation (標(biāo)注)
用來(lái)及時(shí)記錄一個(gè)事件的存在,一些核心注解用來(lái)定義一個(gè)請(qǐng)求的開(kāi)始和結(jié)束。這些注解包括以下:
cs - 客戶端發(fā)送 - 客戶端發(fā)送一個(gè)請(qǐng)求,這個(gè)注解描述了這個(gè)跨度的開(kāi)始
sr - 服務(wù)器接收 - 服務(wù)器端得到請(qǐng)求,并將開(kāi)始處理它。如果從此時(shí)間戳中減去cs時(shí)間戳,可得到網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。
ss - 服務(wù)器發(fā)送 - 該注解表明請(qǐng)求處理的完成(當(dāng)請(qǐng)求返回客戶端)。如果從此時(shí)間戳中減去sr時(shí)間戳,就可以得到服務(wù)器請(qǐng)求的時(shí)間。
cr - 客戶端接收 - 表示跨度的結(jié)束??蛻舳艘殉晒邮盏椒?wù)器端的響應(yīng)。如果從此時(shí)間戳中減去cs時(shí)間戳,則會(huì)收到客戶端從服務(wù)器接收響應(yīng)所需的整個(gè)時(shí)間,即整個(gè)請(qǐng)求所消耗的時(shí)間。
三、Sleuth與Zipkin的關(guān)系
1、這里需要提一下Sleuth與Zipkin的關(guān)系,為什么鏈路跟蹤經(jīng)常圍繞著二者一起敘述?
- sleuth :鏈路追蹤器
- zipkin:鏈路分析器??梢岳斫鉃榭梢暬缑?,配合Sleuth可以清晰定位請(qǐng)求流程。
zipkin是Twitter基于google的分布式監(jiān)控系統(tǒng)Dapper(論文)的開(kāi)發(fā)源實(shí)現(xiàn)
2、可視化Span和Trace將與Zipkin注釋一起查看系統(tǒng):
一個(gè)音符的每個(gè)顏色表示跨度(7 spans - 從A到G)。如果您在筆記中有這樣的信息:
Trace Id = X
Span Id = D
Client Sent
這意味著,當(dāng)前的跨度痕量-ID設(shè)置為X,Span -編號(hào)設(shè)置為e。它也發(fā)出了 客戶端發(fā)送的事件。
這樣,spans的父/子關(guān)系的可視化將如下所示:
可以在Zipkin中查看痕跡:共有7個(gè)spans,如果選擇特定的跟蹤,將看到合并后的4個(gè)spans
四、Sleuth特性
1、將跟蹤和跨度添加到Slf4J MDC
,以便可以從日志聚合器中的給定跟蹤或跨度中提取所有日志。示例日志:
2023-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ...
2023-02-02 15:30:58.372 ERROR [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ...
2023-02-02 15:31:01.936 INFO [bar,46ab0d418373cbc9,46ab0d418373cbc9,false] 23030 --- [nio-8081-exec-4] ...
## 注意MDC中的[appname,traceId,spanId,exportable]條目:
spanId - 發(fā)生特定操作的ID
appname - 記錄跨度的應(yīng)用程序的名稱
traceId - 包含跨度的延遲圖的ID
導(dǎo)出 -日志是否應(yīng)該被導(dǎo)出到Zipkin與否。你什么時(shí)候希望跨度不能出口?在這種情況下,你想在Span中包裝一些操作,并將它寫(xiě)入日志。
順便提一下常用的日志聚合工具Kibana, Splunk、Logstash等
2、從Spring應(yīng)用程序(servlet過(guò)濾器、rest模板、調(diào)度操作、消息通道、外部客戶端)中插入常見(jiàn)的入口和出口點(diǎn)
。
3、提供對(duì)共同分布式跟蹤數(shù)據(jù)模型的抽象:trace,spans(形成DAG),注釋,鍵值注釋。松散地基于HTrace,但Zipkin(Dapper)兼容。
4、Sleuth記錄定時(shí)信息以輔助延遲分析。Sleuth被寫(xiě)入不會(huì)記錄太多,并且不會(huì)導(dǎo)致您的生產(chǎn)應(yīng)用程序崩潰。
5、Sleuth包括在http或消息傳遞邊界上加入跟蹤的默認(rèn)邏輯。例如,http傳播通過(guò)Zipkin兼容的請(qǐng)求標(biāo)頭工作。該傳播邏輯是通過(guò)SpanInjector和SpanExtractor實(shí)現(xiàn)來(lái)定義和定制的。
6、Sleuth可以在進(jìn)程之間傳播上下文(也稱為行李
)。這意味著如果您設(shè)置了Span行李元素,那么它將通過(guò)HTTP或消息傳遞到其他進(jìn)程發(fā)送到下游。
7、提供創(chuàng)建/繼續(xù)spans并通過(guò)注釋添加標(biāo)簽和日志的方法。
8、提供接受/刪除spans的簡(jiǎn)單指標(biāo)。
9、如果spring-cloud-sleuth-zipkin,則應(yīng)用程序?qū)⑸刹⑹占痁ipkin兼容的跟蹤。默認(rèn)情況下,它通過(guò)HTTP將其發(fā)送到localhost上的Zipkin服務(wù)器(端口9411)。使用spring.zipkin.baseUrl配置服務(wù)的位置
。
10、如果spring-cloud-sleuth-stream,則該應(yīng)用將通過(guò)Spring Cloud Stream生成和收集跟蹤。您的應(yīng)用程序自動(dòng)成為通過(guò)您的代理商發(fā)送的跟蹤消息的生產(chǎn)者(例如RabbitMQ,Apache Kafka,Redis))。
重要:
如果使用Zipkin或Stream,請(qǐng)使用spring.sleuth.sampler.percentage(默認(rèn)0.1,即10%)配置spans的百分比。否則你可能認(rèn)為Sleuth不工作,因?yàn)樗÷粤艘恍﹕pans。
五、項(xiàng)目集成
1、zipkin搭建安裝
首先你要清楚zipkin也是分客戶端服務(wù)端的。
Spring Boot 2.0不支持@EnableZipkinServer,所以需要下載Zipkin的服務(wù)器到本地
按照提示操作即可:
訪問(wèn)控制臺(tái):
若啟動(dòng)失敗由于端口(zipkin默認(rèn)端口9411)占用,mac環(huán)境下執(zhí)行:lsof -i tcp:9411
查看端口占用程序,然后sudo kill -9 PID
即可。
SpringCloud從F版開(kāi)始起就不需要自己構(gòu)建ZipKin Server了,只需要
調(diào)用jar
包即可。
2、添加依賴
服務(wù)提供者(payment)和消費(fèi)者(order)工程均添加依賴:
<!--依賴包含了sleuth,所以不需要再單獨(dú)引入sleuth-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
這里小編有話要說(shuō),如果上邊的依賴飄紅引不進(jìn)來(lái),那么原因可能是你使用的cloud版本已經(jīng)移除了spring-cloud-starter-zipkin,需要使用下邊的來(lái)替代:
<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>
查看我的SpringBoot2.5.6對(duì)應(yīng)的cloud的官方文檔后看到已經(jīng)被移除了
3、添加配置
服務(wù)提供者(payment)和消費(fèi)者(order)工程均添加配置:
spring:
zipkin:
#zipkin服務(wù)所在地址
base-url: http://localhost:9411/
sender:
type: web #使用http的方式傳輸數(shù)據(jù)
#配置采樣百分比
sleuth:
sampler:
probability: 1 # 將采樣比例設(shè)置為 1.0,也就是全部都需要。默認(rèn)是0.1也就是10%,一般情況下,10%就夠用了
##打開(kāi)debug日志
logging:
level:
org.springframework.web.servlet.DispatcherServlet: DEBUG
值得一提的是這里配置的type=web:
type=web也就是通過(guò) HTTP 的方式發(fā)送數(shù)據(jù)到 Zipkin ,如果請(qǐng)求量比較大,這種方式其實(shí)性能是比較低的,一般情況下我們都是通過(guò)消息中間件來(lái)發(fā)送,比如 RabbitMQ 。
如果日志數(shù)據(jù)量比較大,一般推薦擁有更高吞吐量的 Kafka 來(lái)進(jìn)行日志推送。
這種方式就是讓服務(wù)將 Sleuth 收集的日志推給 MQ ,讓 Zipkin 去監(jiān)控 MQ 的信息,通過(guò) MQ 的隊(duì)列獲取到服務(wù)的信息。這樣就提高了性能。
而日志的存儲(chǔ)則可以采用 Elasticsearch 對(duì)數(shù)據(jù)進(jìn)行持久化,這樣可以保證 Zipkin 重啟后,鏈路信息不會(huì)丟失。
4、修改業(yè)務(wù)代碼
oreder工程:
@RestController
@RequestMapping("/feign")
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/order/zipkin")
public CommonResult<Payment> paymentZipKin() {
return paymentFeignService.paymentZipKin();
}
}
payment工程:
@RestController
@RequestMapping("/payment")
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@GetMapping("/zipkin")
public CommonResult<Object> paymentZipKin() {
return new CommonResult<>(200, "hi,I am paymentZipKin server O(∩_∩)O哈哈~", serverPort);
}
}
5、測(cè)試
訪問(wèn)http://localhost/feign/order/zipkin
點(diǎn)擊run query查詢請(qǐng)求鏈路-》點(diǎn)擊show查看詳情:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-542514.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-542514.html
到了這里,關(guān)于SpringCloud入門(mén)實(shí)戰(zhàn)(十二)-Sleuth+Zipkin分布式請(qǐng)求鏈路跟蹤詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!