nacos连接cpu暴增

一个项目遇到一个nacos问题,经常导致cpu暴增从而死机

com.alibaba.nacos.client.Worker.fixed-10.254.108.164_88-c8adf6e3-cc0a-4ff0-a91e-854f5c670690" #46404 daemon prio=5 os_prio=0 tid=0x00007f20f005e800 nid=0x7dcc waiting on condition [0x00007f1f1d75d000]
java.lang.Thread.State: TIMED_WAITING (parking)

原因我们这里在下文继续分析,这里我们直接说明解决方法和尝试过程

第一个尝试:网上有提出是druid的版本太低导致,jar包下面的dataabstactsource的文件里的
低版本没有判断是否创建
public void setUsername(String username) {
if (this.inited) {
throw new UnsupportedOperationException();
} else {
this.username = username;
}
}

高版本
public void setUsername(String username) {
if (!StringUtils.equals(this.username, username)) {
if (this.inited) {
throw new UnsupportedOperationException();
} else {
this.username = username;
}
}
}

解决方案:这里的这个判断是不可少的! nacos 会每个30 s 就去获取配置, 然后rebind, 但是druid-1.0.26 rebind 就会报错, 报错有没有打印出来! 我擦。 druid-1.1.4 就不会有这个问题了!检查其他方法, 发现都做了 !StringUtils.equals 判断。

参考博客:https://blog.csdn.net/weixin_30783629/article/details/96637747

但是没有解决问题,博主就进行第二个的尝试,换一种方式的代码
不使用Environment 的方式连接 我们直接使用NacosConfigProperties的方式连接,这里注意配置文件需要写到bootstrap.yml中(地址和空间名)

@Autowired
private NacosConfigProperties nacosConfigProperties;

private static final String DATAID = “jservice.yml”;

private static final String GROUPID = “JMAS-JMOPEN”;

/**

  • logger
    */
    private final Log logger = LogFactory.getLog(getClass());

/**

  • 返回接口应用接口全部和地址状态

  • @return

  • @throws NacosException
    */
    public CycleConfig findStatisticalConfig() {
    CycleConfig warnConfig = new CycleConfig();
    try {
    ConfigService configService = nacosConfigProperties.configServiceInstance();
    String content = configService.getConfig(DATAID, GROUPID, 3000);
    Yaml yaml = new Yaml();
    Map configMap = (Map)yaml.load(content);

     String dingDingAddress = (String)configMap.get("dingDingAddress");
     int normalPollingCycle = (int)configMap.get("normalPollingCycle");
     int detectedPollingCycle = (int)configMap.get("detectedPollingCycle");
     int faultPollingCycle = (int)configMap.get("faultPollingCycle");
     boolean jservicestatus = (boolean)configMap.get("jservicestatus");
     boolean jmportalstatus = (boolean)configMap.get("jmportalstatus");
     String jserviceAPPurl = (String)configMap.get("jserviceAPPurl");
     String jserviceInterfaceurl = (String)configMap.get("jserviceInterfaceurl");
     String jmportalurl = (String)configMap.get("jmportalurl");
     String appUid = (String)configMap.get("appUid");
     String interfaceUid = (String)configMap.get("interfaceUid");
     warnConfig.setNormalPollingCycle(normalPollingCycle);
     warnConfig.setAppUid(appUid);
     warnConfig.setDetectedPollingCycle(detectedPollingCycle);
     warnConfig.setDingDingAddress(dingDingAddress);
     warnConfig.setFaultPollingCycle(faultPollingCycle);
     warnConfig.setInterfaceUid(interfaceUid);
     warnConfig.setJmportalurl(jmportalurl);
     warnConfig.setJserviceAPPurl(jserviceAPPurl);
     warnConfig.setJserviceInterfaceurl(jserviceInterfaceurl);
     warnConfig.setJservicestatus(jservicestatus);
     warnConfig.setNormalPollingCycle(normalPollingCycle);
    

    } catch (Exception e) {
    logger.error(e);
    }
    return warnConfig;
    }

这里的直接测试会降低出现的暴增现象,但是还是会出现线程数增多的现象

之后进行了第三次尝试,更新nacos到1.1.4中,在官方文档中对本次更新提出
Health check field and protection threshold are confused
#1409 Integrate with Istio as a service discovery backend
#1507 It is recommended that the shutdown.sh script close only the nodes in the current directory, not all nodes.
#1665 DataSync always not executed after network partition
#1671 ‘Client-Version’ header not set in http request from nacos client
#1759 The number of new configuration words is too long. Tip 400 is not friendly enough.
#1825 In modifying service instance page.Error information not clear
#1874 Repeat defined class NacoException
#1906 Set a new thread pool here, but do not open the Notifier task, whether to add executor.execute(new Notifier());

翻译为
健康检查字段和保护阈值混淆
#1409集成Istio作为服务发现后端
建议关闭.sh脚本只关闭当前目录中的节点,而不是所有节点。
#1665 DataSync总是在网络分区后不执行
客户端版本的报头没有在来自nacos客户端的http请求中设置
新组态词的数量太长了。小费400不够友好。
#1825在修改服务实例页面。错误信息不清晰
重复定义类NacoException
在这里设置一个新的线程池,但是不打开Notifier任务,是否添加executor。执行(新通知());

也就是说解决了一部分重复报错连接问题。

升级nacos
0.8.0及以上版本:

解压安装包后替换{nacos.home}/target/nacos-server.jar
删除{nacos.home}/plugins/cmdb/及{nacos.home}/plugins/health/下的所有文件
逐台重启Nacos Server即可
0.8.0以下版本,先升级到1.0.0版本。

GitHub 加速计划 / na / nacos
29.83 K
12.75 K
下载
Nacos是由阿里巴巴开源的服务治理中间件,集成了动态服务发现、配置管理和服务元数据管理功能,广泛应用于微服务架构中,简化服务治理过程。
最近提交(Master分支:3 个月前 )
4334cd16 * Support custom client configuration timeout.(#12748) * Add UT.(#12748) 12 天前
b04d2266 16 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐