nacos修改druid配置自動(dòng)刷新后服務(wù)異常的問題
背景
某天Springboot Admin監(jiān)控告警,detail顯示微服務(wù)A offline,經(jīng)排查發(fā)現(xiàn)此時(shí)服務(wù)處于假死狀態(tài),推斷由于數(shù)據(jù)庫(kù)連接池maxThreads配置過小導(dǎo)致高并發(fā)場(chǎng)景下服務(wù)無法響應(yīng)外部請(qǐng)求。
解決方案
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
配置添加完后,我們重啟了被告警的服務(wù),但由于配置改在公共配置上,且公共配置開啟了自動(dòng)刷新功能,接著其他微服務(wù)也出現(xiàn)了異常。
排查過程
1)應(yīng)急方案:由于配置直接改在了生產(chǎn)環(huán)境,為了保障線上的正常響應(yīng),我們首先回退該配置,因?yàn)榇藭r(shí)服務(wù)狀態(tài)已正常,故而暫不進(jìn)行線程池配置的優(yōu)化;
2)問題排查:

以上是部分告警內(nèi)容(敏感信息已剔除)。
通過告警內(nèi)容可見,服務(wù)異常原因是因?yàn)闊o法正確加載數(shù)據(jù)源相關(guān)配置導(dǎo)致。
接著,我們?cè)偃ゲ榭捶?wù)器日志信息。

通過服務(wù)器日志可見,由于nacos公共配置refresh屬性設(shè)置為true,因此nacos客戶端會(huì)基于長(zhǎng)連接定時(shí)同步服務(wù)端配置。接下來我們從NacosContextRefresher源碼開始分析。
我們發(fā)現(xiàn)NacosContextRefresher對(duì)象中registerNacosListener方法,方法如下:

該方法其實(shí)就是基于消息總線機(jī)制,創(chuàng)建一個(gè)監(jiān)聽器,放入注冊(cè)服務(wù),如果有刷新了,就會(huì)調(diào)用innerReceive方法,進(jìn)行刷新歷史的添加和刷新事件的通知,也就是你自己可以接受到這個(gè)事件后做點(diǎn)擴(kuò)展。
接下來我們繼續(xù)debug nacos源碼。

我們發(fā)現(xiàn)斷點(diǎn)走過listener之后直接進(jìn)入了CacheData的異常捕獲之中,通過點(diǎn)擊異常發(fā)現(xiàn)確實(shí)是druid連接池報(bào)錯(cuò)。
異常信息如下圖。

圖片很清晰的表明是由于druid中 initial-size無法設(shè)置導(dǎo)致nacos重載失敗并拋出異常。
接下來我們查看druid源碼,發(fā)現(xiàn)該字段初始化方法有對(duì)init狀態(tài)的判斷,若init為true,則方法拋出異常,該異常也即nacos CacheData中捕獲的異常。

我們繼續(xù)查看源碼,發(fā)現(xiàn)該字段為容器初始化加載組件完成后即設(shè)置完成,該字段無法動(dòng)態(tài)修改。

至此,該異常原因鏈路完整,出現(xiàn)此異常就是因?yàn)閐ruid擴(kuò)展參數(shù)中initial-size該字段不支持動(dòng)態(tài)更新導(dǎo)致。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb搭建網(wǎng)上圖書商城畢業(yè)設(shè)計(jì)
這篇文章主要介紹了JavaWeb搭建網(wǎng)上圖書商城框架,特別適合正在為網(wǎng)上商城畢業(yè)設(shè)計(jì)煩惱的同學(xué),需要的朋友可以參考下2015-11-11
Spring?boot2.0?實(shí)現(xiàn)日志集成的方法(2)
這篇文章主要介紹了Spring?boot2.0?實(shí)現(xiàn)日志集成的方法,上一章講解了spring?boot日志簡(jiǎn)單集成,這篇我們將日志進(jìn)行分類,常規(guī)日志、異常日志、監(jiān)控日志等,需要將日志輸出到不同的文件,具體內(nèi)容需要的小伙伴可以參考一下2022-04-04
java面向?qū)ο笤O(shè)計(jì)原則之合成復(fù)用原則示例詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計(jì)原則之合成復(fù)用原則的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10
Java?NIO實(shí)現(xiàn)聊天系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?NIO實(shí)現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java使用訪問者模式解決公司層級(jí)結(jié)構(gòu)圖問題詳解
這篇文章主要介紹了Java使用訪問者模式解決公司層級(jí)結(jié)構(gòu)圖問題,結(jié)合實(shí)例形式分析了訪問者模式的概念、原理及Java使用訪問者模式解決公司曾經(jīng)結(jié)構(gòu)圖問題的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-04-04
SpringBoot調(diào)整ApplicationContextAware如何實(shí)現(xiàn)類加載順序
SpringBoot調(diào)整ApplicationContextAware實(shí)現(xiàn)類加載順序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java控制臺(tái)實(shí)現(xiàn)可視化日歷小程序
這篇文章主要為大家詳細(xì)介紹了java控制臺(tái)實(shí)現(xiàn)可視化日歷小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

