问题描述
最近,在gitee上找了一个Spring Cloud项目进行学习,项目使用了Spring Cloud Alibaba Nacos作为服务发现,由于之前经常使用Nacos,所以在简单对项目配置文件进行了修改后,便进行项目启动测试,结果报了以下错误信息:
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/service/list after all servers([localhost:8848]) tried: java.net.ConnectException: Connection refused: connect
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:556) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:498) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:493) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.getServiceList(NamingProxy.java:481) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:502) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:490) ~[nacos-client-1.4.1.jar:na]
at com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery.getServices(NacosServiceDiscovery.java:69) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.4.RELEASE.jar:2.2.4.RELEASE]
at com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClient.lambda$getServices$1(NacosReactiveDiscoveryClient.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.4.RELEASE.jar:2.2.4.RELEASE]
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.4.1.jar:3.4.1]
at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:193) ~[reactor-core-3.4.1.jar:3.4.1]
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.4.1.jar:3.4.1]
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.4.1.jar:3.4.1]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_331]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_331]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_331]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_331]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_331]
at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_331]
我的相关配置写在了bootstrap.yml
文件里
原因分析:
由于是第一次遇到上述问题,而且之前这样写也没有任何问题,所以一时间不知道问题出在哪里,于是在网上对此问题进行了相关搜索,大概总结出了以下几类原因
原因一:nacos本地缓存没有更新,还沿用之前nacos未能正确启动的缓存
原文链接:https://blog.csdn.net/LeslieTsai2019/article/details/118607879
原因二:nacos未启动
原文链接:https://www.cnblogs.com/liqinzhen/p/13754581.html
原因三:bootstrap.yml文件没有被加载
前两个原因我都进行了分析并测试,不能解决我项目的问题。于是我只能通过源码来进行分析,分析前先贴出我项目里的配置文件。
在我的项目里有applicatrion.yml
与bootstrap.yml
两个配置文件,在Spring Boot中,bootstrap.yml
是优先于applicatrion.yml
加载的,所以我找到nacos项目里的配置类,通过代码走查的方式检查两个配置文件是否有加载,结果发现applicatrion.yml
加载了,而bootstrap.yml
没有被加载,导致nacos的服务地址使用的还是默认地址。
所以在本项目中,bootstrap.yml
没有被加载才是问题产生的原因。
解决方案:
知道问题的产生原因后,问题就很好解决了,只需要知道bootstrap.yml
为什么不加载就能解决,于是在网上搜索相关问题后才知道,bootstrap.yml
不加载可能是因为缺少以下依赖,在pom.xml
文件加上以下依赖即可解决。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
测试发现,bootstrap.yml
确实加载了