如何在Spring Boot中整合Info端点实现应用信息展示?

来源:建站作者:星宫一花头衔:网络博主
导读:本期聚焦于星宫一花创作的《如何在Spring Boot中整合Info端点实现应用信息展示?》,敬请观看详情。为什么应用上线后总是难以确认实际部署的代码版本?Spring Boot的Info端点提供了一套标准的信息暴露机制,通过引入spring-boot-actuator并启用info端点,可以把构建信息、Git提交记录以及自定义业务数据统一汇聚到一个HTTP接口中。本文从InfoContributor的底层执行模型讲起,介绍如何利用build-info和git-commit-id插件自动生成构建元数据,再演示手动注册自定义InfoContributor的完整流程。你还会看到如何控制Info端点暴露哪些内容、如何通过配置管理敏感字段,以及多Contributor之间的合并规则。按照文中的步骤,可以快速落地一个适合生产环境的Info信息面板,让版本确认和部署核验不再依赖服务器登录。

Spring Boot的Actuator模块通常被用来做健康检查和指标监控,但Info端点的价值往往被低估。它本质上是一个运行实例的元数据聚合器,能够在统一接口中呈现应用版本、构建时间、Git提交ID、部署环境以及业务自定义字段。要把Info端点用起来,不需要从零实现HTTP接口,而是围绕InfoContributor扩展点把零散信息组织成Map结构,Actuator会自动完成聚合和JSON输出。

如何在Spring Boot中整合Info端点实现应用信息展示?

先看执行链路。当请求访问/actuator/info时,Spring Boot会根据当前应用上下文收集所有类型为InfoContributor的Bean,并逐个调用它们的contribute方法。每个Contributor向同一个Info.Builder写入键值数据,最终由InfoEndpoint生成完整的Info对象。这种设计的好处是扩展点非常清晰:新增一类信息就新增一个Contributor,不会侵入现有逻辑。

一、引入Actuator并启用Info端点

要让Info端点对外提供服务,首先需要在Maven项目中引入spring-boot-starter-actuator依赖。这个依赖会带上InfoEndpoint及相关自动配置类,但出于安全考虑,Spring Boot默认只暴露health端点。因此接下来必须修改application.yml或application.properties,将info加入暴露列表。注意management.endpoints.web.exposure.include的配置方式,如果只写info,就不会把其他端点无谓暴露出去。

最小配置如下。这里同时展示了pom.xml和application.yml的关键片段。pom.xml中不需要额外配置执行goal,仅引入starter即可让info端点具备空JSON返回能力,后续再补充数据源。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
  endpoints:
    web:
      exposure:
        include: info
  endpoint:
    info:
      enabled: true

访问/actuator/info时,如果一切正常会得到一个空的JSON对象。这个空对象并不意味着没有信息,而是因为当前还没有任何InfoContributor写入数据。下一节会从构建元数据开始填充。

二、自动生成构建信息与Git元数据

在日常发布中,最常需要确认的两类信息是Maven构建坐标和Git提交记录。这两类信息都可以通过插件在打包阶段生成属性文件,再由Spring Boot自动识别并暴露到Info端点。构建信息依赖spring-boot-maven-plugin的build-info目标,它会生成META-INF/build-info.properties,包含artifact、version、time等字段;Git信息则使用git-commit-id-maven-plugin生成git.properties。

需要注意的是,插件生成的属性文件必须放在META-INF目录下,因为Spring Boot会从classpath中扫描这些固定路径。配置build-info时,可以在spring-boot-maven-plugin的executions中声明目标;配置git-commit-id时,需要指定生成文件位置为META-INF/git.properties。两个插件可以共存,无需额外Java代码。

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>build-info</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>io.github.git-commit-id</groupId>
      <artifactId>git-commit-id-maven-plugin</artifactId>
      <configuration>
        <generateGitPropertiesFile>true</generateGitPropertiesFile>
        <generateGitPropertiesFilename>${project.build.outputDirectory}/META-INF/git.properties</generateGitPropertiesFilename>
      </configuration>
    </plugin>
  </plugins>
</build>

重新执行mvn package后,再访问Info端点,可以看到类似下面的返回结构。其中build和git节点并非手动编码,而是由Spring Boot内置的InfoPropertiesInfoContributor根据属性文件自动填充。字段名与属性文件中的键一一对应。

{
  "build": {
    "artifact": "order-service",
    "version": "1.4.2",
    "time": "2025-03-18T10:20:30Z"
  },
  "git": {
    "branch": "main",
    "commitId": "7f3b2a9",
    "commitTime": "2025-03-18T09:50:00Z"
  }
}

如果项目使用Gradle,也有对应的gradle插件可以生成相同格式的属性文件,核心思路不变。需要特别留意的是,生成的构建时间和Git时间属于客观元数据,但如果应用按时间判断缓存策略,这些时间字段可能会随构建变化,不要将它们误认为应用启动时间。

三、自定义InfoContributor与合并规则

构建信息和Git内容足够用来回答版本问题,但生产环境还经常需要暴露部署区域、运维联系人、启用的功能开关等业务数据。这些信息可以写在配置文件中,也可以直接交给自定义InfoContributor在运行时动态获取。自定义Contributor只需要实现InfoContributor接口,在contribute方法中调用Info.Builder的withDetail写入键值数据。

一个常见的做法是注入Environment或业务配置Bean,把与部署相关的信息拼装成Map后一次性写入。下面的示例展示了如何读取当前激活的profile、部署区域和负责人信息,并组织到Info端点中。代码中用LinkedHashMap保证字段输出顺序,便于阅读。

import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class DeploymentInfoContributor implements InfoContributor {

    private final Environment environment;

    public DeploymentInfoContributor(Environment environment) {
        this.environment = environment;
    }

    @Override
    public void contribute(Info.Builder builder) {
        Map<String, Object> deployment = new LinkedHashMap<>();
        deployment.put("region", environment.getProperty("deploy.region", "default"));
        deployment.put("profile", String.join(",", environment.getActiveProfiles()));
        builder.withDetail("deployment", deployment);
        builder.withDetail("owner", "platform-team");
    }
}

当多个InfoContributor同时存在时,它们会按照Spring Bean的Order顺序依次执行。如果两个Contributor写入了相同的键,后执行的会覆盖先执行的值。需要固定输出优先级时,可以在类上添加@Order注解,例如@Order(10)表示较早执行,@Order(20)较晚执行,数字越大越后执行。对于同名的扁平键或嵌套Map键,覆盖行为一致。

此外,Info端点可以结合配置实现条件化数据输出。对于不想对外公开的字段,可以不在Contributor中写入,或者使用@ConditionalOnProperty控制整个Contributor是否注册。某些自动收集的env信息默认关闭,如果确实需要,可以通过management.info.env.enabled=true开启,但务必评估敏感环境变量泄露风险。

最后总结一下,Spring Boot的Info端点通过InfoContributor机制把构建、Git和业务元数据统一到一处,非常适合发布核验和运维排查。只要配置好插件和自定义Contributor,就能获得一个稳定、易扩展的应用信息面板。实际使用中建议把Info端点与安全框架配合,限制访问来源,避免将内部拓扑信息暴露到公网。

Spring Boot InfoInfoContributorActuator端点修改时间:2026-09-22 22:50:18

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0922/60656.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。