当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的地方都会有这个问题。
这个问题你是实际 Authentication 过的还是你的理解?如果是实际 Authentication 有问题,麻烦提供一个简易复现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不会触发
可以给一份最小示例代码复现这个问题吗