Spring Cloud实战小贴士:健康检查

今天在博客的交流区收到一条不错的问题,拿出来给大家分享一下。具体问题如下:

因为项目里面用到了redis集群,但并不是用spring boot的配置方式,启动后项目健康检查老是检查redis的时候状态为down,导致注册到eureka后项目状态也是down。

"redis": { 
    "status": "DOWN", 
    "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool" 
}

问下能不能设置spring boot不检查 redis的健康状态。

问题原帖:http://qa.didispace.com/?/question/7

欢迎大家来此交流

原因分析

如提问者所述,由于在Spring Boot项目中引用了Redis模块,所以Spring Boot Actuator会对其进行健康检查,正常情况下不会出现问题,但是由于采用了其他配置方式,导致redis的连接检查没有通过。这样就会导致了Consul或Eureka的HealthCheck认为该服务是DOWN状态。

那么redis的健康检查是如何实现的呢?我们不妨来看看健康检查的自动化配置中针对redis的配置源码:

@Configuration
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnEnabledHealthIndicator("redis")
public static class RedisHealthIndicatorConfiguration extends
      CompositeHealthIndicatorConfiguration<RedisHealthIndicator, RedisConnectionFactory> {

   @Autowired
   private Map<String, RedisConnectionFactory> redisConnectionFactories;

   @Bean
   @ConditionalOnMissingBean(name = "redisHealthIndicator")
   public HealthIndicator redisHealthIndicator() {
      return createHealthIndicator(this.redisConnectionFactories);
   }

}

以上内容取自:

org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration类。

从自动化配置中我们可以看到,会自动加载一个针对redis的HealthIndicator实现,并且该Bean命名为redisHealthIndicator。

解决方法

通过上面的分析,我们已经知道了是哪个Bean导致了服务实例的健康检查不通过,那么如何解决该问题的方法也就马上能想到了:我们只需要再实现一个redis的`HealthIndicator`实现来替代原先默认的检查逻辑。比如:

@Component
public class RedisHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up().build();
    }
}

上面通过实现`HealthIndicator`接口中的health方法,直接返回了up状态。通过`@Component`注解,让Spring Boot扫描到该类就能自动的进行加载,并覆盖原来的redis健康检查实现。当然,这里的实现并不好,因为它只是为了让健康检查可以通过,但是并没有做真正的健康检查。如提问者所说,采用了其他配置访问,那么正确的做法就是在`health`方法中实现针对其他配置的内容进行健康检查。

注意:这里隐含了一个实现命名的问题,由于默认的bean名称会使用`redisHealthIndicator`,所以这里的定义可以替换默认的实现,因为它的名字与`@ConditionalOnMissingBean(name = "redisHealthIndicator")`中的命名一致。但是如果您自定义的实现类并非叫`RedisHealthIndicator`,它的默认名称与自动化配置的名称是不匹配的,那么就不会替换,这个时候需要在`@Component`注解中指定该Bean的名称为`redisHealthIndicator`。

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2017-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张伟博客

jenkins执行shell启动tomcat失败

集成Jenkins+manven,构建持续部署。构建完毕,Jenkins会执行服务器某个目录下的Shell,

5282
来自专栏noteless

spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。

1576
来自专栏Android相关

Gradle For Android(8)--建立持续集成

Continuous Integration(CI)持续集成可以在团队中每天构建非常多次。每一次自动构建都可以验证最新Push到主仓库的提交。这种方式可以帮助我...

1683
来自专栏闻道于事

使用Spring Initializr创建项目

Spring initializr 是Spring 官方提供的一个很好的工具,可以用来用来创建一个Spring boot 的项目。可以选择使用Maven管理或者...

4235
来自专栏代码拾遗

Spring Cloud 教程 - Eureka Client

服务发现是微服务架构的一个关键原则。手动配置每一个客户端不仅非常复杂,同时也容易出错。Netflix 提供了Erueka作为服务发现的服务端和客户端。Sreve...

3043
来自专栏散尽浮华

Centos7下部署两套python版本并存环境的操作记录

需求说明: centos7.2系统的开发机器上已经自带了python2.7版本,但是开发的项目中用的是python3.5版本,为了保证Centos系统的正常运行...

2936
来自专栏加米谷大数据

Flume的高可靠,高性能和高扩展性

Flume 是Apache旗下的一款开源、高可靠、高扩展、容易管理、支持客户扩展的数据采集系统。 Flume使用JRuby来构建,所以依赖Java运行环境。

1042
来自专栏Danny的专栏

【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1593
来自专栏Flutter入门到实战

优化Android Studio/Gradle构建

    经过测试,编译速度有很大提升,比较大的项目从之前的5-8分钟可以减少到1-2分钟。

1571
来自专栏Java技术栈

Spring Boot功能实战

添加web功能启动器 添加了Spring Boot基础依赖后,如要使用web mvc功能,只需要添加如下启动器即可,Spring Boot会自动装配web功能。...

36411

扫码关注云+社区

领取腾讯云代金券