前言
微服務(wù)框架落地后,分布式部署架構(gòu)帶來(lái)的問(wèn)題就會(huì)迅速凸顯出來(lái)。尤其線上出現(xiàn)問(wèn)題,不知道如何排查,問(wèn)題出現(xiàn)在哪個(gè)服務(wù)?如何快速定位問(wèn)題?如何跟蹤業(yè)務(wù)調(diào)用鏈路?如何分析解決業(yè)務(wù)瓶頸?今天老顧來(lái)跟小伙伴們看看如何解決以上問(wèn)題。
什么是鏈路追蹤
微服務(wù)架構(gòu)是通過(guò)業(yè)務(wù)來(lái)劃分服務(wù)的,使用REST調(diào)用。對(duì)外暴露的一個(gè)接口,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問(wèn)題或者網(wǎng)絡(luò)超時(shí),都會(huì)形成導(dǎo)致接口調(diào)用失敗。隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會(huì)越來(lái)越復(fù)雜。
上圖中,user調(diào)用A,A會(huì)調(diào)用C,C再調(diào)用E;這條調(diào)用鏈路,我們還能夠看清楚;但是一旦微服務(wù)很多,調(diào)用依賴復(fù)雜就看不清楚了,如下圖
上圖是不是看到后,有密集恐懼癥,像個(gè)線團(tuán),一團(tuán)亂麻;如果這個(gè)時(shí)候出現(xiàn)了調(diào)用異常,那我們依據(jù)調(diào)用接口入口,一步步、一個(gè)服務(wù)一個(gè)服務(wù)的去跟蹤調(diào)試;這個(gè)流程會(huì)把人搞瘋的,也許1個(gè)小時(shí)后,也不知道什么問(wèn)題;就像我們以前找線頭,然后一步步的去重新卷圈。
面對(duì)以上情況,我們就需要一些可以幫助理解系統(tǒng)行為、用于分析性能問(wèn)題的工具,以便發(fā)生故障的時(shí)候,能夠快速定位和解決問(wèn)題,這就是所謂的 APM(應(yīng)用性能管理)。
什么是 SkyWalking
Skywalking是一款國(guó)內(nèi)開(kāi)源的應(yīng)用性能監(jiān)控工具,支持對(duì)分布式系統(tǒng)的監(jiān)控、跟蹤和診斷。目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking。SkyWalking也是Apache的孵化項(xiàng)目之一,擁有頂級(jí)二級(jí)域名。
它提供了如下的主要功能特性:
功能特性:
- 多種監(jiān)控手段,語(yǔ)言探針和服務(wù)網(wǎng)格(Service Mesh)
- 多語(yǔ)言自動(dòng)探針,JAVA,.NET Core 和 Node.JS
- 輕量高效,不需要大數(shù)據(jù)
- 模塊化,UI、存儲(chǔ)、集群管理多種機(jī)制可選
- 支持告警
- 優(yōu)秀的可視化方案
技術(shù)架構(gòu)
上圖看了是不是比較亂,其實(shí)Skywalking總體可以分為四部分:
1、Skywalking Agent:使用Javaagent做字節(jié)碼植入,無(wú)侵入式的收集,并通過(guò)HTTP或者gRPC方式發(fā)送數(shù)據(jù)到Skywalking Collector。
2、Skywalking Collector :鏈路數(shù)據(jù)收集器,對(duì)agent傳過(guò)來(lái)的數(shù)據(jù)進(jìn)行整合分析處理并落入相關(guān)的數(shù)據(jù)存儲(chǔ)中。
3、Storage:Skywalking的存儲(chǔ),在6.x版本中支持以ElasticSearch(推薦)、MySQL、TiDB、H2、作為存儲(chǔ)介質(zhì)進(jìn)行數(shù)據(jù)存儲(chǔ)。
4、UI :Web可視化平臺(tái),用來(lái)展示落地的數(shù)據(jù)。
下載并啟動(dòng) SkyWalking
官方已經(jīng)為我們準(zhǔn)備好了編譯過(guò)的服務(wù)端版本,現(xiàn)在最新版本為6.4.0
下載地址為 http://skywalking.apache.org/downloads/
配置 SkyWalking
下載完成后解壓縮
# tar -xvf apache-skywalking-apm-6.4.0.tar # mv apache-skywalking-apm-bin /usr/local/skywalking # cd /usr/local/skywalking
修改配置
# cd config
# vim Application.yml@
配置存儲(chǔ)方式,默認(rèn)H2,官方推薦elasticsearch
這里需要做三件事:
- 注釋 H2 存儲(chǔ)方案
- 啟用 ElasticSearch 存儲(chǔ)方案
- 修改 ElasticSearch 服務(wù)器地址
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
啟動(dòng) SkyWalking
修改完配置后,進(jìn)入 skywalkingbin 目錄,運(yùn)行startup.bat啟動(dòng)服務(wù)端
通過(guò)瀏覽器訪問(wèn) http://localhost:8080 出現(xiàn)如下界面即表示啟動(dòng)成功
默認(rèn)的用戶名密碼為:admin/admin,登錄成功后,效果如下圖
Java Agent 服務(wù)器探針
agent簡(jiǎn)單的理解就是放一個(gè)插件,隨著應(yīng)用程序啟動(dòng),監(jiān)控?cái)?shù)據(jù)、收集數(shù)據(jù)、發(fā)送數(shù)據(jù)的作用。
探針文件在skywalking/agent目錄下
啟動(dòng)方式
在以前啟動(dòng)應(yīng)用程序時(shí),加上一些參數(shù)
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=shop-goods-provider -Dskywalking.collector.backend_service=localhost:11800 -jar yourApp.jar
參數(shù)含義:
- -javaagent:用于指定探針路徑
- -Dskywalking.agent.service_name:用于重寫(xiě) agent/config/agent.config 配置文件中的服務(wù)名
- -Dskywalking.collector.backend_service:用于重寫(xiě) agent/config/agent.config 配置文件中的服務(wù)地址
啟動(dòng)后,訪問(wèn)鏈接,就會(huì)發(fā)現(xiàn) Service 與 Endpoint 已經(jīng)成功檢測(cè)到了
表示 SkyWalking 鏈路追蹤配置成功。
Service Topology監(jiān)控
調(diào)用鏈路監(jiān)控可以從兩個(gè)角度去看待。我們先從整體上來(lái)認(rèn)識(shí)一下我們所監(jiān)控的系統(tǒng)。
通過(guò)給服務(wù)添加探針并產(chǎn)生實(shí)際的調(diào)用之后,我們可以通過(guò)Skywalking的前端UI查看服務(wù)之間的調(diào)用關(guān)系。
從圖中可以看到:
有兩個(gè)服務(wù)節(jié)點(diǎn):provider & consumer
有一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn):localhost【mysql】
consumer消費(fèi)了provider提供出來(lái)的接口。
一個(gè)系統(tǒng)的拓?fù)鋱D讓我們清晰的認(rèn)識(shí)到系統(tǒng)之間的應(yīng)用的依賴關(guān)系以及當(dāng)前狀態(tài)下的業(yè)務(wù)流轉(zhuǎn)流程。
細(xì)心的小伙伴們可能發(fā)現(xiàn)圖示節(jié)點(diǎn)consumer上有一部分是紅色的,紅色是什么意思呢?
紅色代表當(dāng)前流經(jīng)consumer節(jié)點(diǎn)的請(qǐng)求有一斷時(shí)間內(nèi)是響應(yīng)異常的。當(dāng)節(jié)點(diǎn)全部變紅的時(shí)候證明服務(wù)現(xiàn)階段內(nèi)就徹底不可用了。運(yùn)維人員可以通過(guò)Topology迅速發(fā)現(xiàn)某一個(gè)服務(wù)潛在的問(wèn)題,并進(jìn)行下一步的排查并做到預(yù)防。
Skywalking Trace監(jiān)控
Skywalking通過(guò)業(yè)務(wù)調(diào)用監(jiān)控進(jìn)行依賴分析,提供給我們了服務(wù)之間的服務(wù)調(diào)用拓?fù)潢P(guān)系、以及針對(duì)每個(gè)endpoint的trace記錄。
我們?cè)谥翱吹絚onsumer節(jié)點(diǎn)服務(wù)中發(fā)生了錯(cuò)誤,讓我們一起來(lái)定位下錯(cuò)誤是發(fā)生在了什么地方又是什么原因呢?
在每一條trace的信息中都可以看到當(dāng)前請(qǐng)求的時(shí)間、GloableId、以及請(qǐng)求被調(diào)用的時(shí)間。我們分別看一看正確的調(diào)用和異常的調(diào)用。
Trace調(diào)用鏈路監(jiān)控
上圖展示的是一次正常的響應(yīng),這條響應(yīng)總耗時(shí)19ms;可以詳細(xì)點(diǎn)擊每個(gè)span查看詳細(xì)信息
Service JVM信息監(jiān)控
Skywalking還可以監(jiān)控到Service運(yùn)行時(shí)的CPU、堆內(nèi)存、非堆內(nèi)存使用率、以及GC情況。這些信息來(lái)源于JVM。
Skywalking 服務(wù)告警
上面我們提到了通過(guò)查看拓?fù)鋱D以及調(diào)用鏈路可以定位問(wèn)題,可是運(yùn)維人員又不可能一直盯著這些數(shù)據(jù),那么我們就需要告警能力,在異常達(dá)到一定閾值的時(shí)候主動(dòng)的提示我們?nèi)ゲ榭聪到y(tǒng)狀態(tài)。
在Sywalking 6.x版本中新增了對(duì)服務(wù)狀態(tài)的告警能力。它通過(guò)webhook的方式讓我們可以自定義我們告警信息的通知方式。諸如:郵件通知、微信通知、短信通知等。
告警的規(guī)則配置。在alarm-settings.xml中可以配置告警規(guī)則,告警規(guī)則支持自定義。
1、service_resp_time_rule:告警規(guī)則名稱 ***_rule (規(guī)則名稱可以自定義但是必須以’_rule’結(jié)尾
2、indicator-name:指標(biāo)數(shù)據(jù)名稱: 定義參見(jiàn)http://t.cn/EGhfbmd
3、op: 操作符: > , < , = 【當(dāng)然你可以自己擴(kuò)展開(kāi)發(fā)其他的操作符】
4、threshold:目標(biāo)值:指標(biāo)數(shù)據(jù)的目標(biāo)數(shù)據(jù) 如sample中的1000就是服務(wù)響應(yīng)時(shí)間,配合上操作符就是大于1000ms的服務(wù)響應(yīng)
5、period: 告警檢查周期:多久檢查一次當(dāng)前的指標(biāo)數(shù)據(jù)是否符合告警規(guī)則
6、counts: 達(dá)到告警閾值的次數(shù)
7、silence-period:忽略相同告警信息的周期
8、message:告警信息
文件結(jié)尾有最后一個(gè)webhooks屬性:服務(wù)告警通知服務(wù)地址
webhooks: # - http://127.0.0.1/notify/ # - http://127.0.0.1/go-wechat/
總結(jié)
本文簡(jiǎn)單了介紹了Skywalking簡(jiǎn)單的知識(shí),可以通過(guò)Skywalking,可以讓我們方便的查看微服務(wù)架構(gòu)中系統(tǒng)瓶頸以及性能問(wèn)題等。小伙伴們可以去嘗試操作一下哦,謝謝!!!
---End---
最近老顧上傳了微服務(wù)網(wǎng)關(guān)的分享課程,請(qǐng)大家多多支持