繁体   English   中英

Spring Web 应用程序健康检查

[英]Spring web application healthchecks

我正在 Amazon 的 Beanstalk 平台上部署基于 Spring 的 Web 应用程序,他们为我提供了为我的应用程序设置“健康检查”URL 路径的选项。

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

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

有没有人尝试过这样的事情? 出于类似的目的?

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

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

如果您使用的是 Java Spring 配置,您可能有一个像这样的 Metrics 配置, MetricsConfigurerAdapter从 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);
    }
}

您应该考虑什么对您来说是健康的应用程序(例如,servlet 层?JMS 队列?FTP 服务器?等)并让您的健康检查验证这些服务的可用性。 显然,健康检查将频繁运行,因此您不想一遍又一遍地启动昂贵的操作。

Spring Boot是一个新项目,旨在通过支持约定而不是配置来简化 Spring 开发。 他们实现了“健康检查”功能,您可以通过 Actuator 插件模块将其添加到项目

这是对他们的 Health Check 实现的引用——它使用控制器类返回“ok”,如果有数据源,则尝试运行查询以确认数据库可访问(类似于“SELECT .. from dual " 在 Oracle 语法中)。

您可以做的最简单的事情是:

@Controller
class HealthCheckController {

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

还可以扩展以测试特定的 bean、数据源等。

Swagger是添加健康检查的最快等待时间。 非常简单,并且允许您验证其他接口。 只需添加以下依赖项,然后添加SwaggerConfig即可

<!-- swagger dependencies -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.0</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.0</version>
    <scope>compile</scope>
</dependency>

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

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

您可以通过点击以下 URL 来检查服务。

本地主机:服务器端口/执行器/健康

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM