分布式鏈路追蹤–SkyWalking
? 微服務的出現(xiàn),的確解決了一些業(yè)務痛點
,但是也造成了新的問題比如隨著調用鏈的拉長,如果想要知道請求為什么這么慢,這個請求到底經(jīng)歷了哪些環(huán)節(jié),又依賴了哪些東西,在微服務架構中定位這些問題并且解決是比較麻煩的。
? 什么是調用鏈呢?
? A服務調用B服務也可以說是一個調用鏈,即使是同一個服務中的一個方法調用到另一個方法,也可以說是一個調用鏈。
? 以前單體應用中,排查問題往往只需要到這臺應用的服務,查看日志基本就能把問題解決了。但是在微服務系統(tǒng)中,一般是分布式部署的,這也就給排查增加了難度,如果把一臺臺服務器登錄上找問題,既麻煩又耗時。
? 為了解決這些問題,業(yè)內已經(jīng)有了分布式鏈路追蹤的解決方案,比如使用ZipKin、SkyWalking等。
SkyWalking介紹
? SkyWalking是基于OpenTracing實現(xiàn)的開源項目,2017年12月8日已進入Apache孵化器。
? 是一個APM(應用性能監(jiān)控)系統(tǒng),專為微服務、云原生架構和基于容器(Docker、k8s、Mesos)架構而設計。通過探針收集應用的指針,并進行分布式鏈路追蹤。SkyWalking會感知服務之間的調用鏈路關系,形成相應的統(tǒng)計數(shù)據(jù)。它的特性如下:
- 支持警告
- 采用探針技術,對業(yè)務代碼零侵入
- 支持自動及手動探針
- 輕量高效,不需要大數(shù)據(jù)平臺
- 多種監(jiān)控手段,多語言自動探針
- 可視化后臺
- 模塊化
SkyWalking的整體架構:
- 探針(agent):負責數(shù)據(jù)收集,包含了Tracing和Metrics的數(shù)據(jù)
- 可觀測性能分析平臺(OAP):接收探針發(fā)送的數(shù)據(jù),并使用分析引擎進行數(shù)據(jù)整合、運算,然后把數(shù)據(jù)存儲到對應的存儲介質(可用H2或Elasticsearch等)上,還為UI后臺提供接口
- UI:調用OAP的接口,提供可視化界面展示
Elasticsearch下載安裝
那么SkyWalking的存儲介質,筆者這s選擇使用Elasticsearch,先到Elasticsearch的官網(wǎng)下載。
windows版本下載地址,選擇下載了一個7.0.0
版本的。
這里筆者就使用windows版本了,需要linux版本或其他可以自行查閱資料。
下載解壓后,到config/elasticsearch.yml
中修改下集群名:
cluster.name: my-application
后直接到bin目錄下,執(zhí)行elasticsearch.bat
即可執(zhí)行es服務,默認端口9200
啟動完畢后,訪問下localhost:9200
,得到如下信息即是安裝成功
完成后,再去安裝SkyWalking。注意這里cluster.name
是my-application。后面skywalking需要用。
SkyWalking下載安裝
下載地址:https://skywalking.apache.org/downloads/
下載過慢或者下載無反應的,可以嘗試使用國內鏡像地址去下載,https://mirrors.cloud.tencent.com/apache/skywalking
筆者使用7.0.0版本的,地址在這里:https://www.apache.org/dyn/closer.cgi/skywalking/7.0.0/apache-skywalking-apm-es7-7.0.0.tar.gz
這里提供下網(wǎng)盤資源:
鏈接:https://pan.baidu.com/s/1lQoMDFIH3PYGCla3PtIIRg
提取碼:2a96
下載解壓后,得到如下目錄:
- agent:探針相關,代理模塊
- bin:oapService和webappService的啟動腳本,也有兩個腳本合并的腳本
start.bat
,linux系統(tǒng)啟動.sh的文件 - config:數(shù)據(jù)收集器、存儲、告警等配置信息
- logs:collector和web-ui的日志
- webapp:SkyWalking展示的UIjar文件和配置文件
到
config/application.yml
中修改配置
storage:
selector: ${SW_STORAGE:elasticsearch7}
修改elsticsearch
的nameSpace和ClusterNodes,這里nameSpace是前面配置的es的集群名稱
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:"my-application"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
注意:SkyWalking默認使用的端口是8080、11800、12800,如有占有,可去config/application.yml
和webapp/application.yml
中修改
啟動
執(zhí)行startup.bat
啟動
訪問localhost:8080
即可進入skywalking的可視化界面
IDEA使用agent
IDEA使用agent主要使用于本地開發(fā)環(huán)境,需要又agent文件夾,然后加上啟動參數(shù)即可。
找到兩個springboot微服務項目,然后在它們的IDEA啟動配置中,增加參數(shù):
transaction的
-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=transaction-distribution
-Dskywalking.collector.backend_service=localhost:11800
order的
-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=transaction-order
-Dskywalking.collector.backend_service=localhost:11800
- D:\env\envir\skywalking7\agent\skywalking-agent.jar`是agent的目錄路徑
- service_name:服務名稱
- backend_service:skywalking的服務地址(端口是11800)
完事兒后,啟動它們。
調用一個接口,執(zhí)行它們。
拓撲圖
到skywalking的拓撲圖頁面
可以看到真題的技術架構及調用關系。
追蹤
到skywalking的追蹤頁面
可以看到所有的執(zhí)行記錄,并且將這些詳細到:發(fā)生在哪個類哪個方法中,如執(zhí)行sql查詢的那條,點擊后,我們甚至可以看到sql的執(zhí)行信息。
還可知接口的執(zhí)行時間分布,以及采用的技術
如上圖:/createOrder
接口總執(zhí)行2.4s,/distribution
是使用feign調用的,且執(zhí)行了1s左右。
忽略端點
有時可能不需要采集某個端點的數(shù)據(jù),如心跳之類的請求,不是那么重要??梢栽O置忽略它們,意味著包含這些路徑的追蹤信息不會被agent發(fā)送到collector中。
-
將skywalking中的
agent/optional-plugins
的apm-trace-ignore-plugin-7.0.0.jar
拷貝至我們的agent/plugins
中 -
在IDEA中做啟動配置,我們模擬將
/createOrder
和/distribution
接口忽略-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.trace.ignore_path=/createOrder
-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-order -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.trace.ignore_path=/distribution
ignore_path
這個參數(shù)可以支持表達式:
/path/*
、path/**
、/path/?
?
表示匹配任意單字符,*
表示匹配0個或任意數(shù)量字符,**
表示匹配0或更多的目錄
配置后,在調用匹配規(guī)則的接口路徑時,agent就不會再采集這些接口的數(shù)據(jù)了。
除此外還有另一種方式
同樣是需要先將skywalking中的agent/optional-plugins
的apm-trace-ignore-plugin-7.0.0.jar
拷貝至我們的agent/plugins
中
然后去配置agent/config/agent.config
文件忽略端點,服務每次啟動都會去讀取這個配置文件。
trace.ignore_path==${SW_AGENT_TRACE_IGNORE_PATH:/createOrder, /distribution}
告警
告警功能是skywalking的一大特色。Skywalking會定時把采集到的數(shù)據(jù)和配置的告警規(guī)則進行對比,如果滿足閾值條件,則會出發(fā)警告。
Skywalking允許用戶基于webhook(網(wǎng)絡鉤子)的規(guī)范,自定義觸發(fā)告警之后的邏輯,如發(fā)短信、發(fā)郵件、電話、公眾號通知等。
Skywalking程序路徑下的config/alarm-settings.yml
文件就是告警的規(guī)則。
rules:
service_resp_time_rule: # 服務響應時間規(guī)則
metrics-name: endpoint_percent # 名稱
threshold: 75 # 閾值
op: < # 小于
period: 10 # 間隔時間
count: 3 # 次數(shù)
silence-period: 10 # 告警發(fā)送多少分鐘內警告不會重復發(fā)送
message: Successful rate of endpoint {name} is lower than 75%
#webhooks:
# - http://127.0.0.1/notify/
# - http://127.0.0.1/go-wechat/
webhooks中就是觸發(fā)警告后,需要執(zhí)行的操作。
我們可以自己做個觸發(fā)鉤子后的執(zhí)行操作接口
- 來個告警信息類
public class AlarmMessage {
private Integer scopeId; // 作用域
private String name; // 目標作用域下的實體名稱
private Integer id0; // 作用域下的實體ID,與名稱相匹配
private Integer id1;
private String ruleName; // alarm-setting.yml中的配置規(guī)則
private String alarmMessage; // 告警信息
private Long startTime; // 告警產生時間
// get.set.toString()方法省略
}
- 做個接口
@RequestMapping("/notify")
public void alarm(@RequestBody List<AlarmMessage> alarmMessages) {
alarmMessages.forEach(value -> System.out.println(value.toString()));
}
- 修改config/alarm-settings.yml配置文件,增加鉤子的后續(xù)執(zhí)行。
webhooks:
- http://127.0.0.1:9002/notify
重啟skywalking及兩個微服務項目,多次調用/createOrder
接口(模擬的超時報錯),這里記得把忽略的端點給放開,否則skywalking是發(fā)不了告警的。
可看到告警
一欄中的
看到控制臺打印的數(shù)據(jù):
性能分析
Skywalking的性能分析能幫助用戶很容易找到性能問題,并且不需要代碼埋點等操作。Skywalking的性能分析是對業(yè)務周期性保存快照操作,資源消耗小。
到Skywalking UI的性能剖析窗口,點擊新建任務,如創(chuàng)建/createOrder
接口的任務。
然后可以調用幾次/createOrder
接口,刷新頁面,選中剛剛創(chuàng)建的任務,右側出現(xiàn)createOrder的信息,選中,點擊分析按鈕。
調用/createOrder的流程,使用的技術,服務名,耗時,棧信息等一覽無余。
點擊查看能看到這個步驟的詳細信息,執(zhí)行的具體操作,拋出的異常。
Tomcat或Jar包使用agent
IDEA中使用agent一般用于本地開發(fā)環(huán)境,若正式環(huán)境,一般使用Tomcat或jar包的方式啟動應用。
Linux系統(tǒng)Tomcat使用agent
linux系統(tǒng)中修改tomcat的bin/catalina.sh
文件,加入代碼
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/root/agent/skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";
export CATALINA_OPTS
Windows系統(tǒng)Tomcat使用agent
windows系統(tǒng)中修改tomcat的bin/catalina.bat
文件setlocal
下,加入代碼
set CATALINA_OPTS="-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";
jar包使用agent
啟動時的命令
java -javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800 -jar transaction-distribution.jar
配置賬號密碼登錄
Skywalking的功能很強大,能看到項目中的很多隱私信息(項目架構、調用鏈路、sql語句等),自然不希望其他無關人員能看到。那么通常設置賬號密碼的方式。
在skywalking6.x版本中能配置,但是在7.x版本中被移除了,作者提出可以使用nginx配置賬號和密碼:
使用nginx配置賬號密碼登錄主要是依靠ngx_http_auth_basic_module
模塊。
下面是用nginx的增強版,OpenResty配置賬號和密碼登錄。OpenResty的安裝可以自行查閱資料。
安裝和配置
- 安裝hptpasswd工具
yum install -y httpd-tools
- 使用htpasswd生成用戶名和密碼
htpasswd -b -c /usr/local/openresty/passwd wlh wlh
-b參數(shù):用戶創(chuàng)建passwdfile,如果passwdfile存在,那么它會重寫
-c參數(shù):允許命令行中一起輸入賬號和密碼文章來源:http://www.zghlxwxcb.cn/news/detail-729521.html
- 到OpenResty的安裝目錄,修改
nginx/conf/nginx.conf
配置文件,修改server中的內容就行了
server{
listen 80;
server_name localhost;
location / {
auth_basic "Please input password"; # 提示信息
auth_basic_user_file /user/local/openrestry/passwd; # 存放賬號密碼的文件
proxy_pass http://localhost:8080; # 代理到8080端口
}
}
最后linux系統(tǒng)記得放開需要的端口。重啟OpenResty然后訪問主機http://192.168.1.41
(默認80端口),就會彈框提示需要輸入賬號和密碼了。文章來源地址http://www.zghlxwxcb.cn/news/detail-729521.html
到了這里,關于分布式鏈路追蹤--SkyWalking7.0.0+es7.0.0的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!