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:[]了。

总结

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

相关文章

  • Mybatis-Spring源码分析图解

    Mybatis-Spring源码分析图解

    这篇文章主要介绍了Mybatis-Spring源码分析,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 使用IDEA如何打包发布SpringBoot并部署到云服务器

    使用IDEA如何打包发布SpringBoot并部署到云服务器

    这篇文章主要介绍了使用IDEA如何打包发布SpringBoot并部署到云服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java WebSocket客户端断线重连的实现方法

    java WebSocket客户端断线重连的实现方法

    在工作中是否会遇到实用websocket客户端连接服务端的时候,网络波动,服务端断连的情况,本文可以直接使用的断线重连,感兴趣的可以了解一下
    2021-10-10
  • Lombok中@EqualsAndHashCode注解的使用及说明

    Lombok中@EqualsAndHashCode注解的使用及说明

    这篇文章主要介绍了Lombok中@EqualsAndHashCode注解的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解Java如何通过Socket实现查询IP

    详解Java如何通过Socket实现查询IP

    在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API,感兴趣的可以了解一下
    2022-10-10
  • Java实现图片合成的示例详解

    Java实现图片合成的示例详解

    前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标。java后端也有这样的神器,那就是image-combiner,可以很简单的合成图片,感兴趣的可以试一试
    2022-01-01
  • Java8新特性lambda表达式有什么用(用法实例)

    Java8新特性lambda表达式有什么用(用法实例)

    这篇文章主要介绍了Java8新特性lambda表达式有什么用,着重以实例讲解lambda表达式,需要的朋友可以参考下
    2014-06-06
  • Java实现Excel文件转PDF(无水印无限制)

    Java实现Excel文件转PDF(无水印无限制)

    这篇文章主要为大家详细介绍了如何利用Java语言实现Excel文件转PDF的效果,并可以无水印、无限制。文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • SpringBoot结合Redis实现会话管理功能

    SpringBoot结合Redis实现会话管理功能

    在Web应用程序中,会话管理是一项重要的任务,它涉及跟踪用户的身份验证状态和其他相关信息,以确保用户在与应用程序交互时的连续性和安全性,在本文中,我们将探讨如何使用Spring Boot和Redis实现高效的会话管理
    2023-06-06
  • java、freemarker保留两位小数

    java、freemarker保留两位小数

    这篇文章主要介绍了 java、freemarker保留两位小数的实现方法,然后给大家补充介绍了freemarker保留两位小数的详解,需要的朋友可以参考下
    2017-03-03

最新评论