Nacos后台频繁打印get changedGroupKeys:[]的问题及解决

 更新时间:2024年01月09日 14:40:30   作者:"小王"  
这篇文章主要介绍了Nacos后台频繁打印get changedGroupKeys:[]的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、问题描述

在使用Nacos作为注册中心情况下,客户端启动后频繁打印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:[]

先贴解决方案,再来分析原因

二、解决

nacos配置中加上禁用心跳日志

logging:
  level:
    com.alibaba.nacos.client.config.impl: WARN

在这里插入图片描述

三、问题分析

从日志可以看出 get changedGroupKeys:[] 是从c.a.n.client.config.impl.ClientWorker对象中打印出来的

贴出ClientWorker类中打印get changedGroupKeys:[]方法代码:

public class ClientWorker {
	//长轮询任务,检测服务端配置文件是否更改,30秒超时
	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秒超时,30秒一检测,仔细发现能看出每隔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();
				//方法的最后会再把LongPollingRunnable提交执行,递归,再执行
                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客户端和服务端会通过心跳来检测nacos服务端的配置文件是否发生变化,这也是nacos动态配置实现的原理,客户端通过定时线程长轮询达到动态配置的效果,可以看到这个日志的级别为INFO,我们把nacos的日志级别改为WARN,这样就不会每次心跳检测都打印get changedGroupKeys:[]了。

总结

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

相关文章

  • Java注解详细介绍

    Java注解详细介绍

    这篇文章主要介绍了Java注解详细介绍,本文讲解了Java注解是什么、Java注解基础知识、Java注解类型、定义Java注解类型的注意事项等内容,需要的朋友可以参考下
    2014-09-09
  • eclipse/IDEA配置javafx项目步骤(图文教程)

    eclipse/IDEA配置javafx项目步骤(图文教程)

    这篇文章主要介绍了eclipse/IDEA配置javafx项目步骤(图文教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • idea maven项目启动项目不编译target 文件的问题及解决方法

    idea maven项目启动项目不编译target 文件的问题及解决方法

    代码编辑器中无编译错误,通过maven 的clean 、compile、package进行各种操作也都没问题,但是单击绿色箭头运行(默认会先执行IDE本身的Build操作)却报:程序包xxx不存在,这篇文章主要介绍了解决idea maven项目启动项目不编译target文件问题,需要的朋友可以参考下
    2023-05-05
  • 使用JMF实现java视频播放器

    使用JMF实现java视频播放器

    这篇文章主要为大家详细介绍了使用JMF实现java视频播放器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java Lambda表达式实例解析原理

    Java Lambda表达式实例解析原理

    日常开发中,我们很多时候需要用到Java 8的Lambda表达式,它允许把函数作为一个方法的参数,让我们的代码更优雅、更简洁。所以整理了一波工作中常用的Lambda表达式。看完一定会有帮助的
    2023-03-03
  • Spring中如何使用@Value注解实现给Bean属性赋值

    Spring中如何使用@Value注解实现给Bean属性赋值

    这篇文章主要介绍了Spring中如何使用@Value注解实现给Bean属性赋值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java写出生肖年判断

    Java写出生肖年判断

    本篇文章主要给大家分享一篇关于用JAVA写出生肖判断的小功能,有兴趣的跟着学习下。
    2018-02-02
  • Java中的transient关键字介绍

    Java中的transient关键字介绍

    这篇文章主要介绍了Java中的transient关键字介绍,需要的朋友可以参考下
    2015-03-03
  • 解析MyBatis源码实现自定义持久层框架

    解析MyBatis源码实现自定义持久层框架

    这篇文章主要介绍了手撕MyBatis源码实现自定义持久层框架,涉及到的设计模式有Builder构建者模式、⼯⼚模式、代理模式,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Service层异常抛到Controller层处理还是直接处理问题分析

    Service层异常抛到Controller层处理还是直接处理问题分析

    这篇文章主要为大家介绍了Service层异常抛到Controller层处理还是直接处理的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论