从内部获取 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 组件有自己的健康指标。有用的 类 是 ReactiveHealthIndicatorRegistry
、ReactiveHealthIndicator
等
简单的解决方案是编写您自己的健康端点而不是依赖 Spring。
Spring Boot 为您提供了 production-ready 个端点,但如果它不能满足您的目的,请编写您的 end-point。它只会 return "UP" 作为回应。如果服务中断,它不会 return 任何东西。
这里是 spring 关于编写反应性健康端点的引导文档。按照指南进行操作,应该足以满足您的用例。
他们还记录了如何编写 liveliness and Readiness
您的应用程序。
我有一个外部要求,即我提供一个端点来告诉负载均衡器将流量发送到我的应用程序。很像 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 组件有自己的健康指标。有用的 类 是 ReactiveHealthIndicatorRegistry
、ReactiveHealthIndicator
等
简单的解决方案是编写您自己的健康端点而不是依赖 Spring。 Spring Boot 为您提供了 production-ready 个端点,但如果它不能满足您的目的,请编写您的 end-point。它只会 return "UP" 作为回应。如果服务中断,它不会 return 任何东西。
这里是 spring 关于编写反应性健康端点的引导文档。按照指南进行操作,应该足以满足您的用例。
他们还记录了如何编写 liveliness and Readiness
您的应用程序。