當分佈式系統服務比較多,特別是微服務,出現故障就很難排查。因此須要藉助APM 系統進行排查(Application Performance Management,即應用性能管理),SkyWalking是APM 系統的一種,相似的產品還有CAT、Zipkin、Pinpoint。java
SkyWalking和Pinpoint相比其餘系統,作到了無侵入性。Pinpoint出現的時間長,文檔也較爲豐富,爲多數公司使用。mysql
國人開源的APM產品SkyWalking,探針採集數據粒度相較於 Pinpoint 來講略粗,但性能表現優秀。於2019年進入到Apache 基金會的孵化器畢業成爲頂級項目;實屬後起之秀,本文推薦使用SkyWalking。linux
從官網下載SkyWalking APM,選擇對應的版本。web
下載以後解壓便可。spring
Skywalking支持h二、mysql、ElasticSearch做爲數據存儲,官方推薦使用ElasticSearch。sql
根據具體業務,這裏使用最方便的h2數據庫作數據存儲。h2是Skywalking自帶的,爲一種內存數據庫。內存數據會由於服務故障、重啓而丟失,並不適合長時間監控的場景,因此須要將其更改成文件數據庫。數據庫
打開apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\config\application.yml文件,修改h2節點的url地址。apache
url: ${SW_STORAGE_H2_URL:jdbc:h2:tcp://127.0.0.1/~/skywalking-oap-db;AUTO_SERVER=TRUE}
windows
h2文件數據庫須要啓動 h2 TCP,不然Skywalking會由於監聽不到9092端口而啓動失敗。後端
linux啓動 h2 TCP 的方式:
新建啓動腳本,運行便可,啓動後就會在用戶目錄下(如administrator或root或home/user等用戶目錄)自動建立數據庫文件skywalking-oap-db。
linux腳本以下
#!/usr/bin/env sh PRG="$0" PRGDIR=`dirname "$PRG"` [ -z "$OAP_HOME" ] && OAP_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` OAP_LOG_DIR="${OAP_HOME}/logs" JAVA_OPTS=" -Xms64M -Xmx256M" if [ ! -d "${OAP_HOME}/logs" ]; then mkdir -p "${OAP_LOG_DIR}" fi _RUNJAVA=${JAVA_HOME}/bin/java [ -z "$JAVA_HOME" ] && _RUNJAVA=java CLASSPATH="$OAP_HOME/config:$CLASSPATH" for i in "$OAP_HOME"/oap-libs/h2*.jar do CLASSPATH="$i:$CLASSPATH" done OAP_OPTIONS=" -Doap.logDir=${OAP_LOG_DIR}" # 若是須要遠程鏈接h2數據庫,需將-tcp改成-tcpAllowOthers eval exec "\\"$_RUNJAVA\\" ${JAVA_OPTS} ${OAP_OPTIONS} -classpath $CLASSPATH org.h2.tools.Server -tcp \\ 2>${OAP_LOG_DIR}/h2Tcp.log 1> /dev/null &" if [ $? -eq 0 ]; then sleep 1 echo "SkyWalking h2Tcp started successfully!" else echo "SkyWalking h2Tcp started failure!" exit 1 fi
windows啓動 h2 TCP 的方式:
新建啓動腳本,運行便可。windows腳本以下
@REM 若是須要遠程查看h2數據庫(tcp端口9092,頁面訪問端口8082),需將-tcp改成-tcpAllowOthers @echo off setlocal set OAP_PROCESS_TITLE=Skywalking-H2TcpServer set OAP_HOME=%~dp0%.. set OAP_OPTS="-Xms64M -Xmx256M -Doap.logDir=%OAP_HOME%\\logs" set CLASSPATH=%OAP_HOME%\\config;.; set CLASSPATH=%OAP_HOME%\\oap-libs\\*;%CLASSPATH% if defined JAVA_HOME ( set _EXECJAVA="%JAVA_HOME%\\bin\\java" ) if not defined JAVA_HOME ( echo "JAVA_HOME not set." set _EXECJAVA=java ) start "%OAP_PROCESS_TITLE%" %_EXECJAVA% "%OAP_OPTS%" -cp "%CLASSPATH%" org.h2.tools.Server -tcp endlocal
Java Agent爲Java探針,是java命令的一個參數。虛擬機啓動的時候,在執行main方法前,會先找到javaagent 命令指定 jar 包,執行premain-class中的preman()方法。
設置方式以下:
複製apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\agent文件到監控目標服務器上,而後在啓動命令中添加參數:
windows參數以下:
set SW_AGENT_NAME=eda-app-base-service set SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.24:11800 set JAVA_TOOL_OPTIONS=-javaagent:E:\\tech\\agent\\skywalking-agent.jar
Linux參數以下:
# SkyWalking Agent 配置 export SW_AGENT_NAME=demo-application # 配置 Agent 名字。通常來講,咱們直接使用 Spring Boot 項目的 `spring.application.name` 。 export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。 export SW_AGENT_SPAN_LIMIT=2000 # 配置鏈路的最大 Span 數量。通常狀況下,不須要配置,默認爲 300 。主要考慮,有些新上 SkyWalking Agent 的項目,代碼可能比較糟糕。 export JAVA_AGENT=-javaagent:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar # SkyWalking Agent jar 地址。 # Jar 啓動 java -jar $JAVA_AGENT -jar lab-39-demo-2.2.2.RELEASE.jar
具體變量可能因版本有所變化(本文版本爲8.4.0),更多變量可在agent\config\agent.config查看。
首先啓動 h2 TCP
啓動apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\bin\startup.bat,它會同時啓動Skywalking-Webapp、Skywalking-Collector兩個服務。
啓動業務服務
訪問http://127.0.0.1:8080,便可看到SkyWalking界面
若是8080端口被佔用,能夠經過apache-skywalking-apm-es7-8.4.0\apache-skywalking-apm-bin-es7\webapp\webapp.yml文件修改端口。