微信登录

分布式链路追踪 - Zipkin - 追踪服务调用

分布式链路追踪 - Zipkin - 追踪服务调用

一、引言

在分布式系统中,一个请求往往会经过多个服务的处理。当系统出现问题时,定位问题变得十分困难,因为很难知道请求在各个服务之间的调用路径、每个服务的执行时间等信息。分布式链路追踪系统应运而生,Zipkin 就是其中一个非常流行的开源分布式链路追踪系统,它可以帮助我们收集、分析和可视化请求在分布式系统中的调用链路信息。

二、Zipkin 简介

Zipkin 是 Twitter 开源的分布式链路追踪系统,基于 Google Dapper 论文设计而来。它通过收集和分析服务之间的调用信息,为开发者提供了请求的调用路径、每个服务的执行时间、调用依赖关系等详细信息,帮助开发者快速定位和解决分布式系统中的性能问题和故障。

Zipkin 的核心概念

  • Span:表示一个基本的工作单元,代表请求在某个服务中的一次调用。每个 Span 包含一个唯一的 ID、开始时间、结束时间、服务名等信息。
  • Trace:由多个 Span 组成,代表一个完整的请求调用链路。Trace 有一个全局唯一的 ID,所有属于同一个请求的 Span 都有相同的 Trace ID。
  • Annotation:用于记录 Span 中的特定事件,如请求的开始、结束、异常等。

三、搭建 Zipkin 服务端

1. 下载 Zipkin Server

可以从 Zipkin 的官方 GitHub 仓库(https://github.com/openzipkin/zipkin/releases)下载最新的 zipkin.jar 文件。

2. 启动 Zipkin Server

在命令行中运行以下命令启动 Zipkin Server:

  1. java -jar zipkin.jar

启动成功后,访问 http://localhost:9411 可以看到 Zipkin 的管理界面。

四、在 Spring Boot 项目中集成 Zipkin

1. 创建 Spring Boot 项目

使用 Spring Initializr(https://start.spring.io/)创建两个简单的 Spring Boot 项目,分别命名为 service-aservice-b

2. 添加依赖

service-aservice-bpom.xml 文件中添加以下依赖:

  1. <dependencies>
  2. <!-- Spring Web -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- Spring Cloud Sleuth -->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-sleuth-zipkin</artifactId>
  11. </dependency>
  12. </dependencies>

3. 配置应用

service-aservice-bapplication.properties 文件中添加以下配置:

  1. spring.application.name=service-a # service-b 中改为 service-b
  2. spring.zipkin.base-url=http://localhost:9411
  3. spring.sleuth.sampler.probability=1.0

spring.sleuth.sampler.probability=1.0 表示采样率为 100%,即所有请求都会被追踪。

4. 编写代码

service-a 代码

  1. package com.example.servicea;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. @SpringBootApplication
  9. @RestController
  10. public class ServiceAApplication {
  11. @Autowired
  12. private RestTemplate restTemplate;
  13. public static void main(String[] args) {
  14. SpringApplication.run(ServiceAApplication.class, args);
  15. }
  16. @GetMapping("/call-service-b")
  17. public String callServiceB() {
  18. String response = restTemplate.getForObject("http://localhost:8081/hello", String.class);
  19. return "Service A called Service B. Response: " + response;
  20. }
  21. }

service-b 代码

  1. package com.example.serviceb;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @SpringBootApplication
  7. @RestController
  8. public class ServiceBApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(ServiceBApplication.class, args);
  11. }
  12. @GetMapping("/hello")
  13. public String hello() {
  14. return "Hello from Service B!";
  15. }
  16. }

5. 启动应用

分别启动 service-a(端口 8080)和 service-b(端口 8081)。

6. 测试调用

访问 http://localhost:8080/call-service-b,此时 service-a 会调用 service-b/hello 接口。

7. 查看链路信息

访问 http://localhost:9411,在 Zipkin 的管理界面中可以看到刚刚的请求调用链路信息。点击具体的 Trace ID 可以查看详细的 Span 信息,包括每个服务的执行时间、调用顺序等。

五、总结

表格总结

概念 描述
Span 基本工作单元,代表请求在某个服务中的一次调用
Trace 由多个 Span 组成,代表一个完整的请求调用链路
Annotation 用于记录 Span 中的特定事件

通过集成 Zipkin,我们可以方便地追踪分布式系统中请求的调用链路,快速定位和解决性能问题和故障。Spring Cloud Sleuth 提供了简单易用的 API,帮助我们在 Spring Boot 项目中轻松集成 Zipkin。在实际开发中,我们可以根据需要调整采样率,以平衡追踪信息的收集和系统性能的影响。

希望本文能帮助你理解和使用 Zipkin 进行分布式链路追踪。如果你在使用过程中遇到任何问题,欢迎查阅相关文档或社区论坛寻求帮助。