随着微服务的应用数量的极速增加,服务与服务链路之间的调用关系也变得错综复杂,所以造成了一系列的难题:
- 服务链路过长或过于复杂,无法快速并准确的定位问题。
- 业务链处理时间过长,无法确定是哪个环节存在的问题。
- 如何梳理服务与服务之间的依赖关系?
- 如何快速发现定位问题并找到对应的错误信息?
分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
链路追踪的主要功能:
- 故障快速定位: 可以通过调用链结合业务日志快速定位错误信息。
- 链路性能可视化: 各个阶段链路耗时,服务依赖关系可以通过可视化界面展示出来。
- 链路分析: 通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。
链路追踪的关键技术点
(1)Trace
Trace的含义比较直观,就是链路,指一个请求经过所有服务的路径,服务间经过的局部链路构成了一条完整的链路,其中每一条局部链路都用一个全局唯一的traceid来标识。
(2)Span
Span用来表示上下层的父子关系,同一层级parent id相同,span id不同,span id从小到大表示请求的顺序。通过事先在日志中埋点,找出相同traceId的日志,再加上parent id和span id就可以将一条完整的请求调用链串联起来。
(3)采样
由于每一个请求都会生成一个链路,为了减少性能消耗,避免存储资源的浪费,采集器并不会上报所有的span数据,而是使用采样的方式。举个例子,每秒有1000个请求访问系统,如果设置采样率为1/1000,那么只会上报一个请求到存储端。
(4)存储
链路中的span数据经过收集和上报后会集中存储在一个地方,常用的存储有Mysql,ElasticSearch, HBase, In-memory DB等。
当前主流开源组件
常用链路追踪工具的有:Zipkin、SkyWalking、CAT。
- Zipkin 是 Twitter 开源的调用链分析工具,目前基于 SpringCloud Sleuth 得到了广泛的使用,特点是轻量,使用部署简单。
- SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI 功能较强,接入端无代码侵入。目前已加入 Apache 孵化器。
- CAT 是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
网上对这3个主流组件的对比文章有很多,在这就不啰嗦了,贴几张对比图:
前不久在对Cat、Zipkin、SkyWalking的简单实践后,纯属个人观点:
- 从接入方式来看,Cat的代码侵入性最高,Zipkin只需要基于Sleuth方式引入配置,SkyWalking无代码侵入性。
- 从使用入门来看,Zipkin容易些,Cat成本高些。
- 从页面UI展示来看,健壮度:CAT > SkyWalking> Zipkin。
综上所述,Skywalking代码无侵入性,通信方式采用 gRPC ,性能较好,UI 够强也够用。
SkyWalking
GitHub:github.com/apache/skyw…
SkyWalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP系统。Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA, c++代理。
Skywalking架构图
服务端部署
1. 下载 SkyWalking
下载地址:skywalking.apache.org/downloads/
2. 配置 SkyWalking
解压压缩包,编辑在 config 目录下的 application.yml 文件。
(1)配置集群注册中心
使用nacos作为注册中心,修改集群配置
cluster:
selector: ${SW_CLUSTER:nacos}
nacos:
serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
# Nacos Configuration namespace
namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"7e98b650-0c03-4663-b747-b3d4848630aa"}
# Nacos auth username
username: ${SW_CLUSTER_NACOS_USERNAME:""}
password: ${SW_CLUSTER_NACOS_PASSWORD:""}
# Nacos auth accessKey
accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""}
secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""}
internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""}
internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}
(2)配置数据库
默认使用 H2 内嵌数据库,重启服务会丢失数据,可以修改为 Mysql 做持久化。
storage:
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking?rewriteBatchedStatements=true"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
(3)添加 Mysql 驱动包
在 oap-libs 目录下添加 Mysql 的驱动包,可以直接从本地 Maven 仓库拷贝一个mysql驱动包。若不添加驱动包,启动程序会报错:java.lang.RuntimeException: Failed to get driver instance for jdbcUrl=jdbc
在使用Mysql做存储的时候,在部署的时候可能还会遇到一些小问题,例如数据库版本、驱动包、索引过大、时区等问题,大家到时候见招拆招就行,都是些小问题。
3. 启动 Skywalking
进入 bin 目录,Linux 执行 ./startup.sh(Windows 直接双击 startup.bat)启动 。启动后会运行两个服务:
- Skywalking-Webapp:管理平台页面 ,端口 8080。
- Skywalking-Collector:追踪信息收集器服务,HTTP端口12800,gRpc端口11800。
启动测试工程
只需要在项目启动加上agent启动参数即可。
-javaagent:D:\microservices\apache-skywalking-apm-es7-8.7.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=nacos-dubbo-provider
-Dskywalking.collector.backend_service=localhost:11800
参数说明:
- javaagent:skywalking-agent.jar 所在文件路径。
- Dskywalking.agent.service_name:在 Skywalking 服务端显示的名称。
- Dskywalking.collector.backend_service:服务端的IP和端口。
我基于以前的dubbo测试项目,启动一个provider和Consumer,在Skywalking查看链路调用情况。
仪表盘
拓扑图
追踪
Skywalking功能很强大,这篇文章算是简单入门与时间,后面继续研究下服务监控、告警、日志集成等功能。