# sleuth

back:springCLoud

随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药。

spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。

# 依赖

<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 启动类

@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class ZipkinApplication {

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

}
1
2
3
4
5
6
7
8
9
10

使用了@EnableZipkinServer注解,启用Zipkin服务。

eureka:
 client:
 serviceUrl:
 defaultZone: http://localhost:8761/eureka/
server:
 port: 9000
spring:
 application:
 name: zipkin-server
1
2
3
4
5
6
7
8
9

配置完成后依次启动示例项目:spring-cloud-eureka、zipkin-server项目。刚问地址:http://localhost:9000/zipkin/可以看到Zipkin后台页面

# 项目添加zipkin支持

在项目spring-cloud-producer和spring-cloud-zuul中添加zipkin的支持。

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
1
2
3
4

Spring应用在监测到Java依赖包中有sleuth和zipkin后,会自动在RestTemplate的调用过程中向HTTP请求注入追踪信息,并向Zipkin Server发送这些信息。

同时配置文件中添加如下代码:

spring:
 zipkin:
 base-url: http://localhost:9000
 sleuth:
 sampler:
 percentage: 1.0
1
2
3
4
5
6

spring.zipkin.base-url指定了Zipkin服务器的地址,spring.sleuth.sampler.percentage将采样比例设置为1.0,也就是全部都需要。

# 进行验证

这样我们就模拟了这样一个场景,通过外部请求访问Zuul网关,Zuul网关去调用spring-cloud-producer对外提供的服务。

四个项目均启动后,在浏览器中访问地址:http://localhost:8888/producer/hello?name=neo 两次,然后再打开地址: http://localhost:9000/zipkin/点击对应按钮进行查看。

点击记录进去页面,可以看到每一个服务所耗费的时间和顺序