spring-cloud-alibaba
spring-cloud-alibaba copied to clipboard
当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM
discovery version:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
</dependency>
<dependency>
<groupId>com.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
</dependency>
<dependency>
<groupId>com.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
</dependency>
cloud config动态更新配置时,调用ContextRefresher#refresh NacosDiscoveryClientConfiguration类会重新初始化。
问题在每次注入的NacosServiceManager内部都是空的。这样每次都会新创建客户端,导致重复创建很多线程,之前客户端的线程也没有销毁。
NacosWatch在通过NacosServiceManager获取客户端内部都为空,就会再次创建NacosNamingService。 不只在NacosWatch,其他有使用到NacosServiceManager的地方都会有这个问题。
这个问题你是实际验证过的还是你的理解?如果是实际验证有问题,麻烦提供一个简易复现demo
引入上述依赖,再加入config和bootstrap依赖
<dependency>
<groupId>com.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
成功连通config后 在代码中注入 ContextRefresher 。写个接口调用他的 refresh方法就能复现了。debug到NamingFactory的creteNamingService。就发现每次刷新都会创建客户端。 好像只有config会这样,nacos的config不会触发
使用 spring-cloud-starter-config做动态配置没有具体测试过,你可以将NacosServiceManager
中的NamingService和NamingMaintainService属性设置为static,本地测试一下方便吗?
可以给一份最小示例代码复现这个问题吗
静态变量可以
------------------ 原始邮件 ------------------ 发件人: 余黄彬 @.> 发送时间: 2022年8月10日 21:43 收件人: alibaba/spring-cloud-alibaba @.> 抄送: Master-Jack @.>, Author @.> 主题: Re: [alibaba/spring-cloud-alibaba] 当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM (Issue #2703)
使用 spring-cloud-starter-config做动态配置没有具体测试过,你可以将NacosServiceManager中的NamingService和NamingMaintainService属性设置为static,本地测试一下方便吗?
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
Long time without response and close first.