在日常的开发和运维工作中,当我们接手一个庞大的 Spring Boot 微服务项目时,除了查阅可能已经过时的文档,还有什么办法能快速知晓系统当前究竟暴露了哪些 HTTP 接口?或者,在编写自动化测试脚本时,我们能否动态地获取所有可用的 API 路径,甚至利用 AI 来辅助这一过程?
在 2026 年,随着微服务架构的日益复杂和 AI 原生开发的普及,"如何获取所有端点"已经不再是一个简单的查找操作,而是构建可观测性和智能运维的基础。在这篇文章中,我们将深入探讨如何在 Spring Boot 应用程序中获取所有端点的完整列表。我们将从基础的概念出发,不仅介绍如何利用 Spring Boot Actuator 这一经典工具,还将结合 Springdoc OpenAPI 和 Agentic AI 工作流,展示如何在 2026 年的技术栈下,动态地收集、展示并利用这些端点信息。
为什么我们需要获取所有端点?
在深入代码之前,让我们先理解一下这个需求的实际价值。获取所有端点不仅仅是一个“查找”的过程,它在以下几个方面有着广泛的应用,特别是在现代化的 DevOps 和 DevSecOps 流程中:
- 动态 API 文档与门户:静态文档往往会滞后。通过实时获取端点,我们可以确保开发者看到的 API 文档永远与代码一致。
- 安全审计与攻击面分析:在 2026 年,安全左移 是标准实践。通过自动化工具定期拉取所有暴露的 URL,我们可以快速检查是否存在未授权访问的敏感接口,防止 API 泄露。
- 智能测试生成:结合现代 AI 工具(如 GitHub Copilot Workspace 或 Cursor),如果我们能提供一份准确的端点列表,AI 就能为我们生成覆盖率极高的集成测试用例。
- 服务网格治理:在 Kubernetes 和 Istio 等复杂环境中,服务发现机制需要精确的端点元数据来进行流量管理和灰度发布。
基础:Spring Boot Actuator 的演进
要实现获取所有端点的功能,我们要介绍 Spring Boot 家族中最得力的助手——Spring Boot Actuator。虽然它不是新面孔,但在最新的版本中,它对云原生和可观测性的支持已经达到了新的高度。
#### 什么是 Actuator?
Spring Boot Actuator 通过“端点”来暴露应用的内部状态。默认情况下,它提供了 INLINECODE2f41a23a(健康检查)、INLINECODEbb5da330(应用信息)、/metrics(指标)等核心端点。你可以把它想象成汽车的“仪表盘”,它不需要你编写额外的代码,就能暴露出应用的内部状态。
实战步骤:构建与配置(2026 版)
让我们通过一个完整的实战案例,一步步构建一个能够展示自身所有端点的 Spring Boot 应用。我们将使用 Maven 作为构建工具,并融入最新的配置实践。
#### 步骤 1:初始化项目
首先,我们需要一个新的起点。在 2026 年,我们通常会使用 Spring Initializr(无论是网站还是 IDE 插件)来创建项目。
- 项目名称:
smart-endpoint-discovery。 - 语言:Java 21 或 Kotlin(利用虚拟线程提升并发性能)。
- 构建工具:Maven。
- 依赖选择:Spring Web, Spring Boot Actuator, Springdoc OpenAPI (Starter WebMvc UI)。
#### 步骤 2:添加必要的依赖
打开你的 pom.xml 文件,我们需要引入监控和文档生成的核心依赖。为了适应 2026 年的开发需求,我们还引入了校验依赖,以确保元数据的准确性。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springdoc
springdoc-openapi-starter-webmvc-ui
2.5.0
代码深度解析:
这里加入了 springdoc-openapi-starter-webmvc-ui。这是目前处理 Spring Boot 3.x+ OpenAPI 规范的最佳实践。它不仅生成 JSON 规范,还内置了一个 Swagger UI 页面,让我们能直接在浏览器中与端点交互。
#### 步骤 3:配置应用属性
接下来,我们需要告诉 Spring Boot 我们希望如何暴露这些端点。在最新的版本中,安全性依然是第一位的。
编辑 src/main/resources/application.properties 文件:
# 应用名称
spring.application.name=smart-endpoint-discovery
# 启用所有 Actuator 端点(仅限开发环境!)
management.endpoints.web.exposure.include=*
# 将 Actuator 端点映射到 /manage 前缀,避免与业务 API 冲突
management.endpoints.web.base-path=/manage
# 启用详细的健康信息
management.endpoint.health.show-details=always
# OpenAPI 配置
springdoc.api-docs.path=/api-docs
springdoc.swagger-ui.path=/swagger-ui.html
配置深度解析:
我们将 Actuator 的基础路径设置为 INLINECODEcde6f66a。这是一种最佳实践,它将监控端点(INLINECODE623bfe54, INLINECODEf5a7639f)与业务端点(INLINECODEac03bcdb)在 URL 层面物理隔离,便于在网关层面配置不同的安全策略。
进阶:使用 Springfox 与 OpenAPI 获取结构化端点
虽然 Actuator 提供了 /mappings,但它的 JSON 格式主要面向 JVM 内部结构,对于前端开发者或 API 网关来说,并不是最友好的。在 2026 年,我们更倾向于使用 OpenAPI (Swagger) 规范。
只需引入上述依赖,启动应用后访问 INLINECODEe78f3b66。你将看到一个交互式的 API 文档页面。更重要的是,你可以通过访问 INLINECODE4ab0d1d5 获取一个标准的 JSON 文件。
为什么这很重要?
这个 JSON 文件可以被机器读取。这意味着你可以编写脚本,将这个文件发送给 API 网关(如 Kong 或 APISIX)进行自动配置,或者将其作为 Prompt 的上下文发送给 AI Agent,让 AI 理解你的业务接口逻辑。
深入:编程式获取端点(运行时动态收集)
有时,我们需要在代码运行时动态获取这些信息,例如实现一个自定义的“服务清单”功能,或者在微服务启动时向注册中心报告更详细的元数据。让我们看看如何用代码实现这一点。
#### 场景:构建一个自定义的端点聚合器
我们需要创建一个服务,它能够读取 Spring 的 INLINECODE1e6d9c57,这是所有 INLINECODEf9416a88 的源头。
package com.example.endpointdemo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 端点扫描服务
* 负责在运行时收集所有用户定义的 Controller 信息
*/
@Service
public class EndpointScannerService {
private final RequestMappingHandlerMapping handlerMapping;
@Autowired
public EndpointScannerService(RequestMappingHandlerMapping handlerMapping) {
this.handlerMapping = handlerMapping;
}
/**
* 获取所有业务端点的摘要信息
* @return 包含路径、方法和类名的 Map
*/
public Map getAllBusinessEndpoints() {
// 获取 HandlerMap,其中的 Key 是 RequestMappingInfo (包含路径和条件), Value 是处理方法
return handlerMapping.getHandlerMethods().entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey().toString(), // 获取 URL 模式
e -> {
HandlerMethod method = e.getValue();
return method.getBeanType().getSimpleName() + "#" + method.getMethod().getName();
}
));
}
}
代码深度解析:
RequestMappingHandlerMapping 是 Spring MVC 的核心组件,它维护了所有 URL 到处理方法的映射关系。通过注入这个 Bean,我们可以绕过 Actuator,直接从内存中获取最纯粹的映射信息。这种方式比访问 HTTP 端点性能更高,因为它没有网络序列化的开销。
为了展示这些数据,我们创建一个 Controller:
package com.example.endpointdemo.controller;
import com.example.endpointdemo.service.EndpointScannerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/admin")
public class SystemAdminController {
@Autowired
private EndpointScannerService endpointScannerService;
@GetMapping("/endpoints-report")
public Map generateReport() {
Map endpoints = endpointScannerService.getAllBusinessEndpoints();
return Map.of(
"timestamp", System.currentTimeMillis(),
"total_count", endpoints.size(),
"endpoints", endpoints
);
}
}
2026 技术视野:AI 驱动的端点发现与测试
如果我们仅仅停留在“列出”端点,那还不够“智能”。让我们思考一下,在 Agentic AI(代理式 AI) 时代,我们如何利用这些信息?
#### 智能工作流:Vibe Coding 与自动化测试
想象一下这样的场景:你刚刚编写完一组 Controller。你不需要手动打开 Postman 或 JUnit。你可以配置一个 CI/CD 流水线,它执行以下步骤:
- 读取元数据:流水线启动应用,调用我们刚才编写的
/admin/endpoints-report或 OpenAPI 的 JSON。 - 调用 AI Agent:流水线脚本将这些端点信息发送给一个具备编程能力的 AI(如 GPT-4o 或 Claude 4.0 Sonnet)。
- 生成测试用例:AI 分析端点的参数、返回值和注释,自动生成完整的 RestAssured 或 Karate 测试脚本。
- 执行与反馈:运行这些测试,并将结果反馈回开发环境。
这就是 Vibe Coding(氛围编程) 的精髓——作为开发者,我们定义结构(Actuator + OpenAPI),AI 帮我们填充细节(测试 + 边界情况检查)。
安全性与生产环境最佳实践
在 2026 年,数据的隐私和安全比以往任何时候都重要。我们在文章中使用了 exposure.include=*,但在生产环境中,这是绝对禁止的。
- 最小权限原则:仅暴露 INLINECODE2c5bb014 和 INLINECODE08471f2a。如果需要监控,使用 Prometheus 拉取
/manage/prometheus,而不是让外部直接访问 HTTP 端点。 - 自定义端点保护:如果你编写了像 INLINECODE22657f9f 这样的端点,务必使用 Spring Security 进行保护。例如,只允许拥有 INLINECODE7b252211 角色的内部服务账号访问。
// 示例:SecurityConfig 配置片段
http.securityMatcher("/admin/**", "/manage/**")
.authorizeRequests(authz -> authz
.anyRequest().hasRole("ACTUATOR")
)
.httpBasic(withDefaults());
总结与展望
通过这篇文章,我们不仅重温了 Spring Boot Actuator 的基础用法,还深入探讨了通过编程方式和 OpenAPI 规范来获取端点信息的高级技巧。
在 2026 年,获取端点列表不再是为了“看一看”,而是为了实现 API 的自动化治理。它是连接你的代码、你的 AI 编程助手以及运维监控系统的桥梁。掌握这些技能,将帮助你在现代 Java 开发中保持领先。你可以尝试结合文中提到的 EndpointScannerService,结合你喜欢的 AI 工具,看看能碰撞出什么样的自动化火花吧!