分布式服务跟踪spring cloud sleuth

微服务架构系统,各微服务间的调用关系错综复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引发请求最后的失败。这时候,全链路调用跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路的性能瓶颈等。

针对上面所述的分布式服务跟踪问题,spring cloud sleuth 提供了一套完整的解决方案。

跟踪原理

⚠️主要包括两个关键点:

  • 为了实现请求跟踪,当请求发送到分布式系统入口端点时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标示,同时在分布式系统内部流转的时候,框架始终保持传递该唯一标识,直到返回给请求方为止,这个标识就是TraceID。通过TraceID的记录,我们就能将所有请求过程的日志关联起来。
  • 为了统计各处理单元的时间延迟,当请求到达各个服务组件时,或是处理逻辑到达某个状态时,也通过一个唯一标识来标记它的开始,具体过程以及结束,该标识就是SpanID。对于每个span来说,它必须有开始和结束两个节点,通过记录开始span和结束span的时间戳,就能统计出该span的时间延迟,除了时间戳记录之外,它还可以包含一些其它元数据,比如事件名称、请求消息等。

⚠️跟踪机制

  • 通过诸如RabbitMQ、Kafka(或者其他任何Spring Cloud Stream绑定器实现的消息中间件)传递的请求。
  • 通过Zuul代理传递的请求。
  • 通过RestTemplate发起的请求。

⚠️抽样收集

通过TraceID和SpanID已经实现了对分布式系统的请求跟踪,而记录的跟踪信息最终会被分析系统收集起来,并用来实现对分布式系统的监控和分析功能,比如,预警延迟过长的请求链路、查询请求链路的调用明细等。此时,我们在对接分析系统时就会遇到一个问题,分析系统在收集跟踪信息的时候,需要收集多少跟踪信息才合适呢?

理论上来说,我们收集的跟踪信息越多就可以越好的反映出系统实际运行情况,并给出更精确的预警与分析。但是在高并发的分布式系统运行时,大量的请求调用会产生海量的跟踪日志信息,如果收集过多的跟踪信息将会对整个分布式系统的性能造成一定的影响,同时保存大量的日志信息也需要不少的存储开销。所以在sleuth中采用了抽样收集的方式为跟踪信息打上标记。

sleuth中的抽样收集策略通过Sampler接口实现。

猜你喜欢

转载自blog.csdn.net/simplemurrina/article/details/80186209