Spring Cloud实战系列(七) – 服务链路追踪Spring Cloud Sleuth

Spring Cloud Sleuth 的主要功能就是为 分布式系统 提供 追踪解决方案 ,并且兼容支持了 Zipkin ,只需要在 pom.xml 文件中引入相应的 依赖 即可。本文主要讲述 服务追踪组件 ZipkinSpring Cloud Sleuth 集成了 Zipkin 组件。它主要用于 聚集 来自各个 异构系统实时监控数据 ,用来追踪 微服务架构 下的 系统延时问题

正文

1. 相关术语

1.1. Span

Span 是一个基本的 工作单元 ,用于描述一次 RPC 调用, Span 通过一个 64 位的 spanId 作为 唯一标识Zipkin 中的 Span 还有其他数据信息,比如 摘要时间戳事件关键值注释 ( tags ) 以及 进度 ID (通常是 IP 地址)。 Span 在不断的启动和停止,同时记录了 时间信息 ,一个 Span 创建后,必须在未来的某个时刻停止它。

1.2. Trace

一系列 Span 组成的一个 树状结构 。例如,如果你正在跑一个大型 分布式系统 ,可能需要创建一个 Trace

1.3. Annotation

表示 基本标注列表 ,一个 Annotation 可以理解成 Span 生命周期中 重要时刻数据快照 ,比如一个 Annotation 中一般包含 发生时刻timestamp )、 事件类型value )、 端点endpoint )等信息。其中 Annotation事件类型 包含以下四类:

  • cs – Client Sent

客户端发起一个请求,这个 Annotion 描述了这个 Span 的开始。

  • sr – Server Received

服务端获得请求并 准备开始 处理它,如果将 sr 减去 cs时间戳 便可得到 网络延迟

  • ss – Server Sent

服务端完成请求处理,如果将 ss 减去 sr时间戳 ,便可得到 服务端 处理请求消耗的时间。

  • cr – Client Received

客户端成功接收到 服务端 的响应,如果将 cr 减去 cs时间戳 ,便可得到 整个请求 所消耗的 总时间

2. 项目结构

文案例主要由 四个模块 组成:

  • eureka-server:作为 服务注册中心

  • zipkin-server:作为 链路追踪服务中心 ,负责存储 链路数据

  • service-hi:对外暴露一个 测试接口 ,同时作为 链路追踪服务端 ,负责 产生链路数据

  • service-zuul:作为 路由网关 ,负责 请求转发 ,同时作为 链路追踪客户端 ,产生 链路数据 ,并上传至 zipkin-server

8761 端口 开启 eureka-server 服务注册中心 ,参考前面的文章即可,这里不再演示创建。

3. 构建zipkin-server

新建一个 Spring Boot 应用模块 zipkin-server ,它的 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>io.github.ostenant.springcloud</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>zipkin-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
    </properties>

    <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>
复制代码

在应用的入口类上, 加上注解 @EnableZipkinServer ,开启 Zipkin Server 的功能。

@EnableZipkinServer
@EnableEurekaClient
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}
复制代码

配置文件 application.yml 中指定服务端口号为 9411