微服务是一个分布式非常复杂系统,如果没有一套调用链监控,如果服务之间依赖出现问题就很难进行调位

下图是ali在鹰眼系统给出的微服务之“熵”



目前个大主流互联网公司中,ali有非常出现的鹰眼系统,点评也有一套很出名的调用链监控系统CAT。调用链监控其实最早是google提出来的,2010年google发表了一篇调用链的论文,论文以它内部的调用链系统dapper命名,这个论文中讲解调用链在google使用的经验和原理,大致的原理如下图:



假使我们的微服务有一个web服务提供给前端进行请求,它自己又调用了svc1的一个服务,然后又调用了一个cache的服务,svc1中又调用了一个DB还有svc2的服务,这个看上去应该还比较简单,这里google提出了一个概念,叫span,当我们调用链监控启动了,在外界对微服务进行一个请求开始进入我们的微服务体系时,会生成一个Root Span,当web服务去调用后面的服务svc1时又会生成一个span,调用DB也会生成一个span,每一个应用调度都会生成一个新的span,这个是span是整个调用链形成的关键,span中有一些关键的信息,有traceId,spanId。RootSpan是比较特殊的,在启动的时候会生成spanId还会生成TraceId,其他的span会生成自己的spanId,为了维护好调用链上下文的调用关系,span会去记录调用它的链路,以parent spanId记录下来,这样的话父子之间的关系就可以记录下来,每个调用都会把第一个链路traceId也记录下来,这样,当我们把这些span都存在起来,就可以通过分析手段,把整个调用链的关系还原出来。

这里可以采用ELK的方式去记录和展示调用链监控日志,当我们一条调用为一行记录存储下来



通过traceId 和 parentSpanId 就可以串联起来为一个整体的链路,并可以从这个链路去分析错误或者调用延时和调用次数等等



目前市面主流的调用链选型有 zipkin,pinpoint,cat,skywalking,他们之间各有一些偏重点,值得一说的是skywalking国人出品的一款新的调用链工具,采用开源的基于字节码注入的调用链分析,接入段无代码入侵,而且开源支持多种插件,UI在几款工具来说比较功能比较强大,而且ui也比较赏心悦目,目前已经加入了apache孵化器。

在我们公司也采用了skywalking作为调用链工具

为何会采用skywaling,在低层原理的实现,这几款产品都差不多,但在实现和使用的细节相别还是很大。

  • 首先在实现方式上,skywalking基本对于代码做到了无入侵,采用java探针和字节码增强的方式,而在cat还采用了代码埋点,而zipkin采用了拦截请求,pinpoint也是使用java探针和字节码增强。
  • 其次在分析的颗粒度上,skywaling是方法级,而zipkin是接口级,其他两款也是方法级。
  • 在数据存储上,skywalking可以采用日志体系中比较出名的ES,其他几款,zipkin也可以使用ES,pinpoint使用Hbase,cat使用mysql或HDFS,相对复杂,由于目前公司对ES熟悉的人才比较有保证,选择熟悉存储方案也是考虑技术选型的重点。
  • 还有就是性能影响,根据网上的一些性能报告,虽然未必百分百准备,但也具备参考价值,skywalking的探针对吞吐量的影响在4者中间是最效的,经过对skywalking的一些压测也大致证明。

下面是网上摘录的几款调用链选型对比:

基本原理

类别

Zipkin

Pinpoint

SkyWalking CAT

实现方式

拦截请求,发送(HTTP,mq)数据至zipkin服务

java探针,字节码增强

java探针,字节码增强

接入

类别

Zipkin

Pinpoint

SkyWalking

CAT

接入方式」

基于linkerd或者sleuth方式,引入配置即可

javaagent字节码」

javaagent字节码

代码侵入

agent到collector的协议

http,MQ

thrift

gRPC

http/tcp

OpenTracing


×


×

分析

类别

Zipkin

Pinpoint

SkyWalking

CAT

颗粒度

接口级

方法级

方法级

代码级

全局调用统计

×




traceid查询


×


×

报警

×




JVM监控

×

×



页面UI展示

类别

Zipkin

Pinpoint

SkyWalking

CAT

健壮度

**

*****

****

*****

数据存储

类别

Zipkin

Pinpoint

SkyWalking

CAT

数据存储

ES,mysql,Cassandra,内存

Hbase

ES,H2

mysql,hdfs