SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)

回溯

前面的章节讲解了微服务的互相调用,以及注册发现,熔断,网关等等,但是这些操作还不足以支撑项目的开发,我们还需要对程序的各方面分析等等,那么这章节讲解 链路追踪 ,不过和网关一样,Alibaba并没有开源相对应的组件,所以我们需要自己进行选择。

链路追踪(介绍)

在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题:

  • 如何快速发现问题?
  • 如何判断故障影响范围?
  • 如何梳理服务依赖以及依赖的合理性?
  • 如何分析链路性能问题以及实时容量规划?

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
就是这样一个调用链,一个用户请求了应用A,应用A需要请求应用B和应用C,而应用C需要请求应用D和应用E。

分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

基本实现原理

如果想知道一个接口在哪个环节出现了问题,就必须清楚该接口调用了哪些服务,以及调用的顺序,如果把这些服务串起来,看起来就像链条一样,我们称其为调用链。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)

想要实现调用链,就要为每次调用做个标识,然后将服务按标识大小排列,可以更清晰地看出调用顺序,我们暂且将该标识命名为spanid。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)

实际场景中,我们需要知道某次请求调用的情况,所以只有spanid还不够,得为每次请求做个唯一标识,这样才能根据标识查出本次请求调用的所有服务,而这个标识我们命名为traceid。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
现在根据spanid可以轻易地知道被调用服务的先后顺序,但无法体现调用的层级关系,正如下图所示,多个服务可能是逐级调用的链条,也可能是同时被同一个服务调用。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
所以应该每次都记录下是谁调用的,我们用parentid作为这个标识的名字。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
到现在,已经知道调用顺序和层级关系了,但是接口出现问题后,还是不能找到出问题的环节,如果某个服务有问题,那个被调用执行的服务一定耗时很长,要想计算出耗时,上述的三个标识还不够,还需要加上时间戳,时间戳可以更精细一点,精确到微秒级。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
只记录发起调用时的时间戳还算不出耗时,要记录下服务返回时的时间戳,有始有终才能算出时间差,既然返回的也记了,就把上述的三个标识都记一下吧,不然区分不出是谁的时间戳。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
虽然能计算出从服务调用到服务返回的总耗时,但是这个时间包含了服务的执行时间和网络延迟,有时候我们需要区分出这两类时间以方便做针对性优化。那如何计算网络延迟呢?我们可以把调用和返回的过程分为以下四个事件。

  • Client Sent简称cs,客户端发起调用请求到服务端。
  • Server Received简称sr,指服务端接收到了客户端的调用请求。
  • Server Sent简称ss,指服务端完成了处理,准备将信息返给客户端。
  • Client Received简称cr,指客户端接收到了服务端的返回信息。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)
假如在这四个事件发生时记录下时间戳,就可以轻松计算出耗时,比如sr减去cs就是调用时的网络延迟,ss减去sr就是服务执行时间,cr减去ss就是服务响应的延迟,cr减cs就是整个服务调用执行的时间。

SpringCloud Alibaba - 链路追踪(浅谈链路追踪 / 阿里组件 并没有链路追踪,应该选取哪一种使用好)

其实span块内除了记录这几个参数之外,还可以记录一些其他信息,比如发起调用服务名称、被调服务名称、返回结果、IP、调用服务的名称等,最后,我们再把相同spanid的信息合成一个大的span块,就完成了一个完整的调用链。

PS(实现原理编写,参考 一文读懂链路追踪)。

常用组件

  1. cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。
  2. zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth使用较为简单, 集成很方便, 但是功能较简单。
  3. pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
  4. SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
  5. Sleuth SpringCloud 提供的分布式系统中链路追踪解决方案。

SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的,我们可以采用Sleuth +Zinkin来做链路追踪解决方案。这也是目前企业中较为流行的方案。