从内部获取 Spring 启动健康状态的正确方法

Proper way to get Spring Boot health status from inside

我有一个外部要求,即我提供一个端点来告诉负载均衡器将流量发送到我的应用程序。很像 Kubernetes 的“就绪”探测器,但它必须是特定的格式和路径,所以我可以只给他们执行器健康端点。

过去我使用过 HealthEndpoint 并调用过 health(),但这对反应式应用程序不起作用。有没有更灵活的方法来查看应用程序是否“UP”?在这个级别上,我不关心它是响应式还是 servlet,我只想知道 Spring Boot 对应用程序的评价。

我还没有找到这样的东西,大多数文章都在谈论调用/actuator/health,但这不是我需要的。


编辑:

再详细一点,我要return某个字符串“NS_ENABLE”好不好。在某些情况下,我 return “NS_DISABLE”,所以我不能不 return 任何东西,这通常是有道理的。

此外,我非常喜欢 Spring Boot 为我进行检查的方式。我宁愿不重新执行所有这些检查。


编辑 2:我的最终解决方案

尽管这不是我的最终解决方案,但下面的答案让我走得很远,所以我想对我的最终理解给出一个提示。

事实证明,HealthEndpoint 适用于响应式应用程序和 servlet 应用程序,您只需将它们包装在 Mono.

我们如何定义任何网络服务器的健康状况? 我们看看我们依赖的服务怎么样,我们检查Redis,MySQL,MongoDB,ElasticSearch,和其他数据库的状态,这就是actuator内部做的事情。

Actuator 检查不同数据库的状态,并以此为基础 returns Up/Down.

您可以实现自己的方法来检查依赖服务的运行状况。

  • 可以使用 ping 命令检查 Redis 是否健康
  • MySQL 可以使用 SELECT 1 命令或 运行 一些应该总是成功的查询来验证,例如 SHOW TABLES

同样,您可以对其他服务进行健康检查。如果您发现所有必需的服务都已启动,那么您可以声明启动,否则将关闭。

关机触发器呢?每当您的服务器收到关闭信号时,无论您的依赖服务的状态如何,您都应该始终关闭,这样上游就不会向该实例发送调用。


编辑

可以通过从 Actuator 模块自动装配一个或多个 bean 以编程方式检查整个 spring 应用程序的运行状况。

@Controller
public class MyHealthController{
 @Autowired private HealthEndpoint healthEndpoint;
 @GetMapping("health")
  public Health health() {
    Health health = healthEndpoint.health();
    return healthEndpoint.health();
  }
}

还有其他与健康检查相关的bean,我们可以自动连接所需的bean。有些 bean 提供了各自组件的健康状况,我们可以使用 HealthAggregator 组合每个组件的健康状况以获得最终的健康状况。可以通过 HealthIndicatorRegistry 访问所有已注册的健康指标组件。

@Controller
public class MyHealthController{
  @Autowired private HealthAggregator healthAggregator;
  @Autowired private HealthIndicatorRegistry healthIndicatorRegistry;

  @GetMapping("health")
  public Health health() {
    Map<String, Health> health = new HashMap<>();
    for (Entry<String, HealthIndicator> entry : healthIndicatorRegistry.getAll().entrySet()) {
      health.put(entry.getKey(), entry.getValue().health());
    }
    return healthAggregator.aggregate(health);
  }
}

  

注意:Reactive 组件有自己的健康指标。有用的 类 是 ReactiveHealthIndicatorRegistryReactiveHealthIndicator

简单的解决方案是编写您自己的健康端点而不是依赖 Spring。 Spring Boot 为您提供了 production-ready 个端点,但如果它不能满足您的目的,请编写您的 end-point。它只会 return "UP" 作为回应。如果服务中断,它不会 return 任何东西。

这里是 spring 关于编写反应性健康端点的引导文档。按照指南进行操作,应该足以满足您的用例。

他们还记录了如何编写 liveliness and Readiness 您的应用程序。

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#reactive-health-indicators