链路追踪利器 SkyWalking

487 阅读5分钟

随着微服务的应用数量的极速增加,服务与服务链路之间的调用关系也变得错综复杂,所以造成了一系列的难题:

  • 服务链路过长或过于复杂,无法快速并准确的定位问题。
  • 业务链处理时间过长,无法确定是哪个环节存在的问题。
  • 如何梳理服务与服务之间的依赖关系?
  • 如何快速发现定位问题并找到对应的错误信息?

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

链路追踪的主要功能:

  • 故障快速定位: 可以通过调用链结合业务日志快速定位错误信息。
  • 链路性能可视化: 各个阶段链路耗时,服务依赖关系可以通过可视化界面展示出来。
  • 链路分析: 通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。

链路追踪的关键技术点

(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

官网:skywalking.apache.org/

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功能很强大,这篇文章算是简单入门与时间,后面继续研究下服务监控、告警、日志集成等功能。