Spring Web应用程序运行状况检查

时间:2014-01-29 18:06:51

标签: java spring amazon-web-services

我正在亚马逊的Beanstalk平台上部署基于Spring的Web应用程序,他们可以选择为我的应用程序设置“健康检查”URL路径。

我们的想法是,在部署之后,他们的平台将针对该URL执行请求,以查看应用程序是否已成功启动。因此,如果请求导致HTTP 200,则应用程序可能正常。但是如果它导致HTTP 500或其他东西,平台就会知道应用程序存在问题。

所以,我希望我可以开发某种类型的servlet来检查Spring Application Context是否成功初始化,以便为平台提供适当的HTTP响应代码。

有人试过这样的事吗?出于类似的目的?

我想知道Spring是否已经为此提供了一些优雅的解决方案。

4 个答案:

答案 0 :(得分:10)

我建议使用Metrics中的运行状况检查功能。您可以设置许多扩展HealthCheck类并实现check()方法的类。这些运行状况检查实现将是Spring托管bean本身,并且可以自动装配Spring bean并验证它们。然后配置HealthCheckServlet以监控应用程序状态。同时检查metrics-spring项目。它将使Spring和Metrics集成更简单。

如果您使用的是Java Spring配置,那么您可能会使用这样的Metrics配置,从metrics-spring

扩展MetricsConfigurerAdapter
@Configuration
@EnableMetrics
public class MetricsConfig extends MetricsConfigurerAdapter { }

然后@Import(value = {MetricsConfig.class})到你的Spring配置。

您还需要并实施ServletContextListener来连接HealthCheckServlet和Spring。此HealthCheckContextListener应添加到您的web.xml

public class HealthCheckContextListener extends
    HealthCheckServlet.ContextListener implements ServletContextListener {

    private WebApplicationContext context;

    public HealthCheckContextListener(WebApplicationContext context) {
        this.context = context;
    }

    public HealthCheckContextListener() {}

    @Override
    public void contextInitialized(ServletContextEvent event) {
        this.context = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getServletContext()); 
        event.getServletContext().setAttribute(HealthCheckServlet.HEALTH_CHECK_REGISTRY,
            context.getBean(HealthCheckRegistry.class));
    }

    @Override
    protected HealthCheckRegistry getHealthCheckRegistry() {
        return (HealthCheckRegistry) context.getBean(HealthCheckRegistry.class);
    }
}

答案 1 :(得分:2)

您应该考虑什么构成一个健康的应用程序(例如,servlet层?JMS队列?FTP服务器?等)并让您的运行状况检查验证这些服务的可用性。显然,健康检查会频繁运行,因此您不希望一次又一次地启动昂贵的操作。

Spring Boot是一个新项目,旨在通过支持约定而不是配置来简化Spring开发。他们实施了“健康检查”功能,您可以通过执行器add-in module将其添加到项目中。

以下是对其健康检查implementation的引用 - 它使用控制器类返回“ok”,如果有数据源,则尝试运行查询以确认数据库是否可访问(某些内容)比如Oracle语法中的“SELECT .. from dual”。

答案 2 :(得分:1)

你能做的最简单的事是:

@Controller
class HealthCheckController {

    @ResponseStatus(OK)
    @RequestMapping(value = "/ping", method = HEAD) {
    public void ping() {
    }
}

可扩展以测试特定的bean,DataSources等。

答案 3 :(得分:0)

这可以在 spring boot 框架中轻松完成。通过添加以下依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

您可以点击以下网址查看服务。

localhost:serverPort/actuator/health