目录
版本
springboot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
druid版本
起初使用druid1.2.22版本因为idea无配置提示后来升级至1.2.24
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.24<version>
</dependency>
Lettuce版本
springboot 2.7.18自带版本
问题排查
问题来源
当系统运行一段时间不调任何接口,再次发起请求时接口直接挂掉了,并且很长才能恢复,于是就开始各种找资料,后来看到有一个帖子也有类似问题并且使用链路追踪查看接口调用链分析,所以便想着也开搞吧,,毕竟半天定位不到是哪里的问题,最后发现时由于Lettuce和druid连接超时引起的。
使用skywalking
具体步骤请查看 skywalking,我是直接监控的gateway(在网关做了统一鉴权),所以探针包还需要加上 gateway配置,子服务启动也要加上探针
于是便有了下面这张接口调用结果
正常响应结果
先鉴权再执行接口
无论是lettuce,还是druid获取连接时间都正常
异常结果
一段时间未发起任何数据库请求后
我们可以看到这个Lettuce从连接池获取时间花了10004ms ,直接卡在这里了,也没有执行下一步路由。
我的redis配置如下
官网说法
最后看了好多帖子 还是没找到最有效的方法 还是参考这个吧 Lettuce连接超时问题
解决方案
Lettuce最终超时解决方案
@Configuration
@Slf4j
@EnableScheduling
public class RedisScheduleTask {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 测试redis是否正常 每分钟执行一次
*/
@Scheduled(fixedRate = 60*1000)
private void configureTasks() {
redisTemplate.execute(new RedisCallback<String>() {
@Override
public String doInRedis(@NotNull RedisConnection connection) throws DataAccessException {
return connection.ping();
}
});
}
}
修改配置之后未再次发现连接超时情况
接着是druid连接超时问题
我们可以看到druid获取连接花了 57637ms ,又裂开了哈哈
druid连接超时解决方案
加上这几个配置即可解决
官方配置参考 DruidDataSource配置属性列表