微信公眾平臺(tái)推廣簡(jiǎn)述seo的概念
1 鏈路追蹤介紹
????????在大型系統(tǒng)的微服務(wù)化構(gòu)建中,一個(gè)系統(tǒng)被拆分成了許多模塊。這些模塊負(fù)責(zé)不同的功能,組合成系統(tǒng),最終可以提供豐富的功能。在這種架構(gòu)中,一次請(qǐng)求往往需要涉及到多個(gè)服務(wù)?;ヂ?lián)網(wǎng)應(yīng)用構(gòu)建在不同的軟件模塊集上,這些軟件模塊,有可能是由不同的團(tuán)隊(duì)開(kāi)發(fā)、可能使用不同的編程語(yǔ)言來(lái)實(shí)現(xiàn)、有可能布在了幾千臺(tái)服務(wù)器,橫跨多個(gè)不同的數(shù)據(jù)中心,也就意味著這種架構(gòu)形式也會(huì)存在一些問(wèn)題:
- 如何快速發(fā)現(xiàn)問(wèn)題?
- 如何判斷故障影響范圍?
- 如何梳理服務(wù)依賴以及依賴的合理性?
- 如何分析鏈路性能問(wèn)題以及實(shí)時(shí)容量規(guī)劃?
????????分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請(qǐng)求還原成調(diào)用鏈路,進(jìn)行日志記錄,性能監(jiān)控并將一次分布式請(qǐng)求的調(diào)用情況集中展示。比如各個(gè)服務(wù)節(jié)點(diǎn)上的耗時(shí)、請(qǐng)求具體到達(dá)哪臺(tái)機(jī)器上、每個(gè)服務(wù)節(jié)點(diǎn)的請(qǐng)求狀態(tài)等等。
常見(jiàn)的鏈路追蹤技術(shù)有下面這些:
- cat 由大眾點(diǎn)評(píng)開(kāi)源,基于Java開(kāi)發(fā)的實(shí)時(shí)應(yīng)用監(jiān)控平臺(tái),包括實(shí)時(shí)應(yīng)用監(jiān)控,業(yè)務(wù)監(jiān)控 。 集成方案是通過(guò)代碼埋點(diǎn)的方式來(lái)實(shí)現(xiàn)監(jiān)控,比如: 攔截器,過(guò)濾器等。 對(duì)代碼的侵入性很大,集成成本較高。風(fēng)險(xiǎn)較大。
- zipkin 由Twitter公司開(kāi)源,開(kāi)放源代碼分布式的跟蹤系統(tǒng),用于收集服務(wù)的定時(shí)數(shù)據(jù),以解決微服務(wù)架構(gòu)中的延遲問(wèn)題,包括:數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn)。該產(chǎn)品結(jié)合spring-cloud-sleuth使用較為簡(jiǎn)單, 集成很方便, 但是功能較簡(jiǎn)單。
- pinpoint Pinpoint是韓國(guó)人開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈分析,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件,UI功能強(qiáng)大,接入端無(wú)代碼侵入。
- skywalking是本土開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈分析,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件,UI功能較強(qiáng),接入端無(wú)代碼侵入。目前已加入Apache孵化器。
- Sleuth? SpringCloud 提供的分布式系統(tǒng)中鏈路追蹤解決方案。
注意:SpringCloud alibaba技術(shù)棧中并沒(méi)有提供自己的鏈路追蹤技術(shù)的,我們可以采用Sleuth +
Zinkin來(lái)做鏈路追蹤解決方案
2 Sleuth入門
2.1 Sleuth介紹
????????SpringCloud Sleuth主要功能就是在分布式系統(tǒng)中提供追蹤解決方案。它大量借用了Google
Dapper的設(shè)計(jì), 先來(lái)了解一下Sleuth中的術(shù)語(yǔ)和相關(guān)概念。
- Trace? 由一組Trace Id相同的Span串聯(lián)形成一個(gè)樹(shù)狀結(jié)構(gòu)。為了實(shí)現(xiàn)請(qǐng)求跟蹤,當(dāng)請(qǐng)求到達(dá)分布式系統(tǒng)的入口端點(diǎn)時(shí),只需要服務(wù)跟蹤框架為該請(qǐng)求創(chuàng)建一個(gè)唯一的標(biāo)識(shí)(即TraceId),同時(shí)在分布式系統(tǒng)內(nèi)部流轉(zhuǎn)的時(shí)候,框架始終保持傳遞該唯一值,直到整個(gè)請(qǐng)求的返回。那么我們就可以使用該唯一標(biāo)識(shí)將所有的請(qǐng)求串聯(lián)起來(lái),形成一條完整的請(qǐng)求鏈路。
- Span 代表了一組基本的工作單元。為了統(tǒng)計(jì)各處理單元的延遲,當(dāng)請(qǐng)求到達(dá)各個(gè)服務(wù)組件的時(shí)候,也通過(guò)一個(gè)唯一標(biāo)識(shí)(SpanId)來(lái)標(biāo)記它的開(kāi)始、具體過(guò)程和結(jié)束。通過(guò)SpanId的開(kāi)始和結(jié)束時(shí)間戳,就能統(tǒng)計(jì)該span的調(diào)用時(shí)間,除此之外,我們還可以獲取如事件的名稱。請(qǐng)求信息等元數(shù)據(jù)。
- Annotation 用它記錄一段時(shí)間內(nèi)的事件,內(nèi)部使用的重要注釋:
cs(Client Send)客戶端發(fā)出請(qǐng)求,開(kāi)始一個(gè)請(qǐng)求的生命
sr(Server Received)服務(wù)端接受到請(qǐng)求開(kāi)始進(jìn)行處理, sr-cs = 網(wǎng)絡(luò)延遲(服務(wù)調(diào)用的時(shí)間)
ss(Server Send)服務(wù)端處理完畢準(zhǔn)備發(fā)送到客戶端,ss - sr = 服務(wù)器上的請(qǐng)求處理時(shí)間
cr(Client Reveived)客戶端接受到服務(wù)端的響應(yīng),請(qǐng)求結(jié)束。 cr - sr = 請(qǐng)求的總時(shí)間
2.2?Sleuth入門
微服務(wù)名稱, traceId, spanid,是否將鏈路的追蹤結(jié)果輸出到第三方平臺(tái)
[api-gateway,3977125f73391553,3977125f73391553,false]
[service-order,3977125f73391553,57547b5bf71f8242,false]
[service-product,3977125f73391553,449f5b3f3ef8d5c5,false]
接下來(lái)通過(guò)之前的項(xiàng)目案例整合Sleuth,完成入門案例的編寫。
修改父工程引入Sleuth依賴
<!--鏈路追蹤 Sleuth-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
????????啟動(dòng)微服務(wù),調(diào)用之后,我們可以在控制臺(tái)觀察到sleuth的日志輸出
????????其中 5399d5cb061971bd 是TraceId, 5399d5cb061971bd 是SpanId,依次調(diào)用有一個(gè)全局的TraceId,將調(diào)用鏈路串起來(lái)。仔細(xì)分析每個(gè)微服務(wù)的日志,不難看出請(qǐng)求的具體過(guò)程。
????????查看日志文件并不是一個(gè)很好的方法,當(dāng)微服務(wù)越來(lái)越多日志文件也會(huì)越來(lái)越多,通過(guò)Zipkin可以將日志聚合,并進(jìn)行可視化展示和全文檢索。