SpringCloud项目(八)Sleuth服务链路追踪

作者:陆金龙    发表时间:2019-08-02 11:39   

关键词:spring.sleuth.sampler.percentage  spring.zipkin.enabled= true  Sleuth延时  

3.8 Sleuth服务链路追踪

3.8.1 创建项目,配置pom.xml

创建maven module项目klblog-sleuth,配置pom.xml

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

<groupId>io.zipkin.java</groupId>

<artifactId>zipkin-server</artifactId>

</dependency>

<dependency>

<groupId>io.zipkin.java</groupId>

<artifactId>zipkin-autoconfigure-ui</artifactId>

</dependency>

</dependencies>

3.8.2 配置application.yml

server:

 port: 9000

 

spring:

 application:

  name: sleuth-zipkin-server

  

eureka:

 client:

  serviceUrl:

   defaultZone: http://localhost:8051/eureka/,http://localhost:8052/eureka/

3.8.3 主启动类

@SpringBootApplication

@EnableEurekaClient

@EnableZipkinServer

public class SleuthMainApplication {

public static void main(String[] args) {

SpringApplication.run(SleuthMainApplication.class,args);

}

}

3.8.4 微服务添加zipkin支持

在klblog-zuul-gateway、klblog-consumer、klblog-providerd三个项目添加zipkin支持

1.pom.xml添加maven依赖项

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-zipkin</artifactId>

</dependency>

2.application.yml添加配置

spring:

   application:

    name: xxxxxx # 项目的服务名

   zipkin:

    enabled: true 

base-url: http://localhost:9000

   sleuth:

    sampler:

      probability: 1.0

percentage: 1

 

问题1:时间条件过滤没起作用,显示了全部结果。

发现是开始时间和结束时间值完全相同,就显示全部结果。比如开始时间到结束时间跨度1分钟则能查询最新记录。

要查询刚刚的记录,则End Time的值通常需要比实际时间大1分钟才能查到,可能是时间的秒被置0了。

注意以上两个问题后,时间条件的过滤作用是生效的,只是仍然有延时或者丢失的问题。

问题2:最新时间的请求没有查到结果

加了spring.zipkin.enabled= true,最新结果能查到,但延时和丢失情况比较严重。

3.8.5 收集及时性与性能影响

有时刷新几次不能看到任何数据,原因是spring-cloud-sleuth收集信息是有一定的比率的,默认的采样率spring.sleuth.sampler.percentage是 0.1。如果我们调大此值为1,信息收集就更及时。

但是当这样调整后,会发现rest接口调用速度比0.1的情况下慢了很多,即使在0.1的采样率下,多次刷新consumer的接口,会发现对同一个请求两次耗时信息相差非常大,如果取消spring-cloud-sleuth后我们再测试,会发现并没有这种情况,这种方式追踪服务调用链路会给我们业务程序性能带来一定的影响。

 

这种方式的几种缺陷:
缺陷1:zipkin客户端向zipkin-server程序发送数据使用的是http的方式通信,每次发送的时候涉及到连接和发送过程。
缺陷2:当我们的zipkin-server程序关闭或者重启过程中,因为客户端收集信息的发送采用http的方式会被丢失。

针对以上两个明显的缺陷,改进的办法是:
1、通信采用socket或者其他效率更高的通信方式。
2、客户端数据的发送尽量减少业务线程的时间消耗,采用异步等方式发送收集信息。
3、客户端与zipkin-server之间增加缓存类的中间件,例如redis、MQ等,在zipkin-server程序挂掉或重启过程中,客户端依旧可以正常的发送自己收集的信息。

 

从spring boot 2.0开始官方就官方不再支持使用自建Zipkin Server的方式进行服务链路追踪,而是直接提供了编译好的 jar 包来给我们使用。

但是从1.0时代的配置中应该是可以看出问题,在1.0的Zipkin Service中需要加入sleuth和rabbit的依赖,同时需要配置rabbitMQ消息的地址,但是使用jar包直接启动,并没有指定rabbit的地址。以下文章中提供了解决方案:

https://blog.csdn.net/chenfengdejuanlian/article/details/86506715