Spring Cloud Finchley.SR1 的学习与应用 10 - 分布式链路跟踪 Sleuth 与 Zipkin

分布式链路跟踪 Sleuth 与 Zipkin

随着业务发展,系统拆分致使系统调用链路愈发复杂一个前端请求可能最终须要调用不少次后端服务才能完成,当整个请求变慢或不可用时,咱们是没法得知该请求是由某个或某些后端服务引发的,这时就须要解决如何快读定位服务故障点,以对症下药。因而就有了分布式系统调用跟踪的诞生。
Spring Cloud Sleuth 也为咱们提供了一套完整的解决方案。在本章中,咱们将详细介绍如何使用 Spring Cloud Sleuth + Zipkin 来为咱们的微服务架构增长分布式服务跟踪的能力。前端

Spring Cloud Sleuth

通常的,一个分布式服务跟踪系统主要由三部分构成:java

  • 数据收集
  • 数据存储
  • 数据展现

根据系统大小不一样,每一部分的结构又有必定变化。譬如,对于大规模分布式系统,数据存储可分为实时数据和全量数据两部分,实时数据用于故障排查(Trouble Shooting),全量数据用于系统优化;数据收集除了支持平台无关和开发语言无关系统的数据收集,还包括异步数据收集(须要跟踪队列中的消息,保证调用的连贯性),以及确保更小的侵入性;数据展现又涉及到数据挖掘和分析。虽然每一部分均可能变得很复杂,但基本原理都相似。 Hystrix Dashboard
服务追踪的追踪单元是从客户发起请求(request)抵达被追踪系统的边界开始,到被追踪系统向客户返回响应(response)为止的过程,称为一个 trace。每一个 trace 中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的消耗时间等信息,在每次调用服务时,埋入一个调用记录,称为一个 span。这样,若干个有序的 span 就组成了一个 trace。在系统向外界提供服务的过程当中,会不断地有请求和响应发生,也就会不断生成 trace,把这些带有 span 的 trace 记录下来,就能够描绘出一幅系统的服务拓扑图。附带上 span 中的响应时间,以及请求成功与否等信息,就能够在发生问题的时候,找到异常的服务;根据历史数据,还能够从系统总体层面分析出哪里性能差,定位性能优化的目标。git

Spring Cloud Sleuth 为服务之间调用提供链路追踪。经过 Sleuth 能够很清楚的了解到一个服务请求通过了哪些服务,每一个服务处理花费了多长。从而让咱们能够很方便的理清各微服务间的调用关系。此外 Sleuth 能够帮助咱们:github

  • 耗时分析: 经过 Sleuth 能够很方便的了解到每一个采样请求的耗时,从而分析出哪些服务调用比较耗时;
  • 可视化错误: 对于程序未捕捉的异常,能够经过集成 Zipkin 服务界面上看到;
  • 链路优化: 对于调用比较频繁的服务,能够针对这些服务实施一些优化措施。 Spring Cloud Sleuth 能够结合 Zipkin,将信息发送到 Zipkin,利用 Zipkin 的存储来存储信息,利用 Zipkin UI 来展现数据。

这是 Spring Cloud Sleuth 的概念图:
Hystrix Dashboardweb

Zipkin

Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展示。 咱们可使用它来收集各个服务器上请求链路的跟踪数据,并经过它提供的 REST API 接口来辅助咱们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口以外,它也提供了方便的 UI 组件来帮助咱们直观的搜索跟踪信息和分析请求链路明细,好比:能够查询某段时间内各用户请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。接下来的测试为方便直接采用 In-Memory 方式进行存储,生产推荐 Elasticsearch。
Hystrix Dashboard
上图展现了 Zipkin 的基础架构,它主要由 4 个核心组件构成:算法

  • Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展现等功能。
  • Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,咱们也能够修改此存储策略,经过使用其余存储组件将跟踪信息存储到数据库中。
  • RESTful API:API 组件,它主要用来提供外部访问接口。好比给客户端展现跟踪信息,或是外接系统访问以实现监控等。
  • Web UI:UI 组件,基于 API 组件实现的上层应用。经过 UI 组件用户能够方便而有直观地查询和分析跟踪信息。

开始整合

Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端也就是微服务的应用。 客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。 发送的方式主要有两种,一种是 HTTP 报文的方式,还有一种是消息总线的方式如 RabbitMQ。spring

不论哪一种方式,咱们都须要:docker

  • 一个服务注册中心,这里咱们就用以前的consul项目来当注册中心。
  • 一个 Zipkin 服务端。
  • 两个微服务应用,server-businessa-woqu和server-businessb-woqu,其中server-businessb-woqu中有一个 REST 接口/area?length=1&width=2&heigh=3,调用该接口后将触发对server-businessa-woqu应用的调用。

HTTP

在 Spring Cloud Sleuth 中对 Zipkin 的整合进行了自动化配置的封装,因此咱们能够很轻松的引入和使用它。shell

Zipkin 服务端

关于 Zipkin 的服务端,在使用 Spring Boot 2.x 版本后,官方就不推荐自行定制编译了,反而是直接提供了编译好的 jar 包来给咱们使用,请看详情。而且之前的@EnableZipkinServer也已经被打上了@Deprecated数据库

因此官方提供了一键脚本

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

若是用 Docker 的话,直接

docker run -d -p 9411:9411 openzipkin/zipkin

任一方式启动后,访问 http://localhost:9411/zipkin/ 就能看到以下界面
Hystrix Dashboard

更多关于zipkin server的信息请看zipkin-server

微服务应用端

  • POM
    在server-businessa-woqu和server-businessb-woqu的pom.xml文件中增长如下依赖:
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
  • 配置文件
    在server-businessa-woqu和server-businessb-woqu的配置文件 中增长如下内容:
spring:
  zipkin:
    base-url: http://zipkin.server:9411/ # 指定了 Zipkin 服务器的地址
  sleuth:
    sampler:
      probability: 1.0 # 将采样比例设置为 1.0,也就是所有都须要。默认是 0.1
    web:
      client:
        enabled: true

Spring Cloud Sleuth 有一个 Sampler 策略,能够经过这个实现类来控制采样算法。采样器不会阻碍 span 相关 id 的产生,可是会对导出以及附加事件标签的相关操做形成影响。 Sleuth 默认采样算法的实现是 Reservoir sampling,具体的实现类是 PercentageBasedSampler,默认的采样比例为: 0.1(即 10%)。不过咱们能够经过spring.sleuth.sampler.percentage来设置,所设置的值介于 0.0 到 1.0 之间,1.0 则表示所有采集。

  • 测试验证

请求GET http://192.168.2.102:9002/area?length=1&width=2&heigh=3

访问 http://localhost:9411/zipkin 点击 Find Traces 会看到有相应的记录 Hystrix Dashboard
Hystrix Dashboard
Hystrix Dashboard

消息总线 RabbitMQ

经过zipkin server的配置信息zipkin-server,咱们能够经过环境变量让 Zipkin 从 RabbitMQ 中读取信息,就像这样:

RABBIT_ADDRESSES=rabbitmq.server java -jar zipkin.jar

关于 Zipkin 的 Client 端,也就是微服务应用,咱们就在以前 server-businessa-woqu和server-businessb-woqu 的基础上修改,只要在他们的依赖里都引入spring-cloud-stream-binder-rabbit就行了,别的不用改,固然rabbit的配置信息要有。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

相关建议

在生产环境中,因为请求量比较大,采样比例须要按照实际请看设置,同时建议在生产环境中使用MQ来收集信息,利用MQ的削峰能力来避免服务器压力过大,同时建议使用Elasticsearch来存储数据Elasticsearch Storage参考

若是你的系统中使用了Kubernetes,那强烈建议结合Istio来进行基于容器的全面服务监控。

相关文章
相关标签/搜索