有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
Health是健康的意思,该端点用来检查正在运行的应用程序的状态。当生产系统出现故障时,可以自动告警。在之前我们访问只返回了如下信息:

这里只是显示了一个UP,接下来我们如何了解下,如何返回更多的健康状态信息。
想要health返回更多的信息,需要修改以下配置:
management:
endpoint:
# Health 端点配置
health:
# 显示详情,默认never
show-details: always
# 所有组件的详细信息,默认never
show-components: always
以上配置值是枚举类型,可配置的属性如下:
never:永远不会显示详细信息。
when-authorized:详细信息仅向授权用户显示,可以使用management.endpoint.health.roles.配置授权角色
always:详细信息显示给所有用户。
配置为always后,可以看到多了几个类别的健康信息,分别为数据库、磁盘空间、网络:

在上面的演示中,是因为配置了数据库连接DataSource,Spring Boot通过自动配置启用数据库的监控并显示信息。
HealthIndicator接口是健康指标的顶级接口,其每个实现类都表示一个具体类型的健康指标。比如数据源就是DataSourceHealthIndicator,可以看到其检查方法就是通过JdbcTemplate去执行了一个检测查询。

在自动配置中注入了DataSourceHealthIndicator开启这个组件的监控功能:

注意:spring-boot-actuator自动配置模块是独立的:

健康指标是Spring Boot在适当时自动配置的,也就是引入了某个功能,相应组件的检测功能就会自动启用。
可以通过配置management.health.key.enabled属性启用/禁用选定的指标,默认存在的key如下表所示:
| key | 名称 | 描述 |
|---|---|---|
| cassandra | CassandraDriverHealthIndicator | 检查 Cassandra 数据库是否已启动。 |
| couchbase | CouchbaseHealthIndicator | 检查 Couchbase 集群是否已启动。 |
| db | DataSourceHealthIndicator | 检查是否可以获得连接DataSource。 |
| diskspace | DiskSpaceHealthIndicator | 检查磁盘空间不足。 |
| elasticsearch | ElasticsearchRestHealthIndicator | 检查 Elasticsearch 集群是否已启动。 |
| hazelcast | HazelcastHealthIndicator | 检查 Hazelcast 服务器是否已启动。 |
| influxdb | InfluxDbHealthIndicator | 检查 InfluxDB 服务器是否已启动。 |
| jms | JmsHealthIndicator | 检查 JMS 代理是否已启动。 |
| ldap | LdapHealthIndicator | 检查 LDAP 服务器是否已启动。 |
| MailHealthIndicator | 检查邮件服务器是否已启动。 | |
| mongo | MongoHealthIndicator | 检查 Mongo 数据库是否已启动。 |
| neo4j | Neo4jHealthIndicator | 检查 Neo4j 数据库是否已启动。 |
| ping | PingHealthIndicator | 始终以 响应UP。 |
| rabbit | RabbitHealthIndicator | 检查 Rabbit 服务器是否已启动。 |
| redis | RedisHealthIndicator | 检查 Redis 服务器是否已启动。 |
| solr | SolrHealthIndicator | 检查 Solr 服务器是否已启动。 |
其他可用但默认情况下未启用的Key :
| key | 名称 | 描述 |
|---|---|---|
| livenessstate | LivenessStateHealthIndicator | 公开“Liveness”应用程序可用性状态。 |
| readinessstate | ReadinessStateHealthIndicator | 公开“就绪”应用程序可用性状态。 |
接下来我们将应用程序集成Redis ,看下关于Redis 的健康信息。
spring boot 项目添加Redis依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
添加连接配置:
spring:
application:
name: spring-boot-actuator-demo
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 20000
jedis:
pool:
max-active: 8
min-idle: 0
max-idle: 8
max-wait: -1
访问health端点,查看Redis健康信息:

实现HealthIndicator接口,并注册为Spring bean,即可实现自定义健康指标。
演示需求:检测某个远程服务器网络健康状态。
实现HealthIndicator接口的health() 方法,检查网络状态,通则返回UP,不通返回DOWN:
@Component
public class MyHealthIndicator implements HealthIndicator {
@SneakyThrows
@Override
public Health health() {
// 查看某个IP是否在线
boolean status = InetAddress.getByName("127.0.0.1").isReachable(3000);
if (status) {
// 在线,返回UP状态
return Health.up().status(Status.UP).withDetail("自定义详情", "啊哈~ 在线中...").build();
}
// 不在线,返回DOWN状态
return Health.down().status(Status.DOWN).withDetail("自定义详情", "我屮艸芔茻~~~ 对方掉线了").build();
}
}
查看健康信息:

这里为啥使用my去获取信息呢?这是因为Spring Boot使用Bean 的名称作为组件的信息访问Key ,如果存在HealthIndicator后缀,还会自动去掉该后缀,上述案例中的Bean 名称为myHealthIndicator ,所以就是my了。
health()方法中返回的Health是采用的构建者模式进行创建的,withDetail用于构建详情信息,status表示健康状态。
下表显示了内置状态的返回状态码映射关系:
| 选项 | 说明 |
|---|---|
| DOWN | SERVICE_UNAVAILABLE( 503) |
| OUT_OF_SERVICE | SERVICE_UNAVAILABLE( 503) |
| UP | 默认没有映射,所以 HTTP 状态是 200 |
| UNKNOWN | 默认没有映射,所以 HTTP 状态是 200 |
还可以自定义配置状态码:
management:
endpoint:
# Health 端点配置
health:
# 显示详情,默认never
show-details: always
# 所有组件的详细信息,默认never
show-components: always
# 配置状态码
status:
http-mapping:
down: 500
fatal: 100