03.08 在微服务架构下,如何实现接口调用链路的跟踪?

低调的牛肉


在传统的单应用架构下,接口的日志监控还是非常简单的,但是随着分布式、微服务架构的兴起,我们会面对更为复杂的服务交互关系;

也就是说,以往的系统,更多的是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开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


集成zipkin或者spring cloud sleuth都可以的


llspaces


pinpoint

skywalking


分享到:


相關文章: