javascript
Spring Cloud实战小贴士:健康检查
今天在博客的交流區(qū)收到一條不錯的問題,拿出來給大家分享一下。具體問題如下:
因為項目里面用到了redis集群,但并不是用spring boot的配置方式,啟動后項目健康檢查老是檢查redis的時候狀態(tài)為down,導致注冊到eureka后項目狀態(tài)也是down。
問下能不能設置spring boot不檢查 redis的健康狀態(tài)
| "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模塊,所以Spring Boot Actuator會對其進行健康檢查,正常情況下不會出現問題,但是由于采用了其他配置方式,導致redis的連接檢查沒有通過。這樣就會導致了Consul或Eureka的HealthCheck認為該服務是DOWN狀態(tài)。
那么redis的健康檢查是如何實現的呢?我們不妨來看看健康檢查的自動化配置中針對redis的配置源碼:
(RedisConnectionFactory.class) ("redis") public static class RedisHealthIndicatorConfiguration extends CompositeHealthIndicatorConfiguration<RedisHealthIndicator, RedisConnectionFactory> { private Map<String, RedisConnectionFactory> redisConnectionFactories; (name = "redisHealthIndicator") public HealthIndicator redisHealthIndicator() { return createHealthIndicator(this.redisConnectionFactories); } } |
以上內容取自:org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration類。從自動化配置中我們可以看到,會自動加載一個針對redis的HealthIndicator實現,并且該Bean命名為redisHealthIndicator。
解決方法
通過上面的分析,我們已經知道了是哪個Bean導致了服務實例的健康檢查不通過,那么如何解決該問題的方法也就馬上能想到了:我們只需要再實現一個redis的HealthIndicator實現來替代原先默認的檢查邏輯。比如:
public class RedisHealthIndicator implements HealthIndicator { public Health health() { return Health.up().build(); } } |
上面通過實現HealthIndicator接口中的health方法,直接返回了up狀態(tài)。通過@Component注解,讓Spring Boot掃描到該類就能自動的進行加載,并覆蓋原來的redis健康檢查實現。當然,這里的實現并不好,因為它只是為了讓健康檢查可以通過,但是并沒有做真正的健康檢查。如提問者所說,采用了其他配置訪問,那么正確的做法就是在health方法中實現針對其他配置的內容進行健康檢查。
注意:這里隱含了一個實現命名的問題,由于默認的bean名稱會使用redisHealthIndicator,所以這里的定義可以替換默認的實現,因為它的名字與@ConditionalOnMissingBean(name = "redisHealthIndicator")中的命名一致。但是如果您自定義的實現類并非叫RedisHealthIndicator,它的默認名稱與自動化配置的名稱是不匹配的,那么就不會替換,這個時候需要在@Component注解中指定該Bean的名稱為redisHealthIndicator。
總結
以上是生活随笔為你收集整理的Spring Cloud实战小贴士:健康检查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel PAUSE指令变化影响到My
- 下一篇: 阿里P8架构师谈:微服务Dubbo和Sp