1. 概述

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

有时候,我们可能不想使用Spring Boot,比如在集成Spring框架到Jakarta EE应用时,但我们仍然希望利用生产就绪的功能,如度量和健康检查,即所谓的“可观测性”。(关于这一点,可以参考文章“使用Spring Boot 3实现可观测性“。)

可观测性功能由Spring Boot Actuator提供,它是Spring Boot的一个子项目。在这篇文章中,我们将了解如何将Actuator集成到不使用Spring Boot的应用中。

2. 项目配置

当排除Spring Boot时,我们需要处理应用程序打包和服务器运行时提供,还需要自己外部化配置(请参阅Spring Boot 3.0.6版本的文档:外部配置特性)。这些由Spring Boot提供的特性对于在基于Spring的应用中使用Actuator并不是必需的。虽然我们确实需要项目的依赖项,但不能使用Spring Boot的启动依赖项(在这个例子中是spring-boot-starter-actuator)。除此之外,我们还需要在应用程序上下文中添加必要的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 or any other application configuration
public class AppConfig {
    // ...
}

需要注意的是,这可能会影响到整个应用,因为如果类路径中存在其他自动配置类,它还会自动配置框架的其他部分。

2.3. 启用端点

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

management.endpoints.web.exposure.include=*

这些属性必须可供上下文访问——例如,通过将它们放入application.properties文件中,并在配置类上使用@PropertySource注解:

@EnableAutoConfiguration
@PropertySource("classpath:application.properties")
// ... @ComponentScan, @Import or any other application configuration
public class AppConfig {
}

2.4. 测试项目配置

现在,我们已经准备好调用Actuator端点了。我们可以通过这个属性来启用健康详情:

management.endpoint.health.show-details=always

并且我们可以实现自定义健康端点

@Configuration
public class ActuatorConfiguration {

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

}

然后,通过访问"{url_to_project}/actuator/health",将得到如下输出:

示例健康端点输出

3. 总结

在这篇教程中,我们了解了如何在非Spring Boot应用中集成Spring Boot Actuator。如往常一样,所有的代码实现可以在GitHub上的相关教程中找到。