我正在亚马逊的Beanstalk平台上部署基于Spring的Web应用程序,他们可以选择为我的应用程序设置“健康检查”URL路径。
我们的想法是,在部署之后,他们的平台将针对该URL执行请求,以查看应用程序是否已成功启动。因此,如果请求导致HTTP 200,则应用程序可能正常。但是如果它导致HTTP 500或其他东西,平台就会知道应用程序存在问题。
所以,我希望我可以开发某种类型的servlet来检查Spring Application Context是否成功初始化,以便为平台提供适当的HTTP响应代码。
有人试过这样的事吗?出于类似的目的?
我想知道Spring是否已经为此提供了一些优雅的解决方案。
答案 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