SpringCoul2.1.7+eureka+Sleuth+zipkin+rabbitMq+mysql链路追踪实现

前言

网上很多文章都提到过,springCloud2.X以后,官方不在推荐自己搭建Zipkin-server,确实是的。因为搭建过程太复杂,本身也不属于核心业务,没有太大必要,直接使用官方的zipkin-server的jar包,再简单配置一下客户端(采集端)即可以完美使用,这样才是正解。
但是本人最近项目比较闲,所以自己尝试玩玩吧,谁知已入红尘深似海啊,5天时间搭进去了···不过成就感还是有的,而且顺便练习了一下看源码。而且真的有体会的一件事是,还是官方文档和代码靠谱啊!

0.官方推荐用法

0.1Zipkin-server搭建

下载官方jar包

直接从maven下载

https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/ 

在这里插入图片描述
尽量下载最新版本。

运行jar包

在jar的所在目录下运行cmd(这里说的是windows环境下),敲入下面的启动命令
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=123456^&user=root^&charset=utf8mb4^&password=123456^&useSSL=false^&useUnicode=yes^&characterEncoding=UTF-8
# 也可以用下面这种方式,总之要指定启动时的参数,主要是rabbitmq和数据库的。
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql  --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 --zipkin.storage.mysql.password=123456 --zipkin.storage.mysql.username=root

程序启动系欸按如下:(我这里运行的是2.19.2版本)

在这里插入图片描述
在这里插入图片描述

备注:
执行命令启动(Linux):
java -jar zipkin-server-2.19.2-exec.jar --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=lbl0168\&user=root\&charset=utf8mb4\&password=lbl0168\&useSSL=false\&useUnicode=yes\&characterEncoding=UTF-8
执行命令启动(windows):
java -jar zipkin-server-2.19.2-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=lbl --zipkin.collector.rabbitmq.password=123456 --STORAGE_TYPE=mysql --MYSQL_JDBC_URL=jdbc:mariadb://127.0.0.1:3306/zipkin?pass=lbl0168^&user=root^&charset=utf8mb4^&password=lbl0168^&useSSL=false^&useUnicode=yes^&characterEncoding=UTF-8
需要注意的是:Linux下的shell和Windows的cmd所使用的URL拼接符是不同的,windows的是^ , linux的是\

启动成功后,访问http://127.0.0.1:9411/zipkin/

在这里插入图片描述

客户端部署和配置

这里就不再重复写客户端的部署和设置了,和下面写的自己搭建zipkin-server的方式下搭建客户端方面没有任何区别。参见下文3.zipkin-consumer的内容即可。


下面我们来自己尝试搭建zipkin-server服务端。作死开始····

1.eureka服务端

1.1pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

1.2application.yml

server:
  port: 6868
spring:
  application:
    name: eureka   # 服务名称
eureka:
  instance:
    hostname: localhost
  server:
    enableSelfPreservation: false # 关闭保护模式
  client:
    register-with-eureka: false # 不要注册自己到eureka服务中
    fetch-registry: false # 是否从eureka中获取信息
    service-url: # 配置注册中心访问地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

1.3启动引导类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

2.ZipnKin-Server配置

2.1pom.xml

    <dependencies>
        <!--eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-client</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <!-- zipkin 服务类-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.12.3</version>
            <!--排除日志,否则报错-->
            <exclusions>
                <exclusion>
                    <artifactId>log4j-slf4j-impl</artifactId>
                    <groupId>org.apache.logging.log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- zipkin 界面-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!-- zipkin 存储到数据库需要引入此类 -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!--保存到数据库需要如下依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--&lt;!&ndash;包含spring-cloud-starter-sleuth和spring-cloud-sleuth-zipkin两个依赖&ndash;&gt;-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <!--连接rabbitmq并配置-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
            <version>2.12.3</version>
        </dependency>
    </dependencies>

这里必须说一下,rabbitmq的依赖我测试了非常多,什么带stream的,binder的,统统不行,项目能启动,但是不见听队列,能看到数据被发送到了队列但是没有消费方,直到第5天,我看了源码,从collector的源码里拷贝了zipkin-autoconfigure-collector-rabbitmq,再加上yml的配置,一切都安静了。搞了我5天······原因都是没有消费方!自己写监听,是可以消费的,但就是不能自动创建监听消费队列里的数据。

2.2application.yml

zipkin:
  collector:
    rabbitmq:
      addresses: 127.0.0.1
#      username: guest
#      password: guest
#      concurrency: ${RABBIT_CONCURRENCY:1}
#      # TCP connection timeout in milliseconds
#      connection-timeout: ${RABBIT_CONNECTION_TIMEOUT:60000}
#      queue: ${RABBIT_QUEUE:zipkin}
#      virtual-host: ${RABBIT_VIRTUAL_HOST:/}
#      useSsl: ${RABBIT_USE_SSL:false}
#      uri: ${RABBIT_URI:}
  storage:
    type: mysql

MySQL
The MySQL v1 component uses MySQL 5.6+ features, but is tested against MariaDB 10.3.
意思是说,mysql版本5.6+以上。

下面的截图和说明都是自己5天时间里的尝试过程的总结,可以不用看。

zipkin-> collector->rabbitmq的设置是直接从源码的yml里拷贝的,因为有默认值所以不是所有的数据都要设置。下面来看源码:
在这里插入图片描述
autoconfigration的类依赖了zipkin-collector-rabbitmq是,我们去看这个工程的源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说实话没太仔细看源码,但是读出了一些信息:

  1. 我们引入的EnabledZipkinServer是属于zipkin2包下的,所以我们应该去找zipkin2的包中的源码,而不是去找zipkin包;
  2. 我们应该去找zipkin.storage.type这个配置,而且它默认的是mem存储;
    那我们就去找这个配置,肯定是去找yml配置文件了。

可以看到resources里面有两个yml,点看一看,管用的其实就只有一个,只是被另外一个引用。点进去看,我在这里直接涂有用的。
在这里插入图片描述

在这里插入图片描述
这样一看应该很清楚了,很多都已经设置了默认值,所以基本不用配置太多,但是我们要用到的addresses没有给定默认值。再往下看,下面的存储类型肯定是要改的。
在这里插入图片描述
而且改完之后,可以想到,后面肯定会进行各种数据库的设置。
在这里插入图片描述
但是,前面我们已经在spring->datasource节点下设置了数据源的配置,这怎么办呢?难道设置两遍?我自己测试的是,不需要按照源文件中的设置MySQL节点下的配置,直接配置datasource就可以。而且如果不配置datasource会报各种错。因为已经浪费了好几天就没再细测,反正只配置datasource是可用的**
在这里插入图片描述
所以最后的完整配置为:

server:
  port: 9411

spring:
  zipkin:
    enabled: true
    discovery-client-enabled: false  # 关闭本工程的推送到zipkin服务的功能

#  # 配置mysql
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/zipkin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
    continue-on-error: true
    ##数据库脚本创建地址,当有多个是可使用[x]表示集合第几个元素
    schema[0]: classpath:/mysql.sql

  sleuth:
    enabled: false # 不开启数据采集,服务端不需要开启,否则页面会发出请求造成数据干扰

## zipkin启动报错无法访问的解决方法
management:
  metrics:
    web:
      server:
        auto-time-requests: false

zipkin:
  collector:
    rabbitmq:
      addresses: 127.0.0.1
  storage:
    type: mysql

2.3启动引导类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import zipkin2.server.internal.EnableZipkinServer;
//import org.springframework.context.annotation.Bean;
//import zipkin2.storage.mysql.v1.MySQLStorage;
//import javax.sql.DataSource;

@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class QddFreightZipkinApplication {

    public static void main(String[] args) {
        SpringApplication.run(QddFreightZipkinApplication.class, args);
    }
}

3.zipkin-consumer

3.1pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qdd</groupId>
        <artifactId>qdd_freight_service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.qdd</groupId>
    <artifactId>qdd_freight_count</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>qdd_freight_count</name>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.qdd</groupId>
            <artifactId>qdd_freight_common_db</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 服务追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <!-- 使用消息的方式收集数据(使用rabbitmq) -->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
    </dependencies>
</project>

3.2application.yml

server:
  port: 8080 # 服务端口号
spring:
  application:
    name: freight-count # 服务名称

  datasource: # 配置数据源
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/atest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456

  zipkin:
    base-url: http://localhost:9411
    sender:
      type: rabbit #sleuth 使用 rabbitmq 来向 zipkin 发送数据
  #      type: web # 使用默认 http 方式收集 span 需要配置此项

  sleuth:
    sampler:
      probability: 1.0 # 配置采样率

  # mq配置
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
#    listener: # 这里配置了重试策略
#      direct:
#        retry:
#          enabled: true
#      simple:
#        retry:
#          enabled: true

# <!--构建springCloud微服务架构需放开注释-->
#  main:
#    allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册
#    redis: # 配置redis数据库链接信息
#      host: 127.0.0.1
#      port: 6379
#      password:
#      jedis: # 配置jedis连接池
#        pool:
#          max-active: 8 # 最大并发数
#          max-idle: 8 # 最大空闲数
#          min-idle: 0 # 最小空闲数
#    rabbitmq: # 消息中间件配置
#      host: 192.168.200.128
eureka: # 配置注册中心
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka/
  instance: # 优先使用ip
    prefer-ip-address: true
#feign:
#  hystrix:
#    enabled: false
#  client:
#    config:
#      default:   #配置全局的feign的调用超时时间  如果 有指定的服务配置 默认的配置不会生效
#        connectTimeout: 60000 # 指定的是 消费者 连接服务提供者的连接超时时间 是否能连接  单位是毫秒
#        readTimeout: 20000  # 指定的是调用服务提供者的 服务 的超时时间()  单位是毫秒
##hystrix 配置
#hystrix:
#  command:
#    default:
#      execution:
#        timeout:
#          #如果enabled设置为false,则请求超时交给ribbon控制
#          enabled: true
#        isolation:
#          strategy: SEMAPHORE
#          thread:
#            # 熔断器超时时间,默认:1000/毫秒
#            timeoutInMilliseconds: 100000

有些配置被注释掉了,都是可以用的,懒得改了。

3.3启动引导类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@MapperScan(basePackages = {"com.qdd.mapper"})
@EnableEurekaClient
//@EnableFeignClients(basePackages = {"com.smartcomm.goods.feign", "com.smartcomm.pay.feign"})
public class FrieghtCountSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(FrieghtCountSystemApplication.class, args);
    }
}

4.发起请求

在这里插入图片描述
请求成功后,查看zipkin的界面。
在这里插入图片描述
点进去看看细节:
在这里插入图片描述
用新版的LenUI查看也是可以的,好像显示的也更清晰。不过不影响咱们使用,个人习惯吧,我也没仔细琢磨过新的界面的用法。
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值