8.18如何搭建一套适合你的服务跟踪系统

titledatecommentscategoriestagspermalink
如何搭建一套适合你的跟踪系统
2020/5/25
true
微服务
微服务
8.18

首先回顾一下服务追踪系统的原理以及实现。主要包括三个部分。

  • 埋点数据收集。埋点来收集服务调用的上下文数据。
  • 实时数据处理负责对收集到的链路信息,按照traceid和spanid进行串联和存储。
  • 数据链路展示,把处理后的服务调用数据按照调用链的形式展示出来。

如果要自己实现这么一套服务追踪系统,这个过程难度和成本都太高,还是选择业界开源成熟的系统比较合适。

业界比较有名的服务追踪系统实现有阿里的鹰眼、Twitter 开源的 OpenZipkin,还有 Naver 开源的 Pinpoint,它们都是受 Google 发布的 Dapper 论文启发而实现的。其中阿里的鹰眼解决方案没有开源,而且由于阿里需要处理数据量比较大,所以鹰眼的定位相对定制化,不一定适合中小规模的业务团队。

OpenZipkin

其架构设计如下图所示

OpenZipkin架构

从图中可以看出,其主要由四部分组成

  • Collector:负责收集探针Reporter埋点采集的数据,经过验证处理并建立索引。
  • Storege:存储服务调用的链路数据,默认使用的是Cassandra,是因为Twitter内部大量使用了Cassandra,你也可以替换成Elasticsearch或者mysql.
  • API:将格式化和建立索引的链路数据以API的方式对外提供服务,比如被UI调用。
  • UI:以图形化的方式展示服务调用的链路数据。

它的工作原理可以用下面这张图来描述

原理图

具体流程是,通过在业务的 HTTP Client 前后引入服务追踪代码,这样在 HTTP 方法“/foo”调用前,生成 trace 信息:TraceId:aa、SpanId:6b、annotation:GET /foo,以及当前时刻的 timestamp:1483945573944000,然后调用结果返回后,记录下耗时 duration,之后再把这些 trace 信息和 duration 异步上传给 Zipkin Collector。

Pinpoint

Pinpoint是Naver开源的一款深度支持java语言的服务追踪框架,架构如下图所示

Pinpoint

Pinpoint也主要由四部分组成

  • Pinpoint Agent:通过java字节码注入的方式,来手机JVM中的调用数据,通过UDP协议传递给Collector,数据采用Thrift协议进行编码
  • Pinpoint Collector:搜集Agent传过来的数据,然后写道HBase Storage.
  • HBase Storage:采用HBase集群来存储服务调用的链路信息。
  • Pinpoint Web UI:通过webui来展示服务调用的详细链路信息。

工作原理图如下所示

Pinpoint原理图

具体流程是 请求进入 TomcatA,然后生成 TraceId:TomcatA^ TIME ^ 1、SpanId:10、pSpanId:-1(代表是根请求),接着 TomatA 调用 TomcatB 的 hello 方法,TomcatB 生成 TraceId:TomcatA^ TIME ^1、新的 SpanId:20、pSpanId:10(代表是 TomcatA 的请求),返回调用结果后将 trace 信息发给 Collector,TomcatA 收到调用结果后,将 trace 信息也发给 Collector。Collector 把 trace 信息写入到 HBase 中,Rowkey 就是 traceId,SpanId 和 pSpanId 都是列。然后就可以通过 UI 查询调用链路信息了。

选型对比

根据以往的经验,考察服务追踪系统主要从下面这几个方面

1、埋点探针支持平台的广泛性

OpenZipkin 提供了不同语言的 Library,不同语言实现时需要引入不同版本的 Library。官方提供了 C#、Go、Java、JavaScript、Ruby、Scala、PHP 等主流语言版本的 Library,而且开源社区还提供了更丰富的不同语言版本的 Library,详细的可以点击这里查看;而 Pinpoint 目前只支持 Java 语言。

所以从探针支持的语言平台广泛性上来看,OpenZipkin 比 Pinpoint 的使用范围要广,而且开源社区很活跃,生命力更强。

2、系统集成的难度

以 OpenZipkin 的 Java 探针 Brave 为例,它只提供了基本的操作 API,如果系统要想集成 Brave,必须在配置里手动里添加相应的配置文件并且增加 trace 业务代码。具体来讲,就是你需要先修改工程的 POM 依赖,以引入 Brave 相关的 JAR 包。

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.zipkin.brave</groupId>
        <artifactId>brave-bom</artifactId>
        <version>${brave.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

然后假如你想收集每一次 HTTP 调用的信息,你就可以使用 Brave 在 Apache Httpclient 基础上封装的 httpClient,它会记录每一次 HTTP 调用的信息,并上报给 OpenZipkin。


httpclient =TracingHttpClientBuilder.create(tracing).build();

而 Pinpoint 是通过字节码注入的方式来实现拦截服务调用,从而收集 trace 信息的,所以不需要代码做任何改动。

3、调用链路数据的精确度

OpenZipkin 收集到的数据只到接口级别,进一步的信息就没有了,如下图所示

OpenZipkin搜集的数据

再来看下 Pinpoint,因为 Pinpoint 采用了字节码注入的方式实现 trace 信息收集,所以它能拿到的信息比 OpenZipkin 多得多。从下面这张图可以看出,它不仅能够查看接口级别的链路调用信息,还能深入到调用所关联的数据库信息。

Pinpoint搜集的数据

在绘制链路拓扑图时,OpenZipkin 只能绘制服务与服务之间的调用链路拓扑图,比如下面这张示意图。

OpenZipkin调用链路拓扑图

而 Pinpoint 不仅能够绘制服务与服务之间,还能绘制与 DB 之间的调用链路拓扑图,比如下图。

Pinpoint调用链路拓扑图

从调用链路数据的精确度上,Pinpoint 要比 OpenZipkin 精确得多。

总结

从选型的角度来讲,如果你的业务采用的是 Java 语言,那么采用 Pinpoint 是个不错的选择,因为它不需要业务改动一行代码就可以实现 trace 信息的收集。除此之外,Pinpoint 不仅能看到服务与服务之间的链路调用,还能看到服务内部与资源层的链路调用,功能更为强大,如果你有这方面的需求,Pinpoint 正好能满足。

如果你的业务不是 Java 语言实现,或者采用了多种语言,那毫无疑问应该选择 OpenZipkin,并且,由于其开源社区很活跃,基本上各种语言平台都能找到对应的解决方案。不过想要使用 OpenZipkin,还需要做一些额外的代码开发工作,以引入 OpenZipkin 提供的 Library 到你的系统中。

除了 OpenZipkin 和 Pinpoint,业界还有其他开源追踪系统实现,比如 Uber 开源的 Jaeger,以及国内的一款开源服务追踪系统 SkyWalking。不过由于目前应用范围不是很广。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值