分布式服务跟踪之Spring Cloud Sleuth快速入门

背景

随着业务的发展,系统规模也会变得越来越大,微服务之前的关系也会变得越来越复杂,客户端发起请求后通过一些列的微服务返回的结果,则会形成一个复杂的链路,在每个链路中如果有一个以来服务出现延迟或错误都会引发请求最后的失败,这时候对于整个链路的跟踪极为重要,通过实现队请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等。
接下来我们要使用Spring Cloud Sleuth与Zipkin进行整合。

Spring Cloud Sleuth使用。

  1. 需要准备两个服务,service1与service2,service1调用service2的方法。
  2. 添加依赖项spring-cloud-starter-sleuth。
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>

spring-cloud-starter-sleuth它会自动为当前应用构建起各通信通道跟踪机制。比如:

  • 通过诸如RabbitMQ、Kafaka(或者其他任何Spring Cloud Stream绑定器实现的消息中间件)传递的请求。
  • 通过Zuul代理传递的请求。
  • 通过RestTemplate发起的请求。

通过上面的配置即可对链路数据的监控,当我们访问service1和service2接口时会在控制台中输出相应的信息,例如:

INFO [servce1,f410a57afd5c145,a9f2118fa201984,false]25028—call servce1
INFO [servce1,f410a57afd5c145,e9a377dc2268bc29,false]25028—call servce2

中括号中的元素是实现分布式服务跟踪的重要组成部分,主要是:
第一个值:service1代表的是应用的名称,也就是spring.application.name参数属性值。
第二个值:Spring Cloud Sleuth生成的一个ID,称之为Trace ID,它用来标识是一条链路。一个请求链路中包含一个Trace ID,多个Span ID。
第三个值:也是Spring Cloud Sleuth生成的一个ID,代表的是Span ID,他表示一个基本的工作单位,比如发送一个Http请求。
也就是说同一个TranceID代表是一条链路,而不同的SpanID代表不同的Http请求和业务访问操作。

整合Zipkin

  1. 添加依赖项
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
    </dependency>
    <dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
    </dependency>

其中包括:spring-cloud-sleuth-zipkin-stream、spring-cloud-stream-binder-rabbit表示使用RabbitMQ的方式对链路进行传递请求。
zipkin-autoconfigure-ui依赖是通过页面的展示链路的情况。
客户端中需要添加对RabbitMQ注解的支持,主要是spring-cloud-stream-binder-rabbit或者spring-cloud-starter-stream-rabbit,我可以清晰的发现前后两者内容其实是一样后者内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit-parent</artifactId>
<version>1.2.1.RELEASE</version>
</parent>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<description>Spring Cloud Starter Stream Rabbit</description>
<url>http://projects.spring.io/spring-cloud</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
 <dependencies>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
</dependencies>
</project>

  1. 在Spring Boot主类上添加@EnableZipkinStreamServer注解开启Zipkin功能。

    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableZipkinStreamServer
    public class SpringCloudSluethZipkinApplication {
    public static void main(String[] args) {
    SpringApplication.run(SpringCloudSluethZipkinApplication.class, args);
    }
    }
  2. 修改配置信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    spring:
    application:
    name: springcloudsluethzipkin
    rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    server:
    port: 9411
    security:
    user:
    name: admin
    password: ${ZIPKIN_SERVER_PASSWORD:admin}

通过RabbitMQ对消息进行传递,将链路信息传递给RabbitMQ,Zipkin对消息队列消息进行收集分析得出实际的访问链路。

文章目录
  1. 1. 背景
  2. 2. Spring Cloud Sleuth使用。
  3. 3. 整合Zipkin