一、 簡介(為什么需要用到可觀測能力)
????????隨著微服務的開發模式的興起,早期的單體架構系統已拆分為很多的子系統,各個子系統封裝為微服務,各服務間通過HTTP協議RESET API或者RPC協議進行調用。
? ? ? ? 在單體服務或者微服務較少的情況下,當我們遇到問題時可以直接簡單、快速地通過日志進行分析,并迅速判斷是A服務還是B服務存在問題,以此快速恢復服務。
????????但是,在大型企業中,系統數量已經到達了幾十個、甚至上百個,每個系統都有不同的架構和調用協議,那么此時這些系統之間的調用關系會變得錯綜復雜。當某個API接口的業務邏輯很復雜、且調用鏈路很長,涉及的系統或微服務較多,一旦其中一環出現問題,想要快速定位問題和解決問題那就太難了,如果還是按照早期一一查看日志的方式進行排查,無疑對運維和開發人員是一場噩夢.....
????????那么有什么方式能夠做到快速定位和分析,并且在應用不改造的情況下實施呢?此時就需要一套APM(應用性能管理(Application Performance Management))系統,將我們業務開發與運維制定的規范嵌入APM系統,在可視化UI面板+告警快速地,通過服務調用鏈的拓撲圖進行問題定位。
????????APM系統開源的其實有很多產品,例如韓國主導的Pinpoint、大眾點評的CAT、推特的ZipKin、CNCF的Jaeger以及本文重點介紹的Apache SkyWalking. 感興趣的同學都可以一一了解和使用。
????????APM重點關注三個指標數據: 1、Metrics ?2、Logging ?3、Tracing
????????Peter Bourgon在參加完2017 Distributed Tracing Summit后發表的一篇博文,簡潔扼要地介紹了指標(Metrics)、鏈路(Tracing)、日志(Logging)三者的定義和關系。這三種數據在可觀察性中都有各自的發揮空間,但每種數據都沒辦法完全被其他數據代替。
????????我們從一個典型的服務問題排查過程來看:
- 通過各式各樣的預設報警發現異常(通常是Metrics/Logging)
- 打開監控大盤查找異常的曲線,并通過查詢找到異常的模塊(Metrics)
- 對這個模塊以及關聯日志進行查詢分析,找到核心的報錯信息(Logging)
- 通過詳細的調用鏈數據定位到引起問題的代碼(Tracing)
二、SkyWalking
????????SkyWalking 由中國華為和 Apache 開源社區共同開發,目前已成為 Apache 基金會下的頂級項目之一,作者吳晟。
????????SkyWalking 是基于 Apache 開源生態的分布式應用性能監控系統。它提供了面向云原生架構的 APM(Application Performance Management)解決方案,支持多種語言的應用和多種方式的部署,具有以下特點:
????????分布式追蹤:支持多種語言、多種協議的應用追蹤,可獲取全鏈路的請求數據。
????????應用拓撲圖:根據追蹤數據自動生成應用程序拓撲,便于系統管理員快速定位故障。
????????監控告警:具有豐富的監控指標和告警規則,支持第三方告警接口。
????????插件化體系:可通過插件模塊實現對不同類型服務的監控和數據收集。
2.1 無侵入式說明
????????SkyWalking Agent采集調用鏈信息的客戶端對業務是無感的、非侵入式的。 那也就意味著,你的項目代碼無須修改一行代碼就能加入SkyWalking的采集、監控、調用鏈追蹤。
? ? ? ? 原始項目接入SkyWalking很輕松、門檻很低。 底層大概得原理是:JAVA本身就提供JAVAAGENT的機制以及采用動態修改字節碼技術的方式,Agent在JVM底層幫我們把調用鏈采集上報的過程透明化了,開發人員作為業務層寫代碼是無感的。
? ? ? ? 注意:無侵入方式實現
- 應用服務器中需要安裝SkyWalking-agent.jar
- 應用需要重啟,并且在啟動參數中添加相關配置,在后面案例中會提供詳細的參
接下來我會使用入門案例做個簡單初步分析和驗證.
三、案例驗證(使用JAVA:SpringBoot工程+PHP)
3.1?安裝SkyWalking的OAP系統安裝包
下載:? SkyWalking的OAP壓縮包
下載頁面:?Downloads | Apache SkyWalking
3.2 上傳下載好的OAP的tar包
3.3?運行OAP
1、解壓 apache-skywalking-apm-9.7.0.tar.gz
tar -zxvf apache-skywalking-apm-9.7.0.tar.gz
2、進入 apache-skywalking-apm-bin
3、在啟動OAP之前需要確定機器上是否安裝JDK
注意SkyWalking新版安裝包需要JDK11以上,否則無法啟動
Linux 上安裝及卸載JDK(包含yum方式)-CSDN博客
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/skywalking/oap/server/starter/OAPServerStartUp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
該錯誤告訴我們,我們的類是在比嘗試運行它的版本更高的Java版本下編譯的。 更具體地說,在這種情況下,我們使用Java 11編譯了我們的類,并嘗試使用Java 8運行它。
作為參考,讓我們快速看一下Java版本號。 如果我們需要下載適當的Java版本,這將很方便。主版本號和次版本號存儲在類字節碼中的字節六和七中。讓我們看看主要版本號如何映射到Java版本:45 = Java 1.146 = Java 1.247 = Java 1.348 = Java 1.449 = Java 550 = Java 651 = Java 752 = Java 853 = Java 954 = Java 1055 = Java 1156 = Java 1257 = Java 13
4、進入bin目錄有啟動腳本,我們先啟動oapService.sh(服務端)、再啟動webappService.sh(UI客戶端)
sh oapService.sh
sh webappService.sh
5、啟動完畢,執行jps程序查看進程有沒有正常拉起來
如果JPS無法使用,則參考linux環境下JPS命令未找到-CSDN博客
6、正常會出現上面兩個進程,如果沒有拉起來在logs目錄可以查看錯誤信息進行排查,如無問題則繼續往下
7、訪問SkyWalking 8080 UI界面,默認端口8080
http://$ip:8080
???????目前剛開始服務列表這些是空的, SkyWalking支持多種數據存儲介質例如默認內存、MySQL、ES等等,一般生產環境使用ES集群進行存儲,我們測試直接不用改什么配置,默認采用內存的形式。那就意味著如果服務重啟,則之前的測試數據會丟失。
3.4?Trace調用鏈追蹤的基本原理介紹
? ? ? ?Trace調用鏈追蹤,例如A->B->C->D ?存在4個微服務的調用鏈關系。 假設我們通過HTTP協議進行交互,該怎么把調用鏈信息拿到呢??
? ? ? ? Google的Dapper論文中提到了一種分布式調用鏈追蹤的實現方式, 市面上的APM系統調用鏈追蹤大部分是參考這篇論文實現的。 每個調用鏈可以使用TraceId進行標識,每個服務被調用稱為一個Span會伴隨一個SpanId, 每當父服務調用子服務的時候會將TraceId以及父層的SpanId往子服務傳遞,子服務收到后,記錄父層傳遞的SpanId作為自己Span的父id, ?最后2個服務都會把調用信息上報到APM的服務端,例如SkyWalking的某個端口。
? ? ? ? 最后SkyWalking因為采集到了這些Span的信息,Span信息記錄著父子關系、調用時間信息、TraceId等等,經過UI繪制,就能把這一次調用的TraceId的所有Span進行串聯,最終形成調用鏈拓撲圖。
? ? ? ? 接下來我們部署一個SpringBoot項目和一個PHP項目,很簡單的鏈路,SpringBoot調用PHP項目的HTTP接口,我們來看下SkyWalking的UI界面以及分析原理驗證。
3.5?運行項目
? ? ? ? 我本地搭建了一套SpringBoot項目,但是如果只是簡單運行,那肯定和我們的SkyWalking還沒進行結合。那怎么結合起來呢? ?那就是通過運行的時候,設置參數,和SkyWalking Agent進行結合。
????????我們上面提到過,使用SkyWalking Agent最大的好處就是【無代碼侵入】,那也就是意味著我們的源代碼無須做任何變更, 只需要在運行java -jar JAR包的時候額外加入一下參數即可:
? ? ? 下載Agent:
下載后進行解壓,我將使用兩種方式驗證;
本地IDEA運行和Linux環境下運行,但注意運行需要同時配置JVM啟動參數
# skywalking‐agent.jar的本地磁盤的路徑
-javaagent:F:\Apache\skywalking-agent\skywalking-agent.jar
# 在skywalking上顯示的服務名
-Dskywalking.agent.service_name=SkyWalking-Test
# skywalking的collector服務的IP及端口
-Dskywalking.collector.backend_service=192.168.20.128:11800
- 本地IDEA運行SpringBoot工程
?????????????????????
訪問接口,即可在UI界面上展示信息
服務列表信息
查看調用service調用拓撲圖
查看調用鏈詳細信息
- Linux上運行
通過官網Tar包,啟動一直報錯
啟動命令:
java -javaagent:/user/local/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=TestDemo-Adaptee -Dskywalking.collector.backend_service=[IP]:11800 -jar /user/local/TestDemo-Adaptee-0.0.1-SNAPSHOT.jar錯誤:
Error opening zip file or JAR manifest missing : /user/local/skywalking-agent/skywalking-agent.jar
Error occurred during initialization of VM
agent library failed to init: instrument
官網Tar包下載地址:???????Index of /skywalking/java-agent
下載Agent包:
wget https://dlcdn.apache.org/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz解壓:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz
博主解壓完后出現兩個文件:tgz.1和skywalking-agent文件夾
需要再次解壓tgz.1壓縮包
解壓:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz
啟動
執行上面啟動命令后即可
???????