Spring-Sleuth-Zipkin

一、简介

在微服务架构中,几乎每一个前端的请求都会经过多个服务单元来协调提供服务,从而形成复杂的调用链路。此时如果服务发生问题,我们就很难知道其具体发生在哪一个环节,想要解决这个问题,可以使用链路追踪技术。Zipkin 是一个开源的分布式跟踪系统,Spring 支持使用 Spring Cloud Sleuth 来轻松地集成 Zipkin。

二、项目结构

这里的项目是在之前的 Spring-Cloud-Zuul 上进行集成,该项目产品接口的调用链路为: 网关 -> consumer -> producer ,整个过程历经三个环节的调用,因此可以直观展示 Zipkin 链路追踪的效果。

  • common :公共的接口和实体类;
  • consumer :服务的消费者,采用 Feign 调用产品服务;
  • producer :服务的提供者;
  • eureka :注册中心;
  • zuul : API 网关。

三、Zipkin 服务端

zipkin 服务端可以不用自己构建,直接从 官网 上下载对应的 JAR 包即可,启动命令如下。默认端口为 9411:

java -jar zipkin.jar

也可以直接从 Docker 仓库拉取镜像,然后进行启动:

docker run -d -p 9411:9411 openzipkin/zipkin

四、Zipkin 的集成

这里我们对 zuul、consumer、producer 三个模块都进行集成:

4.1 添加依赖

对三个模块 (zuul、consumer、producer ) 添加 Zipkin 依赖:

<!--zipkin-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

4.2 连接到服务端

分别在三个模块的 application.yml 配置文件中指定 zipkin 的服务地址 :

spring:
  zipkin:
    base-url: http://localhost:9411/
  # 可以指定监控数据的采样率
  sleuth:
    sampler:
      probability: 1

五、启动项目

分别启动 eureka,zuul,consumer,producer 四个项目,访问 http://localhost:9411/ ,查看我们的服务调用链路:

点击链路,即可以查看具体的调用情况:

展示信息说明:

  • Span :基本工作单元,发送一个远程调度任务就会产生一个 Span。
  • Trace :由一系列 Span 组成的,呈树状结构。 所有由这个请求产生的 Span 组成了对应的 Trace 。
  • SpanId :工作单元 ( Span ) 的唯一标识。
  • TraceId :一条请求链路 ( Trace ) 的唯一标识。

除了 TraceID 外,还需要 SpanID 用于记录调用的父子关系。每个服务会记录下 parent id 和 span id,通过他们可以组成一条完整调用链,可以对比链表的实现原理来理解。