什么是鏈路追蹤
微服務(wù)架構(gòu)是通過(guò)業(yè)務(wù)來(lái)劃分服務(wù)的,使用 REST 調(diào)用。對(duì)外暴露的一個(gè)接口,可能需要很多個(gè)服務(wù)協(xié)同才能完成這個(gè)接口功能,如果鏈路上任何一個(gè)服務(wù)出現(xiàn)問(wèn)題或者網(wǎng)絡(luò)超時(shí),都會(huì)形成導(dǎo)致接口調(diào)用失敗。隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會(huì)越來(lái)越復(fù)雜。

隨著服務(wù)的越來(lái)越多,對(duì)調(diào)用鏈的分析會(huì)越來(lái)越復(fù)雜。它們之間的調(diào)用關(guān)系也許如下:

面對(duì)以上情況,我們就需要一些可以幫助理解系統(tǒng)行為、用于分析性能問(wèn)題的工具,以便發(fā)生故障的時(shí)候,能夠快速定位和解決問(wèn)題,這就是所謂的 APM(應(yīng)用性能管理)。
什么是 SkyWalking (華為吳晟)
目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking;Apache SkyWalking 是觀(guān)察性分析平臺(tái)和應(yīng)用性能管理系統(tǒng)。提供分布式追蹤、服務(wù)網(wǎng)格遙測(cè)分析、度量聚合和可視化一體化解決方案。

- Skywalking Agent: 使用 JavaAgent 做字節(jié)碼植入,無(wú)侵入式的收集,并通過(guò) HTTP 或者 gRPC 方式發(fā)送數(shù)據(jù)到 SkyWalking Collector。
- SkyWalking Collector: 鏈路數(shù)據(jù)收集器,對(duì) agent 傳過(guò)來(lái)的數(shù)據(jù)進(jìn)行整合分析處理并落入相關(guān)的數(shù)據(jù)存儲(chǔ)中。
- Storage: SkyWalking 的存儲(chǔ),時(shí)間更迭,SW 已經(jīng)開(kāi)發(fā)迭代到了 6.x 版本,在 6.x 版本中支持以 ElasticSearch(支持 6.x)、Mysql、TiDB、H2、作為存儲(chǔ)介質(zhì)進(jìn)行數(shù)據(jù)存儲(chǔ)。
- UI: Web 可視化平臺(tái),用來(lái)展示落地的數(shù)據(jù)。
SkyWalking 優(yōu)勢(shì)
- 多種監(jiān)控手段,語(yǔ)言探針和服務(wù)網(wǎng)格(Service Mesh)
- 多語(yǔ)言自動(dòng)探針,Java,.NET Core 和 Node.JS
- 輕量高效,不需要大數(shù)據(jù)
- 模塊化,UI、存儲(chǔ)、集群管理多種機(jī)制可選
- 支持告警
- 優(yōu)秀的可視化方案
SkyWalking 安裝配置
下載并構(gòu)建 SkyWalking 鏡像
官方已經(jīng)為我們準(zhǔn)備好了編譯過(guò)的服務(wù)端版本,下載地址為 http://skywalking.apache.org/downloads/,這里我們需要下載 6.x releases 版本

wget http://mirror.bit.edu.cn/apache/skywalking/6.1.0/apache-skywalking-apm-6.1.0.tar.gz
配置 SkyWalking
下載完成后解壓縮,進(jìn)入 apache-skywalking-apm-incubating/config 目錄并修改 application.yml 配置文件
這里需要做三件事:
- 注釋 H2 存儲(chǔ)方案
- 啟用 ElasticSearch 存儲(chǔ)方案
- 修改 ElasticSearch 服務(wù)器地址
storage:
elasticsearch:
# nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200}
# user: ${SW_ES_USER:""}
#password: ${SW_ES_PASSWORD:""}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests
bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
# h2:
# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
構(gòu)建 SkyWalking 鏡像并啟動(dòng)
Dockerfile
FROM centos:7
# Timezone, Asia/Shanghai by default
ENV Timezone=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$Timezone /etc/localtime && echo '$Timezone' > /etc/timezone
RUN yum install -y wget && \
yum install -y java-1.8.0-openjdk
WORKDIR /app
COPY apache-skywalking-apm-bin skywalking
RUN echo "tail -f /dev/null" >> /app/skywalking/bin/startup.sh
CMD ["/bin/sh","-c","/app/skywalking/bin/startup.sh" ]
docker-compose.yml
version: '3.3'
services:
elasticsearch:
image: wutang/elasticsearch-shanghai-zone:6.3.2
container_name: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
cluster.name: elasticsearch
skywalking:
build: .
container_name: skywalking
ports:
- 10800:10800
- 11800:11800
- 12800:12800
- 8090:8080
links:
- elasticsearch:elasticsearch
depends_on:
- elasticsearch
通過(guò)瀏覽器訪(fǎng)問(wèn) http://serverIP:8090 出現(xiàn)如下界面即表示啟動(dòng)成功

默認(rèn)的用戶(hù)名密碼為:admin/admin,登錄成功后,效果如下圖
