序
本文主要研究一下redis的HealthIndicator
RedisHealthIndicator
spring-boot-actuator-2.0.4.RELEASE-sources.jar!/org/springframework/boot/actuate/redis/RedisHealthIndicator.java
public class RedisHealthIndicator extends AbstractHealthIndicator {
static final String VERSION = "version";
static final String REDIS_VERSION = "redis_version";
private final RedisConnectionFactory redisConnectionFactory;
public RedisHealthIndicator(RedisConnectionFactory connectionFactory) {
super("Redis health check failed");
Assert.notNull(connectionFactory, "ConnectionFactory must not be null");
this.redisConnectionFactory = connectionFactory;
}
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
RedisConnection connection = RedisConnectionUtils
.getConnection(this.redisConnectionFactory);
try {
if (connection instanceof RedisClusterConnection) {
ClusterInfo clusterInfo = ((RedisClusterConnection) connection)
.clusterGetClusterInfo();
builder.up().withDetail("cluster_size", clusterInfo.getClusterSize())
.withDetail("slots_up", clusterInfo.getSlotsOk())
.withDetail("slots_fail", clusterInfo.getSlotsFail());
}
else {
Properties info = connection.info();
builder.up().withDetail(VERSION, info.getProperty(REDIS_VERSION));
}
}
finally {
RedisConnectionUtils.releaseConnection(connection,
this.redisConnectionFactory);
}
}
}
- 这里判断是否是cluster,如果是则调用clusterGetClusterInfo,否则调用info方法
RedisReactiveHealthIndicator
spring-boot-actuator-2.0.4.RELEASE-sources.jar!/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicator.java
public class RedisReactiveHealthIndicator extends AbstractReactiveHealthIndicator {
private final ReactiveRedisConnectionFactory connectionFactory;
public RedisReactiveHealthIndicator(
ReactiveRedisConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
@Override
protected Mono<Health> doHealthCheck(Health.Builder builder) {
ReactiveRedisConnection connection = this.connectionFactory
.getReactiveConnection();
return connection.serverCommands().info().map((info) -> up(builder, info))
.doFinally((signal) -> connection.close());
}
private Health up(Health.Builder builder, Properties info) {
return builder.up().withDetail(RedisHealthIndicator.VERSION,
info.getProperty(RedisHealthIndicator.REDIS_VERSION)).build();
}
}
- 采用lettuce的话,启用的是RedisReactiveHealthIndicator,这里调用info方法,不过这个方法返回的属性有点多,大约有83个
小结
redis的HealthIndicator分为RedisHealthIndicator以及RedisReactiveHealthIndicator。如果底层client采用的是lettuce,则使用的是reactive版本。其health检测方法,就是调用info命令。
doc
来源:oschina
链接:https://my.oschina.net/u/2922256/blog/2046393