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该字段不支持动态更新导致。

总结

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

相关文章

  • JavaWeb搭建网上图书商城毕业设计

    JavaWeb搭建网上图书商城毕业设计

    这篇文章主要介绍了JavaWeb搭建网上图书商城框架,特别适合正在为网上商城毕业设计烦恼的同学,需要的朋友可以参考下
    2015-11-11
  • Spring boot2.0 实现日志集成的方法(2)

    Spring boot2.0 实现日志集成的方法(2)

    这篇文章主要介绍了Spring boot2.0 实现日志集成的方法,上一章讲解了spring boot日志简单集成,这篇我们将日志进行分类,常规日志、异常日志、监控日志等,需要将日志输出到不同的文件,具体内容需要的小伙伴可以参考一下
    2022-04-04
  • java面向对象设计原则之合成复用原则示例详解

    java面向对象设计原则之合成复用原则示例详解

    这篇文章主要介绍了java面向对象设计原则之合成复用原则的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-10-10
  • Java NIO实现聊天系统

    Java NIO实现聊天系统

    这篇文章主要为大家详细介绍了Java NIO实现聊天系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java使用访问者模式解决公司层级结构图问题详解

    Java使用访问者模式解决公司层级结构图问题详解

    这篇文章主要介绍了Java使用访问者模式解决公司层级结构图问题,结合实例形式分析了访问者模式的概念、原理及Java使用访问者模式解决公司曾经结构图问题的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • 详解Java中native方法的使用

    详解Java中native方法的使用

    native是与C++联合开发的时候用的!使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。本文给大家介绍java 中native方法使用,感兴趣的朋友一起看看吧
    2020-09-09
  • SpringBoot调整ApplicationContextAware如何实现类加载顺序

    SpringBoot调整ApplicationContextAware如何实现类加载顺序

    SpringBoot调整ApplicationContextAware实现类加载顺序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • SSH框架的常见问题和解决方法

    SSH框架的常见问题和解决方法

    SSH框架的常见问题和解决方法,需要的朋友可以参考一下
    2013-02-02
  • java控制台实现可视化日历小程序

    java控制台实现可视化日历小程序

    这篇文章主要为大家详细介绍了java控制台实现可视化日历小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • IDEA标签tabs多行显示的设置

    IDEA标签tabs多行显示的设置

    这篇文章主要介绍了IDEA标签tabs多行显示的设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论