强力监控!Spring Boot 3.3 集成 Zipkin 全面追踪 RESTful API 性能

科技   2024-10-08 07:31   河北  


强力监控!Spring Boot 3.3 集成 Zipkin 全面追踪 RESTful API 性能

随着微服务架构的流行,应用程序被分解为多个独立的服务组件,系统的复杂度也随之增加。在这种情况下,传统的日志和监控手段很难全面追踪服务之间的调用情况。特别是在排查系统瓶颈或处理性能问题时,缺乏全局的调用链路追踪工具会极大地影响问题定位和解决效率。

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 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 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 追踪示例:

  1. 服务调用的耗时:展示每个 API 请求在服务器端和中间件的响应时间。

  2. 调用链路分析:展示微服务架构下的调用顺序,帮助开发者了解请求的具体流向。

  3. 性能瓶颈定位:通过分析每个 Span 的耗时,快速找出系统中性能较差的环节。

Zipkin 提供了直观的 Web UI,可以方便地分析调用链路,定位性能问题。

总结

通过本文的演示,我们成功地将 Zipkin 集成到了 Spring Boot 3 项目中,监控 RESTful API 的性能表现。Zipkin 作为一款强大的分布式追踪工具,能够在微服务架构下帮助开发者快速定位系统瓶颈,优化服务性能。结合 Spring Cloud Sleuth 的使用,Zipkin 可以无缝集成到微服务项目中,实现对全链路调用的追踪。

未来我们可以进一步扩展 Zipkin 的使用场景,例如与 Kafka、RabbitMQ 等消息队列集成,实现更复杂的追踪方案。

通过这些实践,开发者可以更好地管理微服务架构,快速定位并解决系统性能瓶颈,从而提升系统的稳定性和用户体验。


今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。


AI资源聚合站已经正式上线,该平台不仅仅是一个AI资源聚合站,更是一个为追求知识深度和广度的人们打造的智慧聚集地。通过访问 AI 资源聚合网站 https://ai-ziyuan.techwisdom.cn/,你将进入一个全方位涵盖人工智能和语言模型领域的宝藏库


作者:路条编程(转载请获本公众号授权,并注明作者与出处)


路条编程
路条编程是一个友好的社区,在这里你可以免费学习编程技能,我们旨在激励想学编程的人尝试新的想法和技术,在最短的时间学习到工作中使用到的技术!
 最新文章