微服務架構已經是一個很通用的系統(tǒng)架構狼荞,常見的技術棧如下圖所示部凑,這張架構圖基本涵括了當前微服務體系下的各種技術棧分歇,可能不同的技術棧有不同的開源實現(xiàn)善炫。
今天主要介紹Skywalking例驹,數(shù)據(jù)鏈路追蹤捐韩,主要的資料來源于網上的教程。
鏈路追蹤介紹
對于一個大型的幾十個鹃锈,幾百個微服務構成的微服務架構系統(tǒng)荤胁,通常會遇到下面的一系列問題。
- 如何串聯(lián)整個調用鏈路仪召,快速定位問題寨蹋?
- 如何澄清各個微服務之間的依賴關系?
- 如何進行各個微服務接口的性能分析扔茅?
- 如何追蹤各個業(yè)務流程的調用處理順序已旧?
Skywalking介紹
Skywalking是一個國產的開源框架,2015年有吳晟個人開源召娜,2017年加入Apache孵化器运褪,國人開源的產品,主要開發(fā)人員來自于華為玖瘸,2019年4月17日Apache董事會批準SkyWalking成為頂級項目秸讹,支持Java、.Net雅倒、NodeJs等探針璃诀,數(shù)據(jù)存儲支持Mysql、Elasticsearch等蔑匣,跟Pinpoint一樣采用字節(jié)碼注入的方式實現(xiàn)代碼的無侵入劣欢,探針采集數(shù)據(jù)粒度粗,但性能表現(xiàn)優(yōu)秀裁良,且對云原生支持凿将,目前增長勢頭強勁,社區(qū)活躍价脾。
Skywalking是分布式系統(tǒng)的應用程序性能監(jiān)視工具牧抵,專為微服務,云原生架構和基于容器(Docker侨把,K8S,Mesos)架構而設計犀变,它是一款優(yōu)秀的APM(Application Performance Management)工具妹孙,包括了分布式追蹤,性能指標分析和服務依賴分析等弛作。
鏈路追蹤框架對比
目前市面上開源的APM系統(tǒng)主要有CAT涕蜂、Zipkin华匾、Pinpoint映琳、SkyWalking,大都是參考Google的Dapper實現(xiàn)的
功能和技術方案對比
- Zipkin是Twitter開源的調用鏈路分析工具蜘拉,目前基于Spingcloud sleuth得到了廣泛的應用萨西,特點是輕量,部署簡單旭旭。
- 一個韓國團隊開源的產品谎脯,運用了字節(jié)碼增強技術,只需要在啟動時添加啟動參數(shù)即可持寄,對代碼無侵入源梭,目前支持Java和PHP語言,底層采用HBase來存儲數(shù)據(jù)稍味,探針收集的數(shù)據(jù)粒度非常細废麻,但性能損耗大,因其出現(xiàn)的時間較長模庐,完成度也很高烛愧,應用的公司較多
- Skywalking是本土開源的基于字節(jié)碼注入的調用鏈路分析以及應用監(jiān)控分析工具,特點是支持多種插件掂碱,UI功能較強怜姿,接入端無代碼侵入。
-
CAT是由國內美團點評開源的疼燥,基于Java語言開發(fā)沧卢,目前提供Java、C/C++醉者、Node.js但狭、Python、Go等語言的客戶端湃交,監(jiān)控數(shù)據(jù)會全量統(tǒng)計熟空,國內很多公司在用,例如美團點評搞莺、攜程息罗、拼多多等,CAT跟下邊要介紹的Zipkin都需要在應用程序中埋點才沧,對代碼侵入性強迈喉。
Screen Shot 2022-01-23 at 1.19.18 PM.png
性能對比
模擬了三種并發(fā)用戶绍刮,500,750挨摸,1000孩革,使用JMeter測試,每個線程發(fā)送30個請求得运,設置間隔時間為10ms膝蜈,使用采用頻率為1,即100%熔掺。下面是性能測試報告:
從上表可以看出饱搏,在三種鏈路監(jiān)控組件中,skywalking探針對吞吐量影響最小置逻,zipkin對吞吐量影響適中推沸,pinpoint的探針對吞吐量影響最大。對于內存和cpu的使用券坞,都差不多鬓催,相差在10%之內。
Skywalking介紹
Skywalking架構
SkyWalking 邏輯上分為四部分: 探針, 平臺后端, 存儲和用戶界面恨锚。
- 探針 基于不同的來源可能是不一樣的, 但作用都是收集數(shù)據(jù), 將數(shù)據(jù)格式化為 SkyWalking 適用的格式.
- 平臺后端, 支持數(shù)據(jù)聚合, 數(shù)據(jù)分析以及驅動數(shù)據(jù)流從探針到用戶界面的流程宇驾。分析包括 Skywalking 原生追蹤和性能指標以及第三方來源,包括 Istio 及 Envoy telemetry , Zipkin 追蹤格式化等眠冈。 你甚至可以使用 Observability Analysis Language 對原生度量指標 和 用于擴展度量的計量系統(tǒng) 自定義聚合分析飞苇。
- 存儲 通過開放的插件化的接口存放 SkyWalking 數(shù)據(jù). 你可以選擇一個既有的存儲系統(tǒng), 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以選擇自己實現(xiàn)一個存儲系統(tǒng). 當然, 我們非常歡迎你貢獻新的存儲系統(tǒng)實現(xiàn)。
- UI 一個基于接口高度定制化的Web系統(tǒng)蜗顽,用戶可以可視化查看和管理 SkyWalking 數(shù)據(jù)布卡。
Skywalking功能介紹
- 多種監(jiān)控手段,可以通過語言探針和service mesh獲得監(jiān)控的數(shù)據(jù)
- 支持多重語言的自動探針雇盖,包括JAVA, .NET Core和NodeJS
- 輕量高效忿等,無需大數(shù)據(jù)平臺和大量的服務器資源
- 模塊化,UI ,存儲崔挖,集群管理都有多種機制可選
- 支持告警
- 優(yōu)秀的可視化解決方案
環(huán)境搭建
- Skywalking agent和業(yè)務端綁定在一起贸街,負責收集各種監(jiān)控數(shù)據(jù)
- Skywalking oapservice是負責處理監(jiān)控數(shù)據(jù),接受agent的數(shù)據(jù)并存儲在數(shù)據(jù)庫中狸相,接受來自UI的請求薛匪,查詢監(jiān)控數(shù)據(jù)。
- Skywalking UI提供給用戶脓鹃,展現(xiàn)各種監(jiān)控數(shù)據(jù)和告警逸尖。
Skywalking目錄結構
Skywalking告警
Skywalking UI
Skywalking數(shù)據(jù)下轉
Skywalking提供了詳細的數(shù)據(jù)分析功能,首先能分析出各個組件的調用關系拓撲圖,然后能從拓撲圖下轉到每個功能組件娇跟,模塊岩齿,方法的詳細性能,提供整個數(shù)據(jù)鏈路追蹤苞俘。如下示意圖盹沈,
Skywalking log集成
Skywalking 可以與日志功能集成,將模塊的日志上傳到中心進行集中查看吃谣。
有l(wèi)ogback乞封,log4j等對應的jar來收集各個模塊的日志。比如集成logback基协,配置方式如下:
引入jar
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.4.0</version>
</dependency>
配置logback
<configuration>
<!-- 控制臺輸出 -->
<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版本開始支持 -->
<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的遠程地址和端口
參考文章
這篇教程主要的內容來自于以下:
- 圖靈學院培訓教材(徐庶老師)
- 吳晟老師的演講稿
- Skywalking官網