SpringCloud项目(八)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