Nacos后臺(tái)頻繁打印get changedGroupKeys:[]的問(wèn)題及解決
一、問(wèn)題描述
在使用Nacos作為注冊(cè)中心情況下,客戶端啟動(dòng)后頻繁打印get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[]
先貼解決方案,再來(lái)分析原因
二、解決
nacos配置中加上禁用心跳日志
logging:
level:
com.alibaba.nacos.client.config.impl: WARN

三、問(wèn)題分析
從日志可以看出 get changedGroupKeys:[] 是從c.a.n.client.config.impl.ClientWorker對(duì)象中打印出來(lái)的
貼出ClientWorker類中打印get changedGroupKeys:[]方法代碼:
public class ClientWorker {
//長(zhǎng)輪詢?nèi)蝿?wù),檢測(cè)服務(wù)端配置文件是否更改,30秒超時(shí)
class LongPollingRunnable implements Runnable {
private int taskId;
public LongPollingRunnable(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
List<CacheData> cacheDatas = new ArrayList<CacheData>();
List<String> inInitializingCacheList = new ArrayList<String>();
try {
// check failover config
for (CacheData cacheData : cacheMap.get().values()) {
if (cacheData.getTaskId() == taskId) {
cacheDatas.add(cacheData);
try {
//檢查本地配置
checkLocalConfig(cacheData);
if (cacheData.isUseLocalConfigInfo()) {
cacheData.checkListenerMd5();
}
} catch (Exception e) {
LOGGER.error("get local config info error", e);
}
}
}
// check server config
List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);
//可以看出這里打印的心跳日志 get changedGroupKeys:[]
LOGGER.info("get changedGroupKeys:" + changedGroupKeys);
for (String groupKey : changedGroupKeys) {
String[] key = GroupKey.parseKey(groupKey);
String dataId = key[0];
String group = key[1];
String tenant = null;
if (key.length == 3) {
tenant = key[2];
}
try {
//30秒超時(shí),30秒一檢測(cè),仔細(xì)發(fā)現(xiàn)能看出每隔30秒打印一遍get changedGroupKeys:[]心跳日志
String[] ct = getServerConfig(dataId, group, tenant, 3000L);
CacheData cache = cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
cache.setContent(ct[0]);
if (null != ct[1]) {
cache.setType(ct[1]);
}
LOGGER.info("[{}] [data-received] dataId={}, group={}, tenant={}, md5={}, content={}, type={}",
agent.getName(), dataId, group, tenant, cache.getMd5(),
ContentUtils.truncateContent(ct[0]), ct[1]);
} catch (NacosException ioe) {
String message = String.format(
"[%s] [get-update] get changed config exception. dataId=%s, group=%s, tenant=%s",
agent.getName(), dataId, group, tenant);
LOGGER.error(message, ioe);
}
}
for (CacheData cacheData : cacheDatas) {
if (!cacheData.isInitializing() || inInitializingCacheList
.contains(GroupKey.getKeyTenant(cacheData.dataId, cacheData.group, cacheData.tenant))) {
cacheData.checkListenerMd5();
cacheData.setInitializing(false);
}
}
inInitializingCacheList.clear();
//方法的最后會(huì)再把LongPollingRunnable提交執(zhí)行,遞歸,再執(zhí)行
executorService.execute(this);
} catch (Throwable e) {
// If the rotation training task is abnormal, the next execution time of the task will be punished
LOGGER.error("longPolling error : ", e);
executorService.schedule(this, taskPenaltyTime, TimeUnit.MILLISECONDS);
}
}
}
}
分析:
從ClientWorker 代碼中分析出,nacos客戶端和服務(wù)端會(huì)通過(guò)心跳來(lái)檢測(cè)nacos服務(wù)端的配置文件是否發(fā)生變化,這也是nacos動(dòng)態(tài)配置實(shí)現(xiàn)的原理,客戶端通過(guò)定時(shí)線程長(zhǎng)輪詢達(dá)到動(dòng)態(tài)配置的效果,可以看到這個(gè)日志的級(jí)別為INFO,我們把nacos的日志級(jí)別改為WARN,這樣就不會(huì)每次心跳檢測(cè)都打印get changedGroupKeys:[]了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
idea?maven項(xiàng)目啟動(dòng)項(xiàng)目不編譯target?文件的問(wèn)題及解決方法
代碼編輯器中無(wú)編譯錯(cuò)誤,通過(guò)maven 的clean 、compile、package進(jìn)行各種操作也都沒(méi)問(wèn)題,但是單擊綠色箭頭運(yùn)行(默認(rèn)會(huì)先執(zhí)行IDE本身的Build操作)卻報(bào):程序包xxx不存在,這篇文章主要介紹了解決idea maven項(xiàng)目啟動(dòng)項(xiàng)目不編譯target文件問(wèn)題,需要的朋友可以參考下2023-05-05
Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值
這篇文章主要介紹了Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
解析MyBatis源碼實(shí)現(xiàn)自定義持久層框架
這篇文章主要介紹了手撕MyBatis源碼實(shí)現(xiàn)自定義持久層框架,涉及到的設(shè)計(jì)模式有Builder構(gòu)建者模式、??模式、代理模式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Service層異常拋到Controller層處理還是直接處理問(wèn)題分析
這篇文章主要為大家介紹了Service層異常拋到Controller層處理還是直接處理的問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

