如何正确实现Grails的负载均衡器健康检查

时间:2016-06-07 15:50:06

标签: grails load-balancing

我正在使用部署到Amazon AWS的Grails 2应用程序,该应用程序使用软件负载均衡器(ELB)。我们遇到的问题是,在应用程序完全初始化之前,grails应用程序实例会添加到负载均衡器中。这是resources插件,专门用于提供javascript,css,图像等静态资源。

负载均衡器向“运行状况检查”URL发出http请求。 GET '/myapp/lbcheck'

LoadBalancerController.groovy:

package myapp

class LoadBalancerController {

    def healthService

    def healthcheck() {
        response.contentType = 'text/plain'
        try {
            healthService.checkDatabase()
            render(status: 200, text: "Up")
        }
        catch(Exception ex) {
            log.error("Error with database healthcheck " + ex)
            render(status: 503, text: "Down")
        }
    }
}

HealthSerivce.groovy

package myapp

import groovy.sql.Sql

class HealthService {

    def dataSource

    // Either returns true, or throws an Exception
    def checkDatabase() {
        Sql sql = new Sql(dataSource)
        sql.rows("SELECT 429")
        sql.close()
        return true
    }
}

SQL查询显然是不够的。看起来我们需要在框架中检查一些其他类型的属性以确定它已被初始化。

1 个答案:

答案 0 :(得分:0)

您可以尝试将healthService bean中的字段设置为BootStrap.groovy内的true。我认为这是在Grails完全初始化之后运行的。

package myapp

import groovy.sql.Sql

class HealthService {

    def dataSource

    def initializationComplete = false

    // Either returns true, or throws an Exception
    def checkDatabase() {
        Sql sql = new Sql(dataSource)
        sql.rows("SELECT 429")
        sql.close()
        return true
    }
}

BootStrap.groovy内:

class BootStrap {
    def healthService

    def init = { servletContext ->
        healthService.initializationComplete = true
    }

}

LoadBalancerController.groovy

def healthcheck() {
    response.contentType = 'text/plain'
    def healthy = false
    try {
        healthy = healthService.with { 
            initializationComplete && checkDatabase()
        }
    }
    catch(Exception ex) {
        log.error("Error with database healthcheck " + ex)
    }

    if (healthy) {
        render(status: 200, text: "Up")
    } else {
        render(status: 503, text: "Down")
    }
}