2014-01-29 71 views
7

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

这个想法是,他们的平台将在部署之后对该URL执行请求,以查看应用程序是否成功启动。所以,如果请求导致HTTP 200,应用程序可能没问题。但是,如果它导致HTTP 500或其他问题,平台就知道应用程序存在问题。

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

有没有人试过这样的事情?为了类似的目的?

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

回答

8

我建议使用健康检查功能从Metrics。您可以设置一些类,扩展HealthCheck类并实施check()方法。这些运行状况检查实现将是Spring自己管理的bean,并可以自动连接Spring bean并验证它们。然后配置HealthCheckServlet以监视应用程序状态。还检查metrics-spring项目。它将使Spring和Metrics集成更简单。

如果您使用的是Java 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); 
    } 
} 
+0

这是非常有趣的,但WebApplicationContextUtils.getRequiredWebApplicationContext只有当春天的ContextLoaderListener是网络工程.xml,对吧? – GabrielBR

+0

是的,'ContextLoaderListener'应该在'web中定义。xml'或设置为实现'WebApplicationInitializer'的类中的监听器如果您在没有'web.xml的Servlet 3.0环境中运行Spring接口 – dimchez

+0

“..扩展HealthCheck类和实现..”中的链接指的是HealthCheckServlet但应该是http://metrics.dropwizard.io/3.2.1/apidocs/com/codahale/metrics/health/HealthCheck.html –

2

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

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

以下是对其健康检查implementation的参考 - 它使用控制器类返回“ok”,如果有数据源,则尝试运行查询以确认数据库可访问(类似于“SELECT ..从双重“在Oracle语法)。

+0

好点。对于我的具体情况,如果Spring的应用程序上下文已经正确初始化,我喜欢认为我的应用程序处于健康状态。在我的应用程序中可能发生的大多数错误都会导致Spring bean的创建和初始化失败。 – GabrielBR

+1

在Spring框架中让我感到困扰的一件事情是,如果创建一个单独的bean失败,整个事情就会崩溃。我希望有办法实现更具弹性的应用程序上下文... – GabrielBR

1

你可以做最简单的事情是这样的:

@Controller 
class HealthCheckController { 

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

伸缩也测试特定的豆类,数据源等

+0

是的,但是这种方法的问题是只有在应用程序上下文已经正确初始化的情况下才会激活控制器,对不对?当然,结果会是一些HTTP错误代码,但它不会来自我的代码。相反,它可能来自Tomcat。 – GabrielBR

+0

没有问题。如果应用程序上下文未初始化,那么您的应用程序无法正常工作,是吗?在这种情况下,Tomcat将返回404,这是完全合理的,并容易被监视器捕获。如果应用程序上下文已初始化,但运行状况检查控制器发现有些腥意,则还可以返回4XX或5XX代码。如果一切正常,健康检查控制器将返回200或类似。 – Jukka