全部产品
云市场

引入健康检查

更新时间:2019-11-05 15:51:17

SOFABoot 在 Spring Boot 健康检查(HealthCheck)的基础上增加了 Readiness Check 功能。如果工程中使用了 SOFA 中间件,建议使用 SOFABoot 的健康检查功能,来更优雅地上线应用实例。本文具体介绍如何引入健康检查功能。

由于应用的健康检查结果会通过 Web 页面输出,因此,Core 工程在引入此功能后会转为 Web 工程,并包含很多 Spring Boot 内置的端点(Endpoint)。具体端点暴露方式见 Spring 官方文档(英文)

使用说明

  • 健康检查能力需要结合技术栈和发布部署平台一起使用,SOFABoot 技术栈是默认的最新版本。有关技术栈的更多信息请参考 中间件技术栈介绍
  • 在 SOFAStack 上,您可以根据不同的工作空间创建不同名称的配置文件,如 application-dev.propertiesapplication-sit.properties 等.
  • 当使用健康检查和技术栈 1.0.3 时,您必须创建一个 application.properties 文件。您可以在 application.properties 文件中配置不随工作空间发生改变的全局属性。如果不需要配置这些全局属性,也必须创建一个空的 application.properties,以便健康检查顺利执行。
  • application.properties 配置文件中不能有中文或者其他编码的注释,否则可能因无法解析而导致超时失败。
  • 健康检查默认超时时间是 90 秒,应用启动如果超过 90 秒,会引起健康检查超时导致发布部署失败。建议您尽量优化应用启动时间,将耗时较大的应用初始化代码移到应用启动完成后或者健康检查之后。

    说明:如果在发布部署过程中,发现健康检查失败,可能的原因是应用没有在 90 秒之内完成启动,此时的临时解决方案是在检查服务那一步点击 重试,如果应用在健康检查重试过程中启动成功,健康检查也会通过。

引入健康检查扩展

说明:如果不引入 SOFABoot 的健康检查功能,您依然可以直接依赖 HealthIndicator 接口进行原生的 Spring Boot Actuator 的 Liveness Check。

要引入 SOFABoot 的健康检查功能,在主 pom.xml 文件中引入以下 starter:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>healthcheck-sofa-boot-starter</artifactId>
  4. </dependency>

如需在 Core 工程中引入此功能,需要删除禁止 Web 容器启动的 springApplication.setWebEnvironment(false) 设置。默认情况下,此参数定义在 main 函数中,如下所示:

  1. SpringApplication springApplication = new SpringApplication(SOFABootSpringBootApplication.class);
  2. // 以下代码将导致 Web 容器无法启动,请删除
  3. // springApplication.setWebEnvironment(false);

查看健康检查结果

加入健康检查扩展之后,在浏览器中访问 http://localhost:8080/actuator/readiness 以查看 Readiness Check 的结果。

除了通过 URL 来查看健康检查的结果之外,在 SOFABoot 中,还可以通过查看具体的日志来确定健康检查的结果,日志的目录位于 health-check 目录下,日志的内容大概如下:

  1. 2018-04-06 23:29:50,240 INFO main - Readiness check result: success

目前, SOFA 中间件已经通过 SOFABoot 的 Readiness Check 的能力来控制了上游流量的进入,但是一个应用的流量可能并不是全部都是从中间件进入的,比较常见的还有从负载均衡器进入的,为了控制从负载均衡器进入的流量,建议您通过 PaaS 来访问 Readiness Check 的结果,根据结果来控制是否要在负载均衡器中上线对应的节点。

如果健康检查失败,您会在 发布部署 平台收到报错信息,可以对照相应的报错信息进行分析排错。另外,日志中会有如下记录:

  1. 2018-05-25 19:04:02,130 ERROR main - HealthIndicator (class {Package_Name}.{Class_Name})check fail. And the status is[DOWN]; the detail is: {}
  2. 2018-05-25 19:04:02,131 ERROR main - Readiness check HealthIndicator result: fail.
  3. 2018-05-25 19:04:02,131 ERROR main - first phase of the readiness check result: fail
  4. 2018-05-25 19:04:02,131 ERROR main - Readiness check result: fail

SOFABoot 支持对中间件各组件的健康检查功能。详情见各组件的健康检查

扩展 Readiness Check 能力

在 Readiness Check 的各个阶段,SOFABoot 都提供了扩展的能力,应用可以根据实际需要进行扩展。目前可供扩展的接口如下:

回调接口 说明
org.springframework.context.ApplicationListener 如果想要在 Readiness Check 之前做一些事情,那么监听这个 Listener 的 SofaBootBeforeReadinessCheckEvent 事件。
org.springframework.boot.actuate.health.HealthIndicator 如果想要在 SOFABoot 的 Readiness Check 里面增加一个检查项,那么可以直接扩展 Spring Boot 的这个接口。
com.alipay.sofa.healthcheck.startup.SofaBootAfterReadinessCheckCallback 如果想要在 Readiness Check 之后做一些事情,那么可以扩展 SOFABoot 的这个接口。

定制 Readiness Check 配置项

在引入 SOFABoot 的健康检查扩展之后,可以在 Spring Boot 的配置文件 application.properties 中添加相关配置项来定制 Readiness Check 的相关行为。

Readiness Check 配置项 说明 默认值
com.alipay.sofa.healthcheck.skip.all 是否跳过整个 Readiness Check 阶段 false
com.alipay.sofa.healthcheck.skip.component 是否跳过 SOFA 中间件的 Readiness Check 阶段 false
com.alipay.sofa.healthcheck.skip.indicator 是否跳过 HealthIndicator 的 Readiness Check 阶段 false