区分昂贵和便宜的健康检查

Distinguish between expensive and inexpensive health checks

我们通常在高度可用的应用程序中非常频繁地 ping /health 以确定何时需要进行故障转移。 Spring 如果使用的健康指示器不会对外部依赖项(如数据库或 Web 服务)进行昂贵的调用,则引导执行器可以很好地执行此操作。但是,我们喜欢编写健康指标的简便性以及它如何插入 /health 端点。

有什么方法可以配置 Spring 引导执行器,以便在某些情况下仅执行一部分指标?如果可以,怎么做?

谢谢!

您可以使用 management.health.<service>.enabled 属性控制启用哪些健康指标。例如,要关闭数据库健康检查:

management.health.db.enabled: false

完整的属性列表可用 here。在撰写本文时,它们是:

management.health.db.enabled
management.health.diskspace.enabled
management.health.mongo.enabled
management.health.rabbit.enabled
management.health.redis.enabled
management.health.solr.enabled

我现在也有类似情况。我刚刚实现了一个自定义 Endpoint 来执行昂贵的健康检查。

如果您需要 HTTP 端点的舒适性,您还可以实现一个 AbstractEndpointMvcAdapter,它执行与 Spring 的 HealthMvcEndpoint.[=13= 类似的 HTTP 状态代码映射]

2021 年更新

Health Groups 提供您所询问的确切功能。

https://docs.spring.io/spring-boot/docs/2.5.3/reference/html/actuator.html#actuator.endpoints.health.groups

如果您使用 Spring Boot >= 2.2,您可以使用单独的库 spring-boot-async-health-indicator 在单独的线程上进行昂贵的健康检查 运行,只需用 @AsyncHealth.

这将确保您的 /health 端点总是 return 非常快并且不会等待那些昂贵的健康检查完成。

示例:

@AsyncHealth
@Component
public class MyExpensiveHealthCheck implements HealthIndicator {

    @Override
    public Health health() {
        verySlowCheck(); // This method does not run when /health is called
        return Health.up().build();
    }

}

免责声明:我创建这个库就是为了这个目的