SpringCloud 基础教程(十二)-Zipkin 分布式链路追踪系统搭建

烂漫一生 提交于 2020-02-27 15:53:19

 我的博客:程序员笑笑生,欢迎浏览博客!

 上一章 SpringCloud 基础教程(十一)-Sleuth 调用链追踪简介当中,我们将介绍了Spring Cloud Sleuth在分布式环境中实现了调用链路信息的打印,本章将在此基础之上结合Zikpin搭建完整的实时数据追踪系统。

前言

 Zipkin是一款分布式追踪系统,是用来收集并诊断微服务体系中系统延时问题,主要功能就是收集和查找这些问题,Spring Cloud Sleuth实现了Dapper(Google 分布式跟踪系统的论文),生成了一系列的追踪数据,当然也能集成Zipkin,聚集日志到Zipkin中,由Zipkin收集并存储,以及提供查询等功能

一、Zipkin简介

 Zipkin主要由4个部分组成,如下图:

  • 收集器:Collector
  • 存储器:Storage,默认是内存存储,我们可以改成数据库如Mysql等
  • 查询:提供RESTful的api提供查询
  • Web界面:单独的UI组件

file

二、快速使用

 Zipkin分为服务端和客户端,服务端就是单独的一个Zipkin服务,用来收集、展示信息用的,而客户端在微服务架构中就是每个微服务的组件,我们在每个组件中配置Zipkin服务端的连接地址URL,就可以将追踪信息传输给Zipkin。传输采用的事HTTP请求,当然也可以改成消息总线的方式.

2.1 搭建Zipkin服务端

 新建Maven项目,在pom中引入zipkin的依赖,zipkin-server为服务端依赖,zipkin-autoconfigure-ui为web依赖:

<dependency>
  <groupId>io.zipkin.java</groupId>
  <artifactId>zipkin-server</artifactId>
   <version>2.11.9</version>
</dependency>
<dependency>
 <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-autoconfigure-ui</artifactId>
   <version>2.11.9</version>
</dependency>

 创建启动类:SleuthServeApplication,添加@EnableZipkinServer注解,表示允许启动Zipkin服务:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin2.server.internal.EnableZipkinServer;

@SpringBootApplication
@EnableZipkinServer
public class SleuthServeApplication {
    public static void main(String[] args) {
        SpringApplication.run(SleuthServeApplication.class, args);
    }
}

 配置applicaiton.yml,注意如果没有添加 management.metrics.web.server.auto-time-requests=false ,则请求web UI时出现错误,这个是表示关闭自动监测;

server:
  port: 8242
management:
  metrics:
    web:
      server:
       auto-time-requests: false

 启动项目后,请求http://localhost:8242/,出现以下的页面:

file

可以根据服务名称,Span等其他条件查询链路追踪的情况.

2.2、收集客户端信息到Zipkin服务端

 搭建好了Zipkin服务端后,我们需要在客户端(开发微服务组件)中配置相关的信息,我们回顾一下我们的服务组件:

  • Eureka注册中心:eureka-server
  • 服务提供者:server-provider实例2个
  • 服务消费者:server-consumer实例1个

 我们在上一章中为每个组件都引入了sleuth依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

 现在同样为每一个服务添加spring Cloud sleuth对Zipkin支持的依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

 接着在服务提供者:server-provider和服务消费者:server-consumer的application.yml中配置:

spring:
  zipkin:
    base-url: http://localhost:8242/
    enabled: true
  sleuth:
   sampler:
     probability: 1.0
  • spring.zipkin.base-url: zipkin服务端连接地址url
  • spring.zipkin.enabled: 允许开启zipkin
  • spring.sleuth.sampler.probability:表示采样率,1.0表示日志全量传递到服务端

 接下来,我们启动所有的服务以及Zipkin的服务端,并通过服务消费者接口调用服务消费者接口:

http://localhost:5168/hystrix/sayHello?name=test,接口成功的返回了信息,日志同样打出了调用链的信息:

我们通过zipkin服务端的web UI查看到了一条请求:

file

注意:当前采用的是HTTP方式传输数据

 双击之后显示调用链的具体信息,这是一个完整的Trace在Web页面的显示,这条调用链经过了服务消费者,

Hystrix,为什么经过Hyxtrix呢,我们知道Hystrix为每一个资源维护了一个线程池,所以有一个单独的Span

,同时经过了服务提供者,这样我们可以查看到服务调用的关系依赖了:

file

点击应用名称,我们还可以看到更多的信息,请求耗时等信息:

file

2.3 其他支持

  • 默认情况下,Spring Cloud Sleuth 提供对Feign的支持,通过 TraceFeignClientAutoConfigration,可以通过设置 srping.sleuth.feign.enabled=false 禁用
  • 对于Zuul的调用,同样支持调用追踪,可以通过设置spring.sleuth.zuul.enabled=false,禁用支持

三、整合MYSQL

 Zipkin对数据的存储默认是在内存中的,在企业生产环境中,我们需要持久化这些数据,同样我们可以将其与Mysql进行整合:

 在Zipkin服务端的pom文件中,我们再添加以下依赖:

            <!--自动注入配置-->
            <dependency>
                <groupId>io.zipkin.java</groupId>
                <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
                <version>2.11.9</version>
            </dependency>

            <!--mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>

            <!--spring boot 数据源-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>

 application.yml配置中:

server:
  port: 8242
management:
  metrics:
    web:
      server:
       auto-time-requests: false
spring:
  datasource:
    username: root
    url: jdbc:mysql://localhost:3306/zipkin
    password: 123456
    driver-class-name:  com.mysql.jdbc.Driver
    schema: classpath:/mysql.sql
    //项目启动时候 初始化数据库
    initialization-mode: always
zipkin:
  storage:
    type : mysql
    mysql:
      host : localhost
      port : 3306
      username :  root
      password : 123456
      //数据库名称
      db  :      zipkin

注意:

  • 当前的springCloud版本: Greenwich.SR3
  • zipkin-autoconfigure-storage-mysql:当项目中引入了该依赖,并且配置了zipkin.storage.type=mysql,就会自动装配Zipkin相关组件;zipkin2.autoconfigure.storage.mysql.ZipkinMySQLStorageProperties通过 zipkin.storage.mysql前缀可以配置mysql的属性,默认的DB是zipkin,数据库是本地的

file

启动项目后,会在mysql数据库中创建三张表:zipkin_annotations、zipkin_spans、zipkin_dependencies保存相关的信息,当我们发起一次请求后,所有的信息都会记录在数据库中:file

通过以上的过程就可以持久化追踪信息到数据库了。

四、总结

 本章在上一章的基础之上,结合了Spring Cloud Sleuth和Zipkin,实现了分布式链路追踪解决方案,同时可以根据需求将信息保存在Mysql中,当然我们还可以保存在其他的存储系统中,如elasticsearch等,需要我们自己去定义。

----END----

 以就是本期的分享,你还可以关注公众号: 程序员笑笑生,关注更多精彩内容!

file

file

SpringCloud基础教程(一)-微服务与SpringCloud

SpringCloud基础教程(二)-服务发现 Eureka

SpringCloud基础教程(三)-Eureka进阶

SpringCloud 基础教程(四)-配置中心入门

SpringCloud基础教程(五)-配置中心热生效和高可用

SpringCloud 基础教程(六)-负载均衡Ribbon

SpringCloud 基础教程(七)-Feign声明式服务调用

SpringCloud 基础教程(八)-Hystrix熔断器(上)

SpringCloud 基础教程(九)-Hystrix服务监控(下)

SpringCloud 基础教程(十)-Zull服务网关

SpringCloud 基础教程(十一)- Sleuth 调用链追踪简介

SpringCloud 基础教程(十二)-Zipkin 分布式链路追踪系统搭建

更多精彩内容,请期待...

本文由博客一文多发平台 OpenWrite 发布!

我的博客地址兰陵笑笑生,欢迎浏览!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!