2014-01-29 73 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