美文网首页微服务+授权认证Spring Cloud
spring-cloud-sleuth+zipkin追踪服务实现

spring-cloud-sleuth+zipkin追踪服务实现

作者: shunyang | 来源:发表于2017-06-13 20:40 被阅读2454次

    1. 简述

    在上一节《spring-cloud-sleuth+zipkin追踪服务实现(一)》中,我们使用microservice-zipkin-server、microservice-zipkin-client、microservice-zipkin-client-backend 三个程序实现了使用http方式进行通信,数据持久化到内存中的服务调用链路追踪实现。
    在这里我们做两点改动,首先是数据从保存在内存中改为持久化到数据库,其次是将http通信改为mq异步方式通信。

    我们还是使用之前上一节中的三个程序做修改,方便大家看到对比不同点。这里每个项目名都加了一个stream,用来表示区别。

    2、microservice-zipkin-stream-server

    要将http方式改为通过MQ通信,我们要将依赖的原来依赖的io.zipkin.java:zipkin-server换成spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
    同时要使用mysql持久化,我们需要添加mysql相关依赖。
    全部maven依赖如下:

    ```
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--zipkin依赖-->
        <!--此依赖会自动引入spring-cloud-sleuth-stream并且引入zipkin的依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <scope>runtime</scope>
        </dependency>
    
        <!--保存到数据库需要如下依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
     
    ```
    

    添加以上maven依赖后,我们将启动类ZipkinServer中@EnableZipkinServer注解替换成@EnableZipkinStreamServer,
    具体如下:

    package com.yangyang.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer;
    
    /**
     * Created by chenshunyang on 2017/5/24.
     */
    @EnableZipkinStreamServer// //使用Stream方式启动ZipkinServer
    @SpringBootApplication
    public class ZipkinStreamServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ZipkinStreamServerApplication.class,args);
        }
    }
    
    
    

    点击@EnableZipkinStreamServer注解的源码我们可以看到它也引入了@EnableZipkinServer注解,同时还创建了一个rabbit-mq的消息队列监听器。

    image.png

    以方便接收从消息客户端收集发过来的mq消息。

    由于使用了消息中间件rabbit mq以及mysql,所以我们还需要在配置文件application.properties加入相关的配置:

     server.port=11020
    spring.application.name=microservice-zipkin-stream-server
    #zipkin数据保存到数据库中需要进行如下配置
    #表示当前程序不使用sleuth
    spring.sleuth.enabled=false
    #表示zipkin数据存储方式是mysql
    zipkin.storage.type=mysql
    #数据库脚本创建地址,当有多个是可使用[x]表示集合第几个元素
    spring.datasource.schema[0]=classpath:/zipkin.sql
    #spring boot数据源配置
    spring.datasource.url=jdbc:mysql://localhost:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.initialize=true
    spring.datasource.continue-on-error=true
    
    
    #rabbitmq配置
    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
    
    
    

    其中zipkin.sql直接到官网去拷贝,也可以从本demo中拷贝
    为了避免http通信的干扰,我们将原来的监听端口有11008更改为11020,启动程序,未报错且能够看到rabbit连接日志,说明程序启动成功。

    3.microservice-zipkin-stream-client、microservice-zipkin-client-stream-backend

    与上一节中的配置一样,客户端的配置也非常简单,maven依赖只需要将原来的spring-cloud-starter-zipkin替换为如下两个依赖即可

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

    此外,在配置文件中也加上连接MQ的配置

    server:
      port: 11021
    
    spring:
      application:
        name: microservice-zipkin-stream-client
    
     #rabbitmq配置
      rabbitmq:
        host: 127.0.0.1
        port : 5672
        username: guest
        password: guest
    
    

    当然为了以示区别,端口也做了相应的调整

    4.测试

    按照上一节的方式访问:http://localhost:11021/call/1,我们可以上一节,说明rabbit-mq方式通信的sleuth功能已经生效了。

    我们多次访问consumer的地址可以看到日志中,请求的耗时时间不会再次出现突然耗时特长的情况。
    为了体验MQ通信给我们带来的数据不丢失的特点,我们将数据库中的数据清空,然后刷新zipkin server的界面,可以看到不再有数据

    然后我们将zipkin-server程序想关闭,然后再多次访问consumer的地址,之后,我们重启zipkin server程序,启动成功后访问UI界面
    很快看到Span Name选项有数据可以选择了,同时数据库中的记录条数也不再是之前的0条了

    如此说明我们的zipkin重启后,从MQ中成功获取出了在关闭这段时间里provider和consumer产生的信息数据。这样我们使用spring-cloud-sleuth-stream+zipkin方式的rest服务调用追踪功能就OK了。

    5.项目源码:

    https://git.oschina.net/shunyang/spring-cloud-microservice-study.git
    https://github.com/shunyang/spring-cloud-microservice-study.git

    6.参考文档:

    spring cloud 官方文档:https://github.com/spring-cloud/spring-cloud-sleuth

    第三方:https://yq.aliyun.com/articles/78128?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&201758&utm_content=m_19862

    欢迎大家扫码关注我的微信公众号,与大家一起分享技术与成长中的故事。


    我的微信公众号.jpg

    相关文章

      网友评论

      • skillyZ:我是直接下载github项目的 也出现这个错误了
        Parameter 0 of constructor in zipkin.server.ZipkinQueryApiV1 required a bean of type 'zipkin.storage.StorageComponent' that could not be found.
        - Bean method 'storage' not loaded because @ConditionalOnProperty (zipkin.storage.type=mem) found different value in property 'zipkin.storage.type'

        看了下源码之前版本只支持mem 不支持其他存储
        shunyang:@skillyZ 需要下载一个jar,参考后面的文章
      • cf4b07bc8fe2:请问一下,zipkin-server启动的时候就报这个错是什么原因?
        Parameter 0 of constructor in zipkin.server.ZipkinQueryApiV1 required a bean of type 'zipkin.storage.StorageComponent' that could not be found.
        - Bean method 'storage' not loaded because @ConditionalOnProperty (zipkin.storage.type=mem) found different value in property 'zipkin.storage.type'


        Action:

        Consider revisiting the conditions above or defining a bean of type 'zipkin.storage.StorageComponent' in your configuration.

        我的zipkin-server的版本号和zipkin-storage-mysql的版本号一致的
        shunyang:你的配置文件跟pom分别分别发来看看
      • 6dd8f0a35472:通过您提供的配置,完全玩不转zipkin, mq在没有数据挤压的情况下,zipkin数据表中,依然没有数据,个人不太喜欢,将一个帖子从一个平台原封不动的搬到另一个平台,帖子不在多,而在于精,如果真的无心教大家,就请别扰乱互联网的这个信息交流平台
        b486a9f7ffb7:@吸烟两包半 在客户端的配置文件里面加这个
        spring.sleuth.sampler.percentage=1(采样的比率不写的话 默认是0.1)
        6dd8f0a35472:@shunyang 你确定你的demo可以正确运行,能够监控到所有的请求
        shunyang:那是你自己的问题吧,我的demo是经过测试的
      • b486a9f7ffb7:@shunyang 依赖了这个<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
        </dependency>
        之后,发现服务的controller类没有被spring boot注入。只有与启动类在同一个package下的类会被注入。作者有什么好的解决方法吗?
        b486a9f7ffb7:@shunyang 消息是发了的我在rabbitmq后台看到了
        b486a9f7ffb7:@shunyang 看了的,启动不报错的,就是直接调controller就会404
        shunyang:你有看我的demo吗
      • b486a9f7ffb7:@EnableZipkinStreamServer服务端没有问题,但是客户端在配了mq和依赖后,直接导致404无法访问
        b486a9f7ffb7:客户端的一个配置
        spring.application.name=agent-srv
        spring.cloud.config.profile=local
        spring.cloud.config.uri=http://192.168.1.26:8080

        spring.datasource.druid.stat.filter.mergeSql=true

        spring.rabbitmq.host=127.0.0.1
        spring.rabbitmq.port=5672
        spring.rabbitmq.username=guest
        spring.rabbitmq.password=guest
        客户端pom.xml
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

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

        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
        b486a9f7ffb7:服务端的配置
        server.port=11020
        spring.application.name=microservice-zipkin-stream-server
        spring.sleuth.enabled=false

        #mysql
        zipkin.storage.type=mysql
        spring.datasource.schema[0]=classpath:/zipkin.sql
        spring.datasource.url=jdbc:mysql://192.168.1.22:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
        spring.datasource.username=root
        spring.datasource.password=1qazXSW@
        spring.datasource.driver-class-name=com.mysql.jdbc.Driver
        spring.datasource.initialize=true
        spring.datasource.continue-on-error=true


        #rabbitmq
        spring.rabbitmq.host=localhost
        spring.rabbitmq.port=5672
        spring.rabbitmq.username=guest
        spring.rabbitmq.password=guest
        shunyang:@Vincent_c039 能将配置发看一下么
      • ys简单0:请问下一下,为什么使用spring-cloud-sleuth,Zipkin的可视化界面的servicename那边是空的,有的时候可以看到监听的那几个服务
        shunyang:@ys简单0 哪个地方是空的?需要刷新吧

      本文标题:spring-cloud-sleuth+zipkin追踪服务实现

      本文链接:https://www.haomeiwen.com/subject/cidjqxtx.html