本文介紹微服務(wù)架構(gòu)中最重要的設(shè)計(jì)模式:微服務(wù)之間的數(shù)據(jù)通訊衡便。更多請(qǐng)看全文。
第一章:微服務(wù)的架構(gòu)介紹發(fā)展
第二章:微服務(wù)環(huán)境搭建
第三章:Nacos Discovery--服務(wù)治理
第四章:Sentinel--服務(wù)容錯(cuò)
第五章:Gateway--服務(wù)網(wǎng)關(guān)
第六章:Sleuth--鏈路追蹤
第七章:Rocketmq--消息驅(qū)動(dòng)
6.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ì)開發(fā)毅贮、可能使用不同的編程語言來實(shí)現(xiàn)办悟、有可能布在了幾千臺(tái)服務(wù)器,橫跨多個(gè)不同的數(shù)據(jù)中心滩褥,也就意味著這種架構(gòu)形式也會(huì)存在一些問題
于是就出現(xiàn)了下面幾個(gè) 問題
如何快速發(fā)現(xiàn)問題病蛉?
如何判斷故障影響范圍?
如何梳理服務(wù)依賴以及依賴的合理性瑰煎?
如何分析鏈路性能問題以及實(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)等等革骨。
常見的鏈路追蹤技術(shù)有下面這些:
cat 由大眾點(diǎn)評(píng)開源,基于Java開發(fā)的實(shí)時(shí)應(yīng)用監(jiān)控平臺(tái)析恋,包括實(shí)時(shí)應(yīng)用監(jiān)控良哲,業(yè)務(wù)監(jiān)控 。 集成方案是通過代碼埋點(diǎn)的方式來實(shí)現(xiàn)監(jiān)控助隧,比如: 攔截器臂外,過濾器等。 對(duì)代碼的侵入性很大喇颁,集成成本較高漏健。風(fēng)險(xiǎn)較大。
zipkin 由Twitter公司開源橘霎,開放源代碼分布式的跟蹤系統(tǒng)蔫浆,用于收集服務(wù)的定時(shí)數(shù)據(jù),以解決微服務(wù)架構(gòu)中的延遲問題姐叁,包括:數(shù)據(jù)的收集瓦盛、存儲(chǔ)、查找和展現(xiàn)外潜。該產(chǎn)品結(jié)合spring-cloud-sleuth使用較為簡單原环, 集成很方便, 但是功能較簡單处窥。
pinpoint Pinpoint 是韓國人開源的基于字節(jié)碼注入的調(diào)用鏈分析嘱吗,以及應(yīng)用監(jiān)控分析工具。特點(diǎn)是支持多種插件滔驾,UI功能強(qiáng)大谒麦,接入端無代碼侵入。
SkyWalking 是本土開源的基于字節(jié)碼注入的調(diào)用鏈分析哆致,以及應(yīng)用監(jiān)控分析工具绕德。特點(diǎn)是支持多種插件,UI功能較強(qiáng)摊阀,接入端無代碼侵入耻蛇。目前已加入Apache孵化器。
Sleuth 是 Spring Cloud 提供的分布式系統(tǒng)中鏈路追蹤解決方案胞此。
注意:Spring Cloud Alibaba 技術(shù)棧中并沒有提供自己的鏈路追蹤技術(shù)的臣咖,我們可以采用 Sleuth + Zinkin 來做鏈路追蹤解決方案
6.2 Sleuth 入門
6.2.1 Sleuth 介紹
Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案。它大量借用了 Google Dapper 的設(shè)計(jì)豌鹤, 先來了解一下Sleuth中的術(shù)語和相關(guān)概念亡哄。
Trace:由一組 Trace Id 相同的 Span 串聯(lián)形成一個(gè)樹狀結(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)起來,形成一條完整的請(qǐng)求鏈路宦焦。
Span:代表了一組基本的工作單元发钝。為了統(tǒng)計(jì)各處理單元的延遲,當(dāng)請(qǐng)求到達(dá)各個(gè)服務(wù)組件的時(shí)候波闹,也通過一個(gè)唯一標(biāo)識(shí)( SpanId )來標(biāo)記它的開始酝豪、具體過程和結(jié)束。通過 SpanId 的開始和結(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)求庄撮,開始一個(gè)請(qǐng)求的生命
- sr(Server Received)服務(wù)端接受到請(qǐng)求開始進(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í)間
6.2.2 Sleuth入門
微服務(wù)名稱, traceId, spanid, 是否將鏈路的追蹤結(jié)果輸出到第三方平臺(tái)
[api-gateway,3977235f83191553,3977125f73391553s,false]
[service-order,3977125f75391553,57547b5bf71s8s242,false]
[service-product,3977125f73391553,449f5b3f4ef8ds5c5,false]
1)接下來通過之前的項(xiàng)目案例整合Sleuth,完成入門案例的編寫巡扇。
<!--鏈路追蹤 Sleuth-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2)啟動(dòng)微服務(wù)扭仁,調(diào)用之后,我們可以在控制臺(tái)觀察到sleuth的日志輸出
其中5399d5cb061971bd 是 TraceId 厅翔, 5399d5cb061971bd 是 SpanId,依次調(diào)用有一個(gè)全局的 TraceId搀突,將調(diào)用鏈路串起來刀闷。仔細(xì)分析每個(gè)微服務(wù)的日志,不難看出請(qǐng)求的具體過程仰迁。
6.3 Zipkin 的集成
6.3.1 ZipKin 介紹
Zipkin 是 Twitter 的一個(gè)開源項(xiàng)目甸昏,它基于 Google Dapper 實(shí)現(xiàn),它致力于收集服務(wù)的定時(shí)數(shù)據(jù)徐许,以解決微服務(wù)架構(gòu)中的延遲問題施蜜,包括數(shù)據(jù)的收集、存儲(chǔ)雌隅、查找和展現(xiàn)翻默。
我們可以使用它來收集各個(gè)服務(wù)器上請(qǐng)求鏈路的跟蹤數(shù)據(jù)缸沃,并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實(shí)現(xiàn)對(duì)分布式系統(tǒng)的監(jiān)控程序,從而及時(shí)地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源修械。
除了面向開發(fā)的 API 接口之外趾牧,它也提供了方便的 UI組件 來幫助我們直觀的搜索跟蹤信息和分析請(qǐng)求鏈路明細(xì),比如:可以查詢某段時(shí)間內(nèi)各用戶請(qǐng)求的處理時(shí)間等肯污。
Zipkin 提供了可插拔數(shù)據(jù)存儲(chǔ)方式:In-Memory翘单、MySql、Cassandra 以及 Elasticsearch蹦渣。
上圖展示了 Zipkin 的基礎(chǔ)架構(gòu)哄芜,它主要由 4 個(gè)核心組件構(gòu)成:
- Collector:收集器組件,它主要用于處理從外部系統(tǒng)發(fā)送過來的跟蹤信息柬唯,將這些信息轉(zhuǎn)換為 Zipkin 內(nèi)部處理的 Span 格式认臊,以支持后續(xù)的存儲(chǔ)、分析权逗、展示等功能美尸。
- Storage:存儲(chǔ)組件,它主要對(duì)處理收集器接收到的跟蹤信息斟薇,默認(rèn)會(huì)將這些信息存儲(chǔ)在內(nèi)存中师坎,我們也可以修改此存儲(chǔ)策略,通過使用其他存儲(chǔ)組件將跟蹤信息存儲(chǔ)到數(shù)據(jù)庫中堪滨。
- RESTful API:API 組件胯陋,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息袱箱,或是外接系統(tǒng)訪問以實(shí)現(xiàn)監(jiān)控等遏乔。
- Web UI:UI 組件,
Zipkin 分為兩端发笔,一個(gè)是 Zipkin 服務(wù)端盟萨,一個(gè)是 Zipkin 客戶端,客戶端也就是微服務(wù)的應(yīng)用了讨。 客戶端會(huì)配置服務(wù)端的 URL 地址捻激,一旦發(fā)生服務(wù)間的調(diào)用的時(shí)候,會(huì)被配置在微服務(wù)里面的 Sleuth 的監(jiān)聽器監(jiān)聽前计,并生成相應(yīng)的 Trace 和 Span 信息發(fā)送給服務(wù)端胞谭。
6.3.2 ZipKin 服務(wù)端安裝
服務(wù)端也分兩種方式一種是自己導(dǎo)依賴做一個(gè)服務(wù)端,還有就是直接使用第三方男杈,由于時(shí)間關(guān)系丈屹,這里我直接使用第三方,一般開發(fā)也是使用這種用的較多
訪問上面的網(wǎng)址伶棒,即可得到一個(gè)jar包旺垒,這就是 ZipKin 服務(wù)端的jar包
2)通過命令行彩库,輸入下面的命令啟動(dòng)ZipKin Server 就像啟動(dòng) jar 包一樣啟動(dòng) zipkin 服務(wù)端,
java -jar zipkin-server-2.12.9-exec.jar
3)通過瀏覽器訪問 http://localhost:9411 訪問
6.3.3 Zipkin客戶端集成
ZipKin 客戶端 和 Sleuth 的集成非常簡單袖牙,只需要在微服務(wù)中添加其依賴和配置即可侧巨。
1)在每個(gè)微服務(wù)上添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2)添加配置
spring:
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin server的請(qǐng)求地址
discovery-client-enabled: false
sleuth:
sampler:
probability: 1.0 #采樣的百分比
3)訪問微服務(wù)
http://localhost:7000/order-serv/order/prod/1
4)訪問 zipkin 的 UI 界面,觀察效果
5)點(diǎn)擊其中一條記錄鞭达,可觀察一次訪問的詳細(xì)線路司忱。
6.4 ZipKin 數(shù)據(jù)持久化
Zipkin Server 默認(rèn)會(huì)將追蹤數(shù)據(jù)信息保存到內(nèi)存,但這種方式不適合生產(chǎn)環(huán)境畴蹭。Zipkin 支持將追蹤數(shù)據(jù)持久化到 mysql 數(shù)據(jù)庫或 elasticsearch 中坦仍。
6.4.1 使用 mysql 實(shí)現(xiàn)數(shù)據(jù)持久化
1)創(chuàng)建 mysql 數(shù)據(jù)環(huán)境
新建數(shù)據(jù)庫:zipkin,因?yàn)樗J(rèn)數(shù)據(jù)庫名稱是zipkin叨襟。
如果想使用其他名稱也可以繁扎。下面會(huì)介紹如何配置自定義的數(shù)據(jù)庫名稱。
SQL參考: 官網(wǎng)
2)在啟動(dòng) ZipKin Server 的時(shí)候,指定數(shù)據(jù)保存的 mysql 的信息
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root
6.4.2 使用 elasticsearch 實(shí)現(xiàn)數(shù)據(jù)持久化
1)下載 elasticsearch
2)啟動(dòng) elasticsearch
3)在啟動(dòng) ZipKin Server 的時(shí)候糊闽,指定數(shù)據(jù)保存的 elasticsearch 的信息
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ESHOST=localhost:9200