如何实现接口调用链路的跟踪?
在传统的单应用架构下,接口的日志监控还是非常简单的,但是随着分布式、微服务架构的兴起,我们会面对更为复杂的服务交互关系;
也就是说,以往的系统,更多的是A系统调用B系统,而现在可能面对这A->B->C->D,而在这种情况下,如果没有链路跟踪的方案,那么查找和定位问题就会非常困难。
理论基础Google公司研发了Dapper分布式跟踪系统,并发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》;
目前行业内大部分的分布式跟踪方案都是基于这篇论文来实现的;这篇论文中提到了几个比较重要的概念:
annotation-based,基于标注:在程序代码或中间件中,定义一个全局的annotation,可以把这个看做是一个追踪ID;在请求链路中,每一次远程调用都要带着这个ID(通常都是通过代码埋点实现);
跟踪树和span:在跟踪树结构中,通过parentId和spanId可以有序地把所有的关系串联起来,达到记录业务流的作用;例如A->B->C和D;那么:
A:parentId=null、spanId=1;
B:parentId=1、spanId=2;
C:parentId=2、spanId=3;
D:parentId=2、spanId=4;
实现方案zipkin:Twitter公司的zipkin是Google Dapper系统的开源实现,zipkin是严格按照Dapper论文来实现的;zipkin的功能包括数据的收集、存储、查找和展现,一应俱全;
Spring Cloud Sleuth:如果使用Spring全家桶的话,通常可以使用Sleuth来做服务之间调用提供链路追踪;使用Sleuth的时候,也可以和zipkin做集成,将搜集到的信息发送到zipkin,利用zipkin进行数据的存储和展示;
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。