随着业务的发展,软件架构也越来越复杂,为了适应海量用户高并发请求,系统中的组件也逐渐的变为分布式,单体服务变为微服务、缓存变为分布式缓存、组件通信变为分布式消息。

系统进行交互时,一个请求往往需要调用多个服务,当需要排查问题时,搞清楚服务之间的调用关系,服务与服务的调用顺序就变得重要起来。

什么是分布式链路追踪

分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

链路追踪最早可以追溯到谷歌的 Dapper 系统,但是 Dapper 链路追踪系统并没有开源,不过谷歌发表了一篇论文:《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,讲述了分布式链路追踪的理论和 Dapper 的设计思想,特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。

Dapper 中有几个关键的技术点来表示链路的信息:Trace、Span、Annotations。

Trace

Trace 表示一次请求经过所有服务的路径。用一个全局唯一的 traceid 来标识。

Span

Span 用来表示父子关系,同一层级 parent id 相同,span id 不同,span id 从小到大表示请求的顺序。

Annotations

Annotations 用于用户自定义事件,用来辅助定位问题。
通常包含四个注解信息:

cs:Client Start,表示客户端发起请求;

sr:ServerReceived,表示服务端收到请求;

ss:Server Send,表示服务端完成处理,并将结果发送给客户端;

cr:ClientReceived,表示客户端获取到服务端返回信息;

采样和存储

为了减少性能消耗,避免存储资源的浪费,dapper 并不会上报所有的 span 数据,而是使用采样的方式。举个例子,每秒有 1000 个请求访问系统,如果设置采样率为 1/1000,那么只会上报一个请求到存储端。

链路中的 span 数据经过收集和上报后会集中存储在一个地方,Dapper 使用了 BigTable 数据仓库,常用的存储还有 ElasticSearch, HBase, In-memory DB 等。

目前业界的链路追踪系统,如 Twitter 的 Zipkin,Uber 的 Jaeger,阿里的鹰眼,美团的 Mtrace 以及本文介绍的 SkyWalking,大多数都是受谷歌 Dapper 的启发。

SkyWalking

SkyWalking 是一个优秀的国产开源 APM(Application Performance Management) 组件,是一个对分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。2015 年由个人吴晟开源 , 2017 年加入 Apache 孵化器。

SkyWalking 支持 SpringBoot、SpringCloud、dubbo 集成,代码无侵入,通信方式采用 GRPC,性能较好,实现方式是 探针,支持告警,支持 JVM 监控,支持全局调用统计等等,功能较完善。

SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据。

SkyWalking 架构

SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。

Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。

在上面的架构图中我们需要关注的只有 SkyWalking Collecter、SkyWalking UI 和 存储设备,SkyWalking Collecter、SkyWalking UI 官方下载安装包内已包含,最终我们只需考虑存储设备即可。

安装

本文以 SkyWalking9.4.0 演示,SkyWalking 下载地址:http://skywalking.apache.org/downloads/

以 Linux 为例。启动脚本在 bin/startup.sh。会启动两个服务:

1、 skywalking-oap-server 服务

skywalking-oap-server 服务启动后会暴露 11800 和 12800 两个端口,分别为收集监控数据的端口 11800 和接受前端请求的端口 12800,可以在 config/applicaiton.yml 修改端口,数据库存储等。默认使用 H2 数据库存储。

2、 skywalking-web-ui 服务

SkyWalking UI 界面的数据是通过请求 SkyWalking OAP 服务来获得。

skywalking-web-ui 服务会占用 8080 端口, 可以在 webapp/applicaiton.yml 修改端口。

启动成功之后,访问 Skywalking UI 界面:http://127.0.0.1:8080/

项目集成

监控 Java 项目,需要下载 Java 所需的探针 Skywalking Agent。

在 IDEA 中使用 SkyWalking, 配置 java 启动参数

1
2
3
4
5
6
// 探针的位置
-javaagent:/kywalking-agent所在目录/skywalking-agent/skywalking-agent.jar
//服务名称
-Dskywalking.agent.service_name=system
//skywalking collector的地址
-Dskywalking.collector.backend_service=192.168.68.28:11800

配置完,启动 Java 项目。

展示效果

链路拓扑

每个请求的调用链路

概览全局页