随着微服务架构的流行,应用程序被分解为多个独立的服务组件,系统的复杂度也随之增加。在这种情况下,传统的日志和监控手段很难全面追踪服务之间的调用情况。特别是在排查系统瓶颈或处理性能问题时,缺乏全局的调用链路追踪工具会极大地影响问题定位和解决效率。
Zipkin 作为一款强大的分布式追踪系统,专注于解决微服务架构下的性能监控和故障追踪问题。它通过记录每个服务的调用细节,并将这些数据可视化,使开发者能够清楚地了解服务调用的顺序、耗时和错误原因,从而快速定位性能瓶颈或故障点。
运行效果:
图片
若想获取项目完整代码以及其他文章的项目源码,且在代码编写时遇到问题需要咨询交流,欢迎加入下方的知识星球。
本文将深入讲解如何在 Spring Boot 3.3 中集成 Zipkin 来监控 RESTful API 的性能表现。我们将从 Zipkin 的基本概念出发,介绍它的安装与配置,并通过前后端代码示例演示如何实现对 API 调用链路的追踪和性能监控。
Zipkin 介绍
什么是 Zipkin?
Zipkin 是一款分布式追踪系统,最初由 Twitter 开发,专门用于帮助工程师分析和监控微服务架构下服务的通信。它能记录跨越多个服务之间的调用链路,并且详细地展示调用的耗时和路径。Zipkin 的核心功能包括:
- 追踪请求路径:记录请求在不同服务之间的传递情况。
- 分析请求耗时:展示每个请求在各个服务节点的耗时,便于找到性能瓶颈。
- 异常定位:能够快速定位系统中的错误请求,便于开发者快速修复问题。
Zipkin 的工作原理
Zipkin 使用 Span 和 Trace 作为核心概念。每一个 Span 表示一个工作单元,例如一次服务调用或数据库查询。Trace 则是一组相关的 Span,它们表示某个请求从开始到结束的整个链路。Zipkin 会通过 Zipkin Server 收集并存储这些 Span,然后在 Web UI 中可视化展示出来,帮助开发者分析性能数据。
Zipkin 的安装与配置
运行 Zipkin 服务器
Zipkin 可以通过 Docker 运行,也可以直接下载可执行的 .jar 文件来启动。以下是通过 Docker 安装 Zipkin 的步骤:
docker run -d -p 9411:9411 openzipkin/zipkin
该命令会在 9411 端口启动 Zipkin 服务,你可以通过浏览器访问 http://localhost:9411 来查看 Zipkin 的 Web UI。
集成 Zipkin 到 Spring Boot
通过 Spring Cloud Sleuth,可以轻松将 Zipkin 集成到 Spring Boot 应用中。下面的 pom.xml 配置展示了如何添加 Zipkin 相关依赖。
项目依赖配置 (pom.xml)
<?xml versinotallow="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 https://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>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.icoderoad</groupId>
<artifactId>zipkin-restful</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zipkin-restful</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Zipkin -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
应用配置 (application.yml)
Zipkin 的服务地址和采样率等相关配置可以通过 application.yml 文件进行设置。
server:
port: 8080
spring:
application:
name: zipkin-monitoring-demo
zipkin:
base-url: http://localhost:9411 # Zipkin 服务器地址
sleuth:
sampler:
probability: 1.0 # 采样率设置为 1.0 表示采集所有请求
logging:
level:
org.springframework.web: DEBUG
读取配置类(@ConfigurationProperties 配置)
为了更好地管理配置项,我们可以通过 @ConfigurationProperties 注解结合 Lombok 来简化代码。以下是自定义 Zipkin 配置类:
package com.icoderoad.zipkin.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
@Data
@Component
@ConfigurationProperties(prefix = "spring.zipkin")
public class ZipkinProperties {
private String baseUrl;
private Double samplerProbability;
}
修改 RESTful API 示例
为了更好地展示 Zipkin 的追踪功能,我们将创建一个返回 JSON 数据的 API,并展示它如何通过 Zipkin 进行监控。
package com.icoderoad.zipkin.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
@GetMapping("/api/test")
public Map<String, String> testApi() {
// 模拟业务逻辑
Map<String, String> response = new HashMap<>();
response.put("message", "API 调用成功!");
response.put("status", "200 OK");
return response;
}
}
前端页面展示 (Thymeleaf + jQuery + Bootstrap)
在前端,我们将使用 jQuery 调用 RESTful API 并展示返回的 JSON 数据。前端使用 Bootstrap 进行页面美化,jQuery 来处理 API 请求。
在 src/main/resources/templates 目录下创建 index.html 文件:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API 性能监控</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h1>Spring Boot 3 Zipkin 监控示例</h1>
<button id="testApiBtn" class="btn btn-primary">调用 API</button>
<div id="apiResponse" class="mt-3"></div>
</div>
<script>
$(document).ready(function(){
$('#testApiBtn').click(function(){
$.ajax({
url: '/api/test',
type: 'GET',
dataType: 'json',
success: function(response) {
$('#apiResponse').html('<pre>' + JSON.stringify(response, null, 2) + '</pre>');
},
error: function() {
$('#apiResponse').html('<div class="alert alert-danger">API 调用失败!</div>');
}
});
});
});
</script>
</body>
</html>
效果展示与分析
启动 Spring Boot 应用并调用 /api/test 接口后,Zipkin 会记录 API 调用链路信息。你可以通过访问 http://localhost:9411/zipkin 查看追踪数据。
Zipkin 追踪示例:
- 服务调用的耗时:展示每个 API 请求在服务器端和中间件的响应时间。
- 调用链路分析:展示微服务架构下的调用顺序,帮助开发者了解请求的具体流向。
- 性能瓶颈定位:通过分析每个 Span 的耗时,快速找出系统中性能较差的环节。
Zipkin 提供了直观的 Web UI,可以方便地分析调用链路,定位性能问题。
总结
通过本文的演示,我们成功地将 Zipkin 集成到了 Spring Boot 3 项目中,监控 RESTful API 的性能表现。Zipkin 作为一款强大的分布式追踪工具,能够在微服务架构下帮助开发者快速定位系统瓶颈,优化服务性能。结合 Spring Cloud Sleuth 的使用,Zipkin 可以无缝集成到微服务项目中,实现对全链路调用的追踪。
未来我们可以进一步扩展 Zipkin 的使用场景,例如与 Kafka、RabbitMQ 等消息队列集成,实现更复杂的追踪方案。
通过这些实践,开发者可以更好地管理微服务架构,快速定位并解决系统性能瓶颈,从而提升系统的稳定性和用户体验。