今天帶大家了解一款分布式鏈路追蹤軟件,為什么要介紹鏈路追蹤呢?
當前互聯網行業發展紅火,業務也越來越復雜、龐大,單機應用已經無法滿足日常需求,分布式、微服務架構應運而生。在微服務的環境中,存在日常系統的層層調用,會不停的在各個服務中進行,如果沒有一個調用鏈路的完整記錄,排查問題將會異常困難。
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插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<!--自動添加META-INF/MANIFEST.MF -->
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Premain-Class>com.example.agent.PreMainAgent</Premain-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
執行mvn clean package打包程序,會得到myAgent.jar如下圖

編寫主程序
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
原文地址:https://www.toutiao.com/i6880274988621005315/