今天帶大家瞭解一款分散式鏈路追蹤軟體,為什麼要介紹鏈路追蹤呢?
當前網際網路行業發展紅火,業務也越來越複雜、龐大,單機應用已經無法滿足日常需求,分散式、微服務架構應運而生。在微服務的環境中,存在日常系統的層層呼叫,會不停的在各個服務中進行,如果沒有一個呼叫鏈路的完整記錄,排查問題將會異常困難。
APM(應用效能管理)針對上面描述的情況,apm給大家帶來了解決方案,目前業界常見的一些 APM 工具主要有: Cat、Zipkin、Pinpoint、SkyWalking。
本文主要介紹 SkyWalking ,它是一款優秀的國產 APM 工具,並且已經成為了apache基金會的頂級專案,它包括了分散式追蹤、效能指標分析、應用和服務依賴分析等。
skywalking入門軟體安裝不做描述,大家可以自行查閱資料。
官方地址:https://skywalking.apache.org/
先來看下軟體的執行介面,如下圖
介紹下skywalking中重要的三個概念
服務(Service):指服務叢集端點(Endpoint):對外的介面例項(Instance):指叢集中的例項skywalking架構圖可以將skywalking看成三大塊,第一塊為資料採集,第二塊則是skywalking服務,第三塊是資料儲存。
如何將專案接入skywalking呢?skywalking的接入非常簡單,只需要指定java啟動引數即可,如下圖
// 指定執行的java agent-javaagent:D:\soft\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar// 設定該程式,在skywalking中的名字-Dskywalking.agent.service_name=stressTest// skywalking管理埠-Dskywalking.collector.backend_service=localhost:11800
skywalking原理
大家看到上面的應用案例中,有下面的程式碼
-javaagent:/path/to/skywalking-agent.jar
如果對javaagent瞭解的話,就知道了,其實skywalking的原理就是使用java agent(java探針)。Java agent是java命令的一個引數。引數 javaagent 可以用於指定一個 jar 包。
這個 jar 包的 MANIFEST.MF 檔案必須指定 Premain-Class 項。Premain-Class 指定的那個類必須實現 premain() 方法。當Java 虛擬機器啟動時,在執行 main 函式之前,JVM 會先執行 -javaagent 所指定 jar 包內 Premain Class 這個類的 premain 方法 。
自己實現Java agent下面我們簡單寫一個java agent
agent程式碼
public class MyAgent {/*** agentArgs 是 premain 函式得到的程式引數,隨同 “– javaagent”一起傳入。* Inst 是一個 java.lang.instrument.Instrumentation 的例項,由 JVM 自動傳入。*/public static void premain(String agentArgs, Instrumentation inst) {System.out.println("=========premain方法執行1========");System.out.println(agentArgs); }/*** 如果不存在 premain(String agentArgs, Instrumentation inst)* 則會執行 premain(String agentArgs)*/public static void premain(String agentArgs) { System.out.println("=========premain方法執行2========"); System.out.println(agentArgs); }}
為了不去手動寫MANIFREST.MF檔案,我們引入maven外掛
編寫主程式
public class Test {public static void main(String[] args) {System.out.println("主程式...");}}
idea啟動時指定agent,如下圖
執行主程式結果如下:
=========premain方法執行1========null主程式...
可以看到premain方法執行了,且沒有傳入引數,如果需要傳入引數javagent屬性如下設定即可:
-javaagent:/Users/ganhuojun/code/myagent/target/myAgent.jar=abc
後面再給大家分享一下skywalking能幫我們做些什麼