問題
spring cloud gateway
集成了redis
後,一直出現重連的日誌,如下:
gateway | 2020-06-28 10:56:11.133 INFO 1 --- [xecutorLoop-2-2] i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was 192.171.0.9/192.171.0.9:6379
gateway | 2020-06-28 10:56:11.148 INFO 1 --- [llEventLoop-4-6] i.l.core.protocol.ReconnectionHandler : Reconnected to 192.171.0.9:6379
gateway | 2020-06-28 11:01:12.431 INFO 1 --- [xecutorLoop-2-3] i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was 192.171.0.9/192.171.0.9:6379
gateway | 2020-06-28 11:01:12.441 INFO 1 --- [llEventLoop-4-8] i.l.core.protocol.ReconnectionHandler : Reconnected to 192.171.0.9:6379
gateway | 2020-06-28 11:06:13.231 INFO 1 --- [xecutorLoop-2-4] i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was 192.171.0.9/192.171.0.9:6379
gateway | 2020-06-28 11:06:13.237 INFO 1 --- [llEventLoop-4-2] i.l.core.protocol.ReconnectionHandler : Reconnected to 192.171.0.9:6379
分析
spring boot 2.0
之後spring-boot-starter-data-redis
默認不再使用jedis
連接redis
,而是lettuce
.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 排除lettuce包,使用jedis代替-->
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>io.lettuce</groupId>-->
<!--<artifactId>lettuce-core</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<!-- jedis -->
<!--<dependency>-->
<!--<groupId>redis.clients</groupId>-->
<!--<artifactId>jedis</artifactId>-->
<!--<version>2.9.0</version>-->
<!--</dependency>-->
考慮是不是程序長時間沒有使用redis
,而導致連接斷開.修改連接池最小空閒連接數:
spring.redis.host=localhost
spring.redis.password=
# 連接超時時間(毫秒)
spring.redis.timeout=10000
# Redis默認情況下有16個分片,這裏配置具體使用的分片,默認是0
spring.redis.database=0
# 連接池最大連接數(使用負值表示沒有限制) 默認 8
spring.redis.lettuce.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
spring.redis.lettuce.pool.max-wait=-1
# 連接池中的最大空閒連接 默認 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閒連接 默認 0, 修改爲1
spring.redis.lettuce.pool.min-idle=1
注意修改完之後需要增加新的依賴包,不然會報錯
<!--配置lettuce.pool.min-idle需要增加的依賴-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
重啓完程序之後,發現每5分鐘打印重連日誌依然存在.
解決
- 這個不是錯誤,只是一個
INFO
級別的日誌,可以日誌級別調高,例如:
<logger name="io.lettuce.core.protocol" level="ERROR">
<appender-ref ref="ERROR_FILE" />
</logger>
- 原因:這是
lettuce-core
的實現裏,有類似心跳機制的保持長連接方式,不過心跳機制是不停的來回發心跳包直到連接不可用再去被動重新連接,而lettuce
的方案是將連接池裏處於空閒(idle
)狀態的client
每隔一段時間就主動斷開,然後再重新連接。