在微服务架构下,由于进行了服务拆分,一次请求往往需要涉及多个服务,每个服务可能是由不同的团队开发,使用了不同的编程语言,还有可能部署在不同的机器上,甚至分布在不同的数据中心。
服务追踪的作用
在介绍服务追踪原理与实现之前,我们先来看看服务追踪的作用,如下:
- 优化系统瓶颈:通过记录调用经过的每一条链路上的耗时,我们能快速定位整个系统的瓶颈点在哪里。比如服务A调用服务B接口时发现很慢,肯定是由于某种原因造成的,有可能是运营商网络延迟、网关系统异常、B服务异常,还有可能是缓存或者数据库异常等。通过服务追踪,可以从全局视角上去观察,找出整个系统的瓶颈点所在,然后做出针对性的优化;
- 优化链路调用:通过服务追踪可以分析调用所经过的路径,然后评估是否合理。比如服务A调用下游多个服务,通过调用链分析,可以评估是否每个依赖都是必要的,是否可以通过业务优化来减少服务依赖。
- 生成网络拓扑:通过服务追踪系统中记录的链路信息,可以生成一张系统的网络调用拓扑图,它可以反映系统都依赖了哪些服务,以及服务之间的调用关系是什么样的。除此之外,在网络拓扑图上还可以把服务调用的详细信息也标识出来,也能起到服务监控的作用;
- 透明传输数据:除了服务追踪,业务上经常有一种需求,期望能把一些用户数据,从调用的开始一直往下传递,以便系统中的各个服务都能获取到这个信息。比如业务想做一些A/B测试,这时候就想通过服务追系统,把A/B测试的开关逻辑一直往下传递,经过的每一层服务都能获取到这个开关值,就能够统一进行A/B测试。
服务追踪的由来
服务追踪系统的鼻祖:2010年谷歌发布的Dapper论文中介绍了谷歌分布式系统追踪的基础原理和架构。它的核心理念就是调用链:通过一个全局唯一ID将分布在各个服务节点上的同一次请求串联起来,从而还原原有的调用关系,可以追踪系统问题、分析调用数据并统计各种系统指标。
后面诞生的各种服务追踪系统都是基于Dapper衍生出来的,比较有名的有Twitter的Zipkin、阿里的鹰眼、美团的MTrace等。