十五、微服务跟踪之Spring Cloud Sleuth与Zipkin配合使用


Zipkin简介

ZipkinTwitter开源的分布式跟踪系统,基于Dapper的论文设计而来。它的主要功能是收集系统的时序数据,从而跟踪微服务架构的系统时序等问题。Zipkin还提供了一个非常友好的界面,来帮助分析追踪数据。


编写Zipkin Server

  1. 新建项目,pom添加依赖:
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
</dependency>
  1. 启动类添加@EnableZipkinServer注解。

  2. application.yml中配置:

server:
  port: 9411
  1. 启动Zipkin服务:
    zipkin

微服务整合Zipkin

  1. 客户端添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
  1. application.yml中配置:
spring:
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    #    采样百分比,默认0.1(10%)
    sampler:
      percentage: 1.0
  1. 启动服务并访问:
    zipkin
    zipkin
    zipkin

使用消息中间件收集数据

使用消息中间件有以下优点:

  • 微服务与Zipkin Server解耦,微服务无需知道Zipkin Server的网络地址。
  • 在一些场景下,Zipkin Server与微服务网络可能不同,使用 HTTP 直接收集的方式无法工作,此时可借助消息中间件实现数据收集。

如图:
zipkin使用mq

改造Zipkin Server
  1. pom修改依赖:
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
    <!--mq收集数据-->
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
    <version>2.3.1</version>
</dependency>
  1. application.yml配置文件:
server:
  port: 9411
spring:
  application:
    name: zipkin-server
zipkin:
  collector:
    rabbitmq:
      #      多个地址使用,分隔
      addresses: localhost:5672
      username: guest
      password: guest
      queue: zipkin

这样,Zipkin Server就改造完成。

改造微服务
  1. pom修改依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-amqp</artifactId>
    <version>1.7.5.RELEASE</version>
</dependency>
  1. application.yml配置文件:
spring:
  application:
    name: micorservice-provider-user
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
  zipkin:
    rabbitmq:
      queue: zipkin

这样,微服务就改造完成。


使用Elasticsearch存储跟踪数据

Zipkin Server是将数据存储在内存中的。一旦Zipkin Server重启或者发生崩溃,就会导致历史数据的丢失。

Zipkin Server支持多种后端存储,如MYSQLElasticsearchCassandra等等。

  1. pom修改依赖:
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
    <!--mq收集数据-->
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <!--支持elasticsearch 2.x - 6.x-->
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
    <version>2.3.1</version>
</dependency>
  1. application.yml配置文件:
zipkin:
  collector:
    rabbitmq:
      #      多个地址使用,分隔
      addresses: localhost:5672
      username: guest
      password: guest
      queue: zipkin
  storage:
    type: elasticsearch
    elasticsearch:
      cluster: elasticsearch
      hosts: http://localhost:9200
      index: zipkin
      index-shareds: 5
      index-replicas: 5
  1. 启动微服务,访问后,访问http://localhost:9200/_search,可以看到如下结果:
{
    "took":5,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":7,
        "max_score":1,
        "hits":[
            {
                ...
            }
        ]
    }
}

说明能够正常将数据存储在elasticsearch中。重启Zipkin Server,仍可以查询历史数据。

依赖关系图

使用elasticsearch存储数据后,单击Zipkin Server导航栏上的Dependencies,会发现一片空白。

要想分析微服务之间的依赖关系,需借助zipkin-denpendencies(https://github.com/openzipkin/zipkin-dependencies)组件,该工具本质上是一个`Spark job`。


该文章摘自《Spring Cloud 与 Docker 微服务架构实战(第二版)》

以上


文章作者: Qliang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Qliang !
评论
 上一篇
Spring容器 Spring容器
介绍Spring容器并不只有一个,Spring自带了多个容器实现,可以归为两种类型。 bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器提供基本的DI支持。
2019-03-23
下一篇 
十四、微服务跟踪之Spring Cloud Sleuth 十四、微服务跟踪之Spring Cloud Sleuth
为什么要实现微服务跟踪微服务之间通过网络进行通信,同时网络常常很脆弱,网络资源也有限。如果能够跟踪每个请求,了解请求经过哪些微服务、请求耗费时间、网络延迟、业务逻辑耗费时间等指标、那么久能更好地分析系统瓶颈、解决系统问题。 Sping Cl
2019-01-30
  目录