nacos修改druid配置自动刷新后服务异常的问题

 更新时间:2025年06月09日 09:05:11   作者:y&m  
这篇文章主要介绍了nacos修改druid配置自动刷新后服务异常的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

某天Springboot Admin监控告警,detail显示微服务A offline,经排查发现此时服务处于假死状态,推断由于数据库连接池maxThreads配置过小导致高并发场景下服务无法响应外部请求。

解决方案

nacos 公共配置添加

druid 连接池配置

spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.max-active=100
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-wait=10000
spring.datasource.druid.min-idle=5

配置添加完后,我们重启了被告警的服务,但由于配置改在公共配置上,且公共配置开启了自动刷新功能,接着其他微服务也出现了异常。

排查过程

1)应急方案:由于配置直接改在了生产环境,为了保障线上的正常响应,我们首先回退该配置,因为此时服务状态已正常,故而暂不进行线程池配置的优化;

2)问题排查:

以上是部分告警内容(敏感信息已剔除)。

通过告警内容可见,服务异常原因是因为无法正确加载数据源相关配置导致。

接着,我们再去查看服务器日志信息。

通过服务器日志可见,由于nacos公共配置refresh属性设置为true,因此nacos客户端会基于长连接定时同步服务端配置。接下来我们从NacosContextRefresher源码开始分析。

我们发现NacosContextRefresher对象中registerNacosListener方法,方法如下:

该方法其实就是基于消息总线机制,创建一个监听器,放入注册服务,如果有刷新了,就会调用innerReceive方法,进行刷新历史的添加和刷新事件的通知,也就是你自己可以接受到这个事件后做点扩展。

接下来我们继续debug nacos源码。

我们发现断点走过listener之后直接进入了CacheData的异常捕获之中,通过点击异常发现确实是druid连接池报错。

异常信息如下图。

图片很清晰的表明是由于druid中 initial-size无法设置导致nacos重载失败并抛出异常。

接下来我们查看druid源码,发现该字段初始化方法有对init状态的判断,若init为true,则方法抛出异常,该异常也即nacos CacheData中捕获的异常。

我们继续查看源码,发现该字段为容器初始化加载组件完成后即设置完成,该字段无法动态修改。

至此,该异常原因链路完整,出现此异常就是因为druid扩展参数中initial-size该字段不支持动态更新导致。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现抖音飞机大作战

    java实现抖音飞机大作战

    这篇文章主要为大家详细介绍了java实现抖音飞机大作战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Java实现获取前、后N天日期的函数分享

    Java实现获取前、后N天日期的函数分享

    本文给大家分享的是使用java实现的获取当前日期前后N天的函数,非常的简单实用,有需要的小伙伴可以参考下。
    2015-03-03
  • java并发编程专题(三)----详解线程的同步

    java并发编程专题(三)----详解线程的同步

    这篇文章主要介绍了JAVA并发编程 线程同步的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Mybatis-plus配置之日期时间自动填充实践

    Mybatis-plus配置之日期时间自动填充实践

    本文介绍如何使用MyBatis-Plus的MetaObjectHandler接口实现新增和更新时间的自动填充,通过继承抽象类、添加注解及处理版本兼容性,简化开发流程并减少手动操作
    2025-08-08
  • 关于Java中增强for循环使用的注意事项

    关于Java中增强for循环使用的注意事项

    for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用,这篇文章主要给大家介绍了关于Java中增强for循环使用的注意事项,需要的朋友可以参考下
    2021-06-06
  • MyBatis字段名和属性名不一致的解决方法

    MyBatis字段名和属性名不一致的解决方法

    本文主要介绍了MyBatis字段名和属性名不一致的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Spring Cloud Gateway实现零拷贝参数校验的完整指南

    Spring Cloud Gateway实现零拷贝参数校验的完整指南

    本文将深入探讨在 Spring Cloud Gateway 中实现零拷贝参数校验的完整方案,从问题背景、设计思路到具体实现,提供可落地的实践指导,需要的朋友可以参考下
    2026-04-04
  • 关于Mysql的四种存储引擎

    关于Mysql的四种存储引擎

    这篇文章主要介绍了关于Mysql的四种存储引擎,MySql的核心就是存储引擎,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能,需要的朋友可以参考下
    2023-05-05
  • 详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式,一键重写

    详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式,一键重写

    这篇文章主要介绍了java建造者模式一键重写,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java实现调用http请求的五种常见方式

    java实现调用http请求的五种常见方式

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,本文主要介绍了java实现调用http请求的四种常见方式,感兴趣的可以了解一下
    2024-07-07

最新评论