使用Spring Boot Actuator进行健康检查
这次试试对Spring Boot进行健康检查。
通过使用spring-boot-actuator,可以轻松实现健康检查。
添加依赖关系
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.M5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
健康检查处理目标
只需添加依赖关系,就能通过HealthIndicatorAutoConfiguration自动执行健康检查。目前,spring-boot-actuator-1.3.0.M5仅支持这种健康检查。
向一个端点发送请求将执行所有的健康检查。
因此,可以判断整个系统是否正在运行。
使用的方式
当向/health发送请求时,将以JSON格式返回健康检查结果。
请将以下内容用中文进行本地化改写,只需提供一种选项:
$ curl localhost:8080/health
请用 curl 命令请求本地主机 8080 端口的 /health 路径。
{
"status":"DOWN",
"redis":{
"status":"UP",
"redisDataWriter" {"status":"UP","version":"2.8.21"},
"redisDataReader":{"status":"UP","version":"2.8.21"}},
"elasticsearch":{
"status":"DOWN",
"clusterName":"elaseticsearch_sample",
"numberOfNodes":1,
"numberOfDataNodes":1,
"activePrimaryShards":7,
"activeShards":7,
"relocatingShards":0,
"initializingShards":0,
"unassignedShards":1},
"db":{
"status":"UP",
"database":"Oracle","hello":1}
}
這個結果中已經對Redis、Elasticsearch和資料庫進行了健康檢查。
由於Elasticsearch的健康檢查失敗,所以被標記為DOWN。
預設情況下,只要有一個DOWN狀態存在,整體狀態就會被標記為DOWN。
因此,第一個元素的狀態被標記為DOWN。
當在負載均衡器等機制上進行健康檢查時,將參考第一個元素的狀態來進行判斷。
健康检查设置
可以通过管理健康(management.health)属性来限定执行健康检查的对象。
默认情况下,将根据“健康检查处理对象”中指定的条件进行健康检查,
但是可以通过设置属性来排除健康检查对象。
management:
health:
diskspace:
enabled: false
在这个设定中,已将磁盘空闲空间的健康检查禁用。
添加健康检查处理
通过自己创建健康指示器,可以添加健康检查功能。如果在此处配置了stopFile,则添加一个强制将状态设为DOWN的健康检查指示器。
public class StopFileHealthIndicator extends AbstractHealthIndicator {
private final File stopFile;
public StopFileHealthIndicator(String filePath) {
this.stopFile = new File(filePath);
}
@Override
protected void doHealthCheck(Builder builder) throws Exception {
if (stopFile.exists()) {
builder.down().withDetail("stop-file-found", stopFile.getAbsolutePath());
} else {
builder.up().withDetail("stop-file-not-found", stopFile.getAbsolutePath());
}
}
}
将其注册为Spring的Bean。
在这里,我们同样使用属性来判断其是否可用,就像其他HealthIndicator一样。
@Bean
@ConditionalOnProperty(prefix = "management.health.stopfile", name = "enabled",
matchIfMissing = true)
public HealthIndicator stopFileHealthIndicator() {
return new StopFileHealthIndicator("./stop-file");
}
就这样。
请求终端点后能够看到已添加健康检查。
请用中文进行本地化转述:请访问本地主机的8080端口,获取健康状态。
{
"status":"DOWN",
"redis":{
"status":"UP",
"redisDataWriter" {"status":"UP","version":"2.8.21"},
"redisDataReader":{"status":"UP","version":"2.8.21"}},
"elasticsearch":{
"status":"DOWN",
"clusterName":"elaseticsearch_sample",
"numberOfNodes":1,
"numberOfDataNodes":1,
"activePrimaryShards":7,
"activeShards":7,
"relocatingShards":0,
"initializingShards":0,
"unassignedShards":1},
"stopFile":{
"status":"UP",
"stop-file-not-found":"./stopfile"}
"db":{
"status":"UP",
"database":"Oracle","hello":1}
}