是否有可能获得在 spring 启动时动态关闭我的应用程序的服务列表

Is it possible to get a list of service that dynamically get down on my application that is on spring boot

我的应用程序包含 rabbitmq、hazelcast、dynamodb、elastic 我想建立一个机制,可以在我的任何应用程序出现故障时告诉我我应该在 email.Can 上收到通知我们包括我可以跟踪的任何服务获取我的 spring 启动应用程序

中集成的所有应用程序的状态

我尝试使用 try catch 块,但代码行增加了,这让我的代码变得非常麻烦,因为我很难在每个方法中添加 try catch

Spring Boot actuator 提供了很多有用的端点,其中之一就是健康端点。健康端点 returns 基于其依赖项(数据库、第三方 API 等)的应用程序的健康状态。

已经有内置的health indicators for RabbitMQ, Hazelcast and Elastic. There is no builtin health indicator for DynamoDB as far as I know, but you can also write your own health indicator, as seen in

现在,要向您发送电子邮件,有两种选择:

  1. 您可以使用外部程序(例如监控软件)定期检查健康执行器
  2. 您可以将其作为 Spring 启动应用程序的一部分编写

使用外部程序

如果您使用外部程序,您可以让它使用 /actuator/health 端点。要启用此端点,请配置以下 属性:

management.endpoints.web.exposure.include=health

默认情况下,此端点仅公开所有健康指标组合的单一聚合状态。如果您想单独查看哪个服务已关闭,可以通过将以下 属性 设置为 alwayswhen_authorized:

来显示更多详细信息
management.endpoint.health.show-details=always | when_authorized

响应将如下所示:

{
  "status": "DOWN",
  "rabbit": {
    "status": "DOWN",
    "error": "org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused)"
  }
}

写你自己的

你可以写一个scheduled task by using the @Scheduled annotation to regularly check the health status. To obtain the health status, you can autowire HealthEndpoint as seen in .

然后您可以发送一封电子邮件 Spring

@Component
public class HealthEmailSender {
    private final HealthEndpoint healthEndpoint;
    private final JavaMailSender mailSender;

    // TODO: Implement constructor to autowire healthEndpoint + mailSender

    @Scheduled(fixedRate = 10 * 60 * 1000) // Check once every 10 minutes
    public void sendEmailWhenBadHealth() {
        if (isHealthDown()) {
            sendMail();
        }
    }
    
    private boolean isHealthDown() {
        return Status.DOWN.equals(healthEndpoint.health().getStatus());
    }

    private void sendMail() {
        MimeMessage message = mailsender.createMimeMessage();
        // TODO: Set from / to / title / content
        mailSender.send(message);
    }
}

一旦任何健康指标下降(不仅来自您提到的服务),上面的代码片段将发送 e-mail。

要获取您感兴趣的其中一项服务的运行状况,您可以使用 healthEndpoint.healthForPath("rabbit").getStatus()