在非 Spring Boot 应用中整合 Spring Boot Actuator

1、概览

Spring Boot 项目 是 Spring 框架的扩展,它提供的功能有助于创建基于 Spring 的独立应用程序,并支持云原生开发。

有时,我们并不想使用 Spring Boot,例如在将 Spring Framework 整合到 Jakarta EE 应用程序时,但我们仍然希望受益于生产就绪功能,如指标和健康检查,即所谓的 “可观察性”。(可在 “Spring Boot 3 和 Observability(可观察性)” 一文中找到详细信息)。

可观察性功能由 Spring Boot Actuator 提供,它是 Spring Boot 的一个子项目。在本文中,我们将了解如何将 Actuator 整合到非 Spring Boot 的应用程序中。

2、项目配置

如果不使用 Spring Boot,我们就需要处理应用打包和服务器运行时配置的问题,还需要自己将 配置外部化,当然,本文并不会涉及这些内容。由于我们不能直接使用 Spring Boot 的 Starter 依赖(本例中为 spring-boot-starter-actuator),因此我们需要在 application context 中手动添加必要的 Bean。

我们可以手动配置,也可以使用自动配置。因为 Actuator 的配置相当复杂,而且没有任何详细的文档说明,所以我们应该选择自动配置。这是我们需要 Spring Boot 的原因之一,因此我们不能完全排除 Spring Boot。

2.1、添加项目依赖

要集成 Actuator,我们需要 Spring-boot-actuator-autoconfigure 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator-autoconfigure</artifactId>
    <version>3.0.6</version>
</dependency>

这也将通过传递依赖 spring-boot-actuatorspring-bootspring-boot-autoconfigure

2.2、启用自动配置

然后,我们启用自动配置。在应用的配置中添加 @EnableAutoConfiguration 即可轻松实现:

@EnableAutoConfiguration
// ... @ComponentScan、@Import 或其他应用配置
public class AppConfig {
    // ...
}

注意,这可能会影响整个应用程序,因为如果 classpath 中存在其他自动配置类,这也会自动配置框架的其他部分。

2.3、启用端点

默认情况下,只有 health 端点被启用。Actuator 的自动配置类使用配置属性,例如,WebEndpointAutoConfiguration 使用 WebEndpointProperties,这些属性被映射到带有 management.endpoints.web 前缀的属性。要启用所有端点,我们需要

management.endpoints.web.exposure.include=*

这些属性必须可供 context 使用,例如,将它们放入 application.properties 文件并用 @PropertySource 对我们的配置类进行注解:

@EnableAutoConfiguration
@PropertySource("classpath:application.properties")
// ... @ComponentScan,@Import 或其他应用配置
public class AppConfig {
}

2.4、测试项目配置

现在,我们可以调用 actuator 端点了。我们可以使用此属性启用健康详细(health detail)信息:

management.endpoint.health.show-details=always

我们还可以实现自定义的 health 端点:

@Configuration
public class ActuatorConfiguration {

    @Bean
    public HealthIndicator sampleHealthIndicator() {
        return Health.up()
          .withDetail("info", "Sample Health")
          ::build;
    }

}

此时,调用 {url_to_project}/actuator/health 就会得到类似如下的输出结果:

Sample Health Endpoint Output

3、总结

在本教程中,我们了解了如何在非 Spring Boot 应用程序中整合 Spring Boot Actuator。


参考:https://www.baeldung.com/spring-boot-actuator-without-spring-boot