問(wèn)安全的關(guān)鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
本文將深入講解如何在 Spring Boot 3.3 中集成 Zipkin 來(lái)監(jiān)控 RESTful API 的性能表現(xiàn)。我們將從 Zipkin 的基本概念出發(fā),介紹它的安裝與配置,并通過(guò)前后端代碼示例演示如何實(shí)現(xiàn)對(duì) API 調(diào)用鏈路的追蹤和性能監(jiān)控。
Zipkin 是一款分布式追蹤系統(tǒng),最初由 Twitter 開(kāi)發(fā),專(zhuān)門(mén)用于幫助工程師分析和監(jiān)控微服務(wù)架構(gòu)下服務(wù)的通信。它能記錄跨越多個(gè)服務(wù)之間的調(diào)用鏈路,并且詳細(xì)地展示調(diào)用的耗時(shí)和路徑。Zipkin 的核心功能包括:
Zipkin 使用 Span
和 Trace
作為核心概念。每一個(gè) Span
表示一個(gè)工作單元,例如一次服務(wù)調(diào)用或數(shù)據(jù)庫(kù)查詢(xún)。Trace
則是一組相關(guān)的 Span
,它們表示某個(gè)請(qǐng)求從開(kāi)始到結(jié)束的整個(gè)鏈路。Zipkin 會(huì)通過(guò) Zipkin Server
收集并存儲(chǔ)這些 Span
,然后在 Web UI 中可視化展示出來(lái),幫助開(kāi)發(fā)者分析性能數(shù)據(jù)。
運(yùn)行 Zipkin 服務(wù)器
Zipkin 可以通過(guò) Docker 運(yùn)行,也可以直接下載可執(zhí)行的 .jar
文件來(lái)啟動(dòng)。以下是通過(guò) Docker 安裝 Zipkin 的步驟:
docker run -d -p 9411:9411 openzipkin/zipkin
該命令會(huì)在 9411
端口啟動(dòng) Zipkin 服務(wù),你可以通過(guò)瀏覽器訪(fǎng)問(wèn) http://localhost:9411
來(lái)查看 Zipkin 的 Web UI。
集成 Zipkin 到 Spring Boot
通過(guò) Spring Cloud Sleuth,可以輕松將 Zipkin 集成到 Spring Boot 應(yīng)用中。下面的 pom.xml
配置展示了如何添加 Zipkin 相關(guān)依賴(lài)。
<?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>
Zipkin 的服務(wù)地址和采樣率等相關(guān)配置可以通過(guò) application.yml
文件進(jìn)行設(shè)置。
server:
port: 8080
spring:
application:
name: zipkin-monitoring-demo
zipkin:
base-url: http://localhost:9411 # Zipkin 服務(wù)器地址
sleuth:
sampler:
probability: 1.0 # 采樣率設(shè)置為 1.0 表示采集所有請(qǐng)求
logging:
level:
org.springframework.web: DEBUG
@ConfigurationProperties
?配置)為了更好地管理配置項(xiàng),我們可以通過(guò) @ConfigurationProperties
注解結(jié)合 Lombok 來(lái)簡(jiǎn)化代碼。以下是自定義 Zipkin 配置類(lèi):
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;
}
為了更好地展示 Zipkin 的追蹤功能,我們將創(chuàng)建一個(gè)返回 JSON 數(shù)據(jù)的 API,并展示它如何通過(guò) Zipkin 進(jìn)行監(jiān)控。
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() {
// 模擬業(yè)務(wù)邏輯
Map<String, String> response = new HashMap<>();
response.put("message", "API 調(diào)用成功!");
response.put("status", "200 OK");
return response;
}
}
前端頁(yè)面展示 (Thymeleaf + jQuery + Bootstrap)
在前端,我們將使用 jQuery 調(diào)用 RESTful API 并展示返回的 JSON 數(shù)據(jù)。前端使用 Bootstrap 進(jìn)行頁(yè)面美化,jQuery 來(lái)處理 API 請(qǐng)求。
在 src/main/resources/templates
目錄下創(chuàng)建 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 性能監(jiān)控</title>
<link 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 監(jiān)控示例</h1>
<button id="testApiBtn" class="btn btn-primary">調(diào)用 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 調(diào)用失?。?lt;/div>');
}
});
});
});
</script>
</body>
</html>
啟動(dòng) Spring Boot 應(yīng)用并調(diào)用 /api/test
接口后,Zipkin 會(huì)記錄 API 調(diào)用鏈路信息。你可以通過(guò)訪(fǎng)問(wèn) http://localhost:9411/zipkin
查看追蹤數(shù)據(jù)。
Span
的耗時(shí),快速找出系統(tǒng)中性能較差的環(huán)節(jié)。Zipkin 提供了直觀(guān)的 Web UI,可以方便地分析調(diào)用鏈路,定位性能問(wèn)題。
通過(guò)本文的演示,我們成功地將 Zipkin 集成到了 Spring Boot 3 項(xiàng)目中,監(jiān)控 RESTful API 的性能表現(xiàn)。Zipkin 作為一款強(qiáng)大的分布式追蹤工具,能夠在微服務(wù)架構(gòu)下幫助開(kāi)發(fā)者快速定位系統(tǒng)瓶頸,優(yōu)化服務(wù)性能。結(jié)合 Spring Cloud Sleuth 的使用,Zipkin 可以無(wú)縫集成到微服務(wù)項(xiàng)目中,實(shí)現(xiàn)對(duì)全鏈路調(diào)用的追蹤。
未來(lái)我們可以進(jìn)一步擴(kuò)展 Zipkin 的使用場(chǎng)景,例如與 Kafka、RabbitMQ 等消息隊(duì)列集成,實(shí)現(xiàn)更復(fù)雜的追蹤方案。
通過(guò)這些實(shí)踐,開(kāi)發(fā)者可以更好地管理微服務(wù)架構(gòu),快速定位并解決系統(tǒng)性能瓶頸,從而提升系統(tǒng)的穩(wěn)定性和用戶(hù)體驗(yàn)。
文章轉(zhuǎn)自微信公眾號(hào)@路條編程
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
如何快速實(shí)現(xiàn)REST API集成以?xún)?yōu)化業(yè)務(wù)流程
使用FastAPI為Python構(gòu)建應(yīng)用程序
使用Django REST Framework構(gòu)建API
使用Flask、Google Cloud SQL和App Engine設(shè)置API
微服務(wù)為什么要用到 API 網(wǎng)關(guān)?
14個(gè)文本轉(zhuǎn)圖像AI API
什么是API定義?
修復(fù)API中損壞的訪(fǎng)問(wèn)控制的指南
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)