编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM

作者: lychichem 2022-8-16 10:53:50 显示全部楼层 |阅读模式

当spring 容器刷新 重复创建NacosNamingService客户端,线程多达上万引起OOM

discovery version:

com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2021.0.1.0 com.alibaba.cloud spring-cloud-alibaba-dependencies 2021.0.1.0 com.springframework.cloud spring-cloud-dependencies 2021.0.1 com.springframework.boot spring-boot-dependencies 2.6.6 ">

<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内部都是空的。这样每次都会新创建客户端,导致重复创建很多线程,之前客户端的线程也没有销毁。 lADPJwnIziEJGojNBG_NDo0_3725_1135 jpg_720x720q90g

NacosWatch在通过NacosServiceManager获取客户端内部都为空,就会再次创建NacosNamingService。 不只在NacosWatch,其他有使用到NacosServiceManager的地方都会有这个问题。

问题解答

andreilitvin 2022-8-16 11:26:55 显示全部楼层

这个问题你是实际 Authentication 过的还是你的理解?如果是实际 Authentication 有问题,麻烦提供一个简易复现demo

hiroshi-nakaji 2022-8-16 11:53:38 显示全部楼层

引入上述依赖,再加入config和bootstrap依赖

com.springframework.cloud spring-cloud-starter-config 3.1.1 com.springframework.cloud spring-cloud-starter-bootstrap 3.1.1 com.springframework.boot spring-boot-starter-web 2.6.6 ">
<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不会触发

abialas 2022-8-16 12:47:57 显示全部楼层

使用 spring-cloud-starter-config做动态配置没有具体测试过,你可以将NacosServiceManager中的NamingService和NamingMaintainService属性设置为static,本地测试一下方便吗?

WesleyKhoiVo 2022-8-16 12:22:23 显示全部楼层

可以给一份最小示例代码复现这个问题吗

腾讯云服务器 阿里云服务器
关注微信
^