基于sleuth和zipkin的Spring-Cloud链路跟踪
Sleuth
-
sleuth
借鉴了google dapper
的思路,所以sleuth
的原理和dapper
几乎一样。 -
google dapper
原文档:Dapper, a Large-Scale Distributed Systems Tracing Infrastructure,需科学上网。 -
google dapper
文档翻译:Dapper,大规模分布式系统的跟踪系统。 -
sleuth
在spring cloud
中体现为Spring Cloud Sleuth(spring-cloud-starter-sleuth
)。 -
sleuth
会默认收集很多组件的Span
信息,可以在这里 Integrations 查看有哪些组件的Span
信息会被采集,当然可以在配置里关闭。 -
如果想要自定义
Span
,比如想把一个完全不在默认集成列表里的组件添加到监控中,可以看这里 Managing Spans with Annotations 自定义Span
。
Zipkin
-
zipkin
同样是基于google dapper paper
实现的,也是一个分布式链路跟踪系统。 -
zipkin
可以分析Sleuth
收集的Span
信息,做一个链路、错误和依赖关系的可视化。 -
除了
zipkin
以外,还可以自己通过其他日志采集和分析系统自定义处理方式,比如logback+Logstash+Kibana
。
slueth
默认通过HTTP
将Span
信息发送到zipkin
,可以依赖Kafka
、rabbitMQ
等消息中间件自动化配置,达到通过消息中间件发送到zipkin
的目的,以减少链路跟踪系统对业务服务的压力。
sleuth
默认配置中,一个Span
被发送到Zipkin
的几率只有10%(0.1),这个配置可以修改。
Zipkin-Server
跟eureka-server
类似,每个客户端服务必须把自己的Span
信息主动发送到Zipkin
,因此第一步先搭建一个zipkin-server
提供给希望被采集Span
的服务使用。
-
pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.enmo.dbaas</groupId> <artifactId>dbaas-zipkin-server</artifactId> <version>1.0-SNAPSHOT</version> <name>dbaas-zipkin-server</name> <url>http://www.example.com</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring-cloud.version>Dalston.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
application.properties
:server.port=9411 spring.application.name=dbaas-zipkin-server eureka.client.service-url.defaultZone=http://192.168.20.61:8761/eureka/ eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} eureka.instance.prefer-ip-address=true # zipkin 本身并不发送span spring.zipkin.enabled=false
-
ZipkinServerApplication.java
@SpringBootApplication @EnableEurekaClient @EnableZipkinServer public class ZipkinServerApplication { public static void main(String[] args) { SpringApplication.run(ZipkinServerApplication.class, args); } }
配置完毕后即可启动zipkin-server。
Zipkin-Client
和eureka-client
类似,希望发送span
到zipkin
的各个业务服务需要引用sleuth收集span
信息,引用zipkin自动配置默认通过HTTP
方式,才可以将span
信息发送到zipkin-server
。
pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
application.properties
:# zipkin # 打开zipkin discovery spring.zipkin.locator.discovery.enabled=true # 指定zipkin-server 地址 spring.zipkin.baseUrl=http://192.168.20.62:9411/ # 指定span采集概率 spring.sleuth.sampler.percentage=1.0 # 指定不采集的路径正则 #spring.sleuth.web.skipPattern=(^cleanup.*)
所有服务配置完毕并成功启动就会自动加入zipkin链路跟踪。
Zipkin-Ui
打开zipkin-server
的web页面(192.168.20.62:9411):
页面上的筛选和排序点点就会了,哪个Annotation Query可以点击某一个trace后再点击一个span查看有哪些元数据,然后根据这些元数据查询:
依赖关系非常清楚: