微服務(wù)架構(gòu)已經(jīng)是一個(gè)很通用的系統(tǒng)架構(gòu),常見(jiàn)的技術(shù)棧如下圖所示,這張架構(gòu)圖基本涵括了當(dāng)前微服務(wù)體系下的各種技術(shù)棧,可能不同的技術(shù)棧有不同的開(kāi)源實(shí)現(xiàn)。

今天主要介紹Skywalking,數(shù)據(jù)鏈路追蹤,主要的資料來(lái)源于網(wǎng)上的教程。
鏈路追蹤介紹
對(duì)于一個(gè)大型的幾十個(gè),幾百個(gè)微服務(wù)構(gòu)成的微服務(wù)架構(gòu)系統(tǒng),通常會(huì)遇到下面的一系列問(wèn)題。
- 如何串聯(lián)整個(gè)調(diào)用鏈路,快速定位問(wèn)題?
- 如何澄清各個(gè)微服務(wù)之間的依賴關(guān)系?
- 如何進(jìn)行各個(gè)微服務(wù)接口的性能分析?
- 如何追蹤各個(gè)業(yè)務(wù)流程的調(diào)用處理順序?
Skywalking介紹
Skywalking是一個(gè)國(guó)產(chǎn)的開(kāi)源框架,2015年有吳晟個(gè)人開(kāi)源,2017年加入Apache孵化器,國(guó)人開(kāi)源的產(chǎn)品,主要開(kāi)發(fā)人員來(lái)自于華為,2019年4月17日Apache董事會(huì)批準(zhǔn)SkyWalking成為頂級(jí)項(xiàng)目,支持Java、.Net、NodeJs等探針,數(shù)據(jù)存儲(chǔ)支持Mysql、Elasticsearch等,跟Pinpoint一樣采用字節(jié)碼注入的方式實(shí)現(xiàn)代碼的無(wú)侵入,探針采集數(shù)據(jù)粒度粗,但性能表現(xiàn)優(yōu)秀,且對(duì)云原生支持,目前增長(zhǎng)勢(shì)頭強(qiáng)勁,社區(qū)活躍。
Skywalking是分布式系統(tǒng)的應(yīng)用程序性能監(jiān)視工具,專為微服務(wù),云原生架構(gòu)和基于容器(Docker,K8S,Mesos)架構(gòu)而設(shè)計(jì),它是一款優(yōu)秀的APM(Application Performance Management)工具,包括了分布式追蹤,性能指標(biāo)分析和服務(wù)依賴分析等。
鏈路追蹤框架對(duì)比
目前市面上開(kāi)源的APM系統(tǒng)主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是參考Google的Dapper實(shí)現(xiàn)的
功能和技術(shù)方案對(duì)比
- Zipkin是Twitter開(kāi)源的調(diào)用鏈路分析工具,目前基于Spingcloud sleuth得到了廣泛的應(yīng)用,特點(diǎn)是輕量,部署簡(jiǎn)單。
- 一個(gè)韓國(guó)團(tuán)隊(duì)開(kāi)源的產(chǎn)品,運(yùn)用了字節(jié)碼增強(qiáng)技術(shù),只需要在啟動(dòng)時(shí)添加啟動(dòng)參數(shù)即可,對(duì)代碼無(wú)侵入,目前支持Java和PHP語(yǔ)言,底層采用HBase來(lái)存儲(chǔ)數(shù)據(jù),探針收集的數(shù)據(jù)粒度非常細(xì),但性能損耗大,因其出現(xiàn)的時(shí)間較長(zhǎng),完成度也很高,應(yīng)用的公司較多
- Skywalking是本土開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈路分析以及應(yīng)用監(jiān)控分析工具,特點(diǎn)是支持多種插件,UI功能較強(qiáng),接入端無(wú)代碼侵入。
-
CAT是由國(guó)內(nèi)美團(tuán)點(diǎn)評(píng)開(kāi)源的,基于Java語(yǔ)言開(kāi)發(fā),目前提供Java、C/C++、Node.js、Python、Go等語(yǔ)言的客戶端,監(jiān)控?cái)?shù)據(jù)會(huì)全量統(tǒng)計(jì),國(guó)內(nèi)很多公司在用,例如美團(tuán)點(diǎn)評(píng)、攜程、拼多多等,CAT跟下邊要介紹的Zipkin都需要在應(yīng)用程序中埋點(diǎn),對(duì)代碼侵入性強(qiáng)。
Screen Shot 2022-01-23 at 1.19.18 PM.png
性能對(duì)比
模擬了三種并發(fā)用戶,500,750,1000,使用JMeter測(cè)試,每個(gè)線程發(fā)送30個(gè)請(qǐng)求,設(shè)置間隔時(shí)間為10ms,使用采用頻率為1,即100%。下面是性能測(cè)試報(bào)告:

從上表可以看出,在三種鏈路監(jiān)控組件中,skywalking探針對(duì)吞吐量影響最小,zipkin對(duì)吞吐量影響適中,pinpoint的探針對(duì)吞吐量影響最大。對(duì)于內(nèi)存和cpu的使用,都差不多,相差在10%之內(nèi)。
Skywalking介紹
Skywalking架構(gòu)
SkyWalking 邏輯上分為四部分: 探針, 平臺(tái)后端, 存儲(chǔ)和用戶界面。


- 探針 基于不同的來(lái)源可能是不一樣的, 但作用都是收集數(shù)據(jù), 將數(shù)據(jù)格式化為 SkyWalking 適用的格式.
- 平臺(tái)后端, 支持?jǐn)?shù)據(jù)聚合, 數(shù)據(jù)分析以及驅(qū)動(dòng)數(shù)據(jù)流從探針到用戶界面的流程。分析包括 Skywalking 原生追蹤和性能指標(biāo)以及第三方來(lái)源,包括 Istio 及 Envoy telemetry , Zipkin 追蹤格式化等。 你甚至可以使用 Observability Analysis Language 對(duì)原生度量指標(biāo) 和 用于擴(kuò)展度量的計(jì)量系統(tǒng) 自定義聚合分析。
- 存儲(chǔ) 通過(guò)開(kāi)放的插件化的接口存放 SkyWalking 數(shù)據(jù). 你可以選擇一個(gè)既有的存儲(chǔ)系統(tǒng), 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以選擇自己實(shí)現(xiàn)一個(gè)存儲(chǔ)系統(tǒng). 當(dāng)然, 我們非常歡迎你貢獻(xiàn)新的存儲(chǔ)系統(tǒng)實(shí)現(xiàn)。
- UI 一個(gè)基于接口高度定制化的Web系統(tǒng),用戶可以可視化查看和管理 SkyWalking 數(shù)據(jù)。
Skywalking功能介紹
- 多種監(jiān)控手段,可以通過(guò)語(yǔ)言探針和service mesh獲得監(jiān)控的數(shù)據(jù)
- 支持多重語(yǔ)言的自動(dòng)探針,包括JAVA, .NET Core和NodeJS
- 輕量高效,無(wú)需大數(shù)據(jù)平臺(tái)和大量的服務(wù)器資源
- 模塊化,UI ,存儲(chǔ),集群管理都有多種機(jī)制可選
- 支持告警
- 優(yōu)秀的可視化解決方案
環(huán)境搭建

- Skywalking agent和業(yè)務(wù)端綁定在一起,負(fù)責(zé)收集各種監(jiān)控?cái)?shù)據(jù)
- Skywalking oapservice是負(fù)責(zé)處理監(jiān)控?cái)?shù)據(jù),接受agent的數(shù)據(jù)并存儲(chǔ)在數(shù)據(jù)庫(kù)中,接受來(lái)自UI的請(qǐng)求,查詢監(jiān)控?cái)?shù)據(jù)。
- Skywalking UI提供給用戶,展現(xiàn)各種監(jiān)控?cái)?shù)據(jù)和告警。
Skywalking目錄結(jié)構(gòu)

Skywalking告警

Skywalking UI


Skywalking數(shù)據(jù)下轉(zhuǎn)
Skywalking提供了詳細(xì)的數(shù)據(jù)分析功能,首先能分析出各個(gè)組件的調(diào)用關(guān)系拓?fù)鋱D,然后能從拓?fù)鋱D下轉(zhuǎn)到每個(gè)功能組件,模塊,方法的詳細(xì)性能,提供整個(gè)數(shù)據(jù)鏈路追蹤。如下示意圖,







Skywalking log集成
Skywalking 可以與日志功能集成,將模塊的日志上傳到中心進(jìn)行集中查看。
有l(wèi)ogback,log4j等對(duì)應(yīng)的jar來(lái)收集各個(gè)模塊的日志。比如集成logback,配置方式如下:
引入jar
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.4.0</version>
</dependency>
配置logback
<configuration>
<!-- 控制臺(tái)輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<! -- 配置異步記錄 AsyncAppender -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="STDOUT"/>
</appender>
<!-- skywalking grpc 日志收集 8.4.0版本開(kāi)始支持 -->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!--系統(tǒng)操作日志-->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
<appender-ref ref="grpc-log"/>
</root>
</configuration>
配置日志插件
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
主要是配合Skywalking的遠(yuǎn)程地址和端口
參考文章
這篇教程主要的內(nèi)容來(lái)自于以下:
- 圖靈學(xué)院培訓(xùn)教材(徐庶老師)
- 吳晟老師的演講稿
- Skywalking官網(wǎng)
