開篇思考
- 為什么需要服務(wù)追蹤?
- 分布式事務(wù)幾種實(shí)現(xiàn)方式?
- 哪種追蹤方式性能更優(yōu)?

為什么需要服務(wù)追蹤
在微服務(wù)架構(gòu)下,由于進(jìn)行了服務(wù)拆分,一次請(qǐng)求往往需要涉及多個(gè)服務(wù),
每個(gè)服務(wù)可能是由不同的團(tuán)隊(duì)開發(fā),使用了不同的編程語(yǔ)言,還有可能部署在不同的機(jī)器上,分布在不同的數(shù)據(jù)中心。
服務(wù)跟蹤系統(tǒng)可以跟蹤記錄一次用戶請(qǐng)求都發(fā)起了哪些調(diào)用,經(jīng)過哪些服務(wù)處理,并且記錄每一次調(diào)用所涉及的服務(wù)的詳細(xì)信息,
通過查看完整的調(diào)用鏈路,形成拓補(bǔ)圖可以更加直觀的了解業(yè)務(wù),也可以針對(duì)當(dāng)前的系統(tǒng)進(jìn)行分析,是否需要擴(kuò)容、優(yōu)化接口、失敗緩解,
還有通過日志快速定位是調(diào)用失敗的環(huán)節(jié)。
服務(wù)追蹤的實(shí)際應(yīng)用
捋清業(yè)務(wù)
我們都知道,在一般場(chǎng)景下,我們很難直觀的了解系統(tǒng)的運(yùn)行、業(yè)務(wù)的流程,因?yàn)閭鹘y(tǒng)的都是文字需求說明和枯燥的代碼。通過鏈路追蹤,可以
根據(jù)調(diào)用鏈路來捋清楚服務(wù)間的調(diào)用關(guān)系,如果 API 設(shè)計(jì)符合規(guī)范,甚至可以直觀的了解調(diào)用的服務(wù)作用。這對(duì)于剛剛接觸系統(tǒng)的開發(fā)人員
十分重要。

分析耗時(shí)
鏈路的基本功能,服務(wù)間的調(diào)用耗時(shí)記錄,如果服務(wù)耗時(shí)過長(zhǎng),會(huì)影響整體的用戶體驗(yàn),甚至?xí)伋龀瑫r(shí)異常等,這樣的情況在微服務(wù)架構(gòu)中也是
時(shí)有發(fā)生。

可視化錯(cuò)誤
微服務(wù)調(diào)用鏈路發(fā)生錯(cuò)誤,可以直觀的顯示查看,定位到被調(diào)用服務(wù)的接口,及時(shí)排查微服務(wù)中錯(cuò)誤原因。
優(yōu)化鏈路:
顯示完整的調(diào)用鏈路,根據(jù)業(yè)務(wù)分析合理性、可讀性、健壯性,是否重復(fù)調(diào)用某一個(gè)服務(wù),是否鏈路過長(zhǎng),有沒有可以優(yōu)化的,鏈路是否清晰。
有些場(chǎng)景比較復(fù)雜,比如數(shù)據(jù)中心比較分散,服務(wù)分布在不同的數(shù)據(jù)中心,但是服務(wù)中心之間因?yàn)榈赜蛟颍嚯x遠(yuǎn),延遲高,這可能不符合設(shè)計(jì)
要求,因此就要根據(jù)鏈路來找到最近的數(shù)據(jù)中心,然后配置調(diào)用最近的數(shù)據(jù)中心的服務(wù)。

生成網(wǎng)絡(luò)拓?fù)?
通過服務(wù)追蹤系統(tǒng)中記錄的鏈路信息,可以生成一張系統(tǒng)的網(wǎng)絡(luò)調(diào)用拓?fù)鋱D,它可以反映系統(tǒng)都依賴了哪些服務(wù),
以及服務(wù)之間的調(diào)用關(guān)系是什么樣的,可以一目了然。除此之外,在網(wǎng)絡(luò)拓?fù)鋱D上還可以把服務(wù)調(diào)用的詳細(xì)信息也標(biāo)出來,
也能起到服務(wù)監(jiān)控的作用。

skywalking & zipkin
zipkin + sleuth 之前一直是 pringcloud 官方的推薦,我在springcloud demo 中也使用過,總體用下來追蹤和分析都滿足需求,
但是功能相對(duì) skywalking 而言比較簡(jiǎn)單,沒有skywalking 強(qiáng)大。集成也是比較簡(jiǎn)單,只要引入相關(guān)依賴,然后啟動(dòng)zipkin server 端就可以
在頁(yè)面上面查看。
今天主要看下 skywalking 的安裝和使用
安裝
推薦下載編譯好的源碼:http://skywalking.apache.org/downloads/
- linux 下載 tar 解壓后運(yùn)行
- window下載 zip 解壓后運(yùn)行
當(dāng)然還有其他幾種方式,比如 github 源碼下載編譯,docker 運(yùn)行,這里不多說,看自己方便哪種,如果懂docker 其實(shí)docker 才是最佳選擇,
如果沒玩過推薦直接下載壓縮包,簡(jiǎn)單。
接下來以 window 為例,修改application.yml 文件,換成自己喜歡的數(shù)據(jù)庫(kù)。我使用的是 es:
環(huán)境要求:
- JDK8+
- Elasticsearch 6.x
- 8080,10800,11800,12800 端口不被占用

結(jié)合 springcloud 或者其他項(xiàng)目
- java 命令,添加 vm option: -javaagent:/path/agent/skywalking-agent.jar
- Linux Tomcat 修改 tomcat/bin/catalina.sh,在首行加入如下信息.
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
- Windows Tomcat 修改 tomcat/bin/catalina.bat,在首行加入如下信息.
set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
下面是我的 idea 配置:

啟動(dòng)dashboard
找到 bin 目錄下 startup.bat ,雙擊打開,注意端口不要占用,否則就要自己修改配置文件該端口號(hào)
啟動(dòng)后,如果頁(yè)面上有自己的服務(wù)信息,就說明切入成功。說到這里要對(duì) agent 工作原理說下。
工作原理介紹 java agent
先說一下它的用途,在JDK1.5以后,我們可以使用agent技術(shù)構(gòu)建一個(gè)獨(dú)立于應(yīng)用程序的代理程序(即為Agent),用來協(xié)助監(jiān)測(cè)、
運(yùn)行甚至替換其他JVM上的程序。使用它可以實(shí)現(xiàn)虛擬機(jī)級(jí)別的AOP功能。
- 分為 premain agentmain
/**
* 以vm參數(shù)的方式載入,在Java程序的main方法執(zhí)行之前執(zhí)行
*/
public static void premain(String agentArgs, Instrumentation inst);
/**
* 以Attach的方式載入,在Java程序啟動(dòng)后執(zhí)行
*/
public static void agentmain(String agentArgs, Instrumentation inst);
- 在META-INF目錄下創(chuàng)建 MANIFEST.MF 文件.用來指定主函數(shù)入口,
Agent-Class和Premain-Class

