springCloud nacos的配置加载不进去 nacos @Value 失效
java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank at com.alibaba.nacos.api.naming.utils.NamingUtils.getGroupedName(NamingUtils.java:47) ~[nacos-api-1.4.1.jar:na]问题解决过程:
起因是我想搭建一个springClound项目以阿里巴巴开源的框架nacos作为配置中心和注册中心。于是我查阅了nacos的官网:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
毕竟是咱们国内的大佬研发的,能直接看中文文档是一件很舒服的事。
我几乎是完全复制的官方文档的 *** 作,但是不行。
最终引入代码如下:
这个@Value就是不能从远程配置中心注入。
最后原因是少引入一个包
org.springframework.cloud spring-cloud-starter-bootstrap
解决的方案是在这里知道的:
https://github.com/alibaba/nacos/issues/5448
翻到这个issue的下面有个大佬出来表示不加这个不回去进行config properties的 bootstrap,是因为springCloud的一个升级。
问题到这里就结束了,但是为了解决这个问题我查了好几个小时。我先是去baidu查到不同人遇到的各种各样的问题发现没一个和我一样的,然后又是折腾maven引入的springCloud的版本,接着又是怀疑nacos配的有问题又去折腾nacos的配置,最后是翻源代码看了半天的springCloud对config中的properties的获取代码,最终解决方案就是我去google搜了一下,第一条就是这个github的issue
但是在折腾的过程中学到了很多东西,而且发现在看源码的过程中差点就解决掉这个问题。并且纠正了我对springCloud的一些误区,在这里我分享一下。
源码阅读部分看源码的过程很忐忑,最终锁定了接口 ConfigService ,他的所在位置是
groupId:com.alibaba.nacos
artifactId:nacos-api
如下:
里面提供的方法有
这么些,从字面意思上其实就是过去配置,增加动态变化的监听这些。
它有个实现类是nacos相关的,细节我没有关注大概就是发送http请求换属性回来。
从这个类顺藤摸瓜往上找
画红线的地方比较像去使用这个的地方,最后找到了
NacosPropertySourceLocator 类
以此类推一路往上找 最终找到了 BootstrapApplicationListener类,看名字像是启动应用监听的。
在初始化的方法中有这样一个判断
通过断点发现这个判断为true,直接return了,导致下面的代码,也就是刚才跟了一路的代码都没有执行。
那么为什么会为true呢?
点进去if条件判断是通过这两个条件判断的:
第一个配置spring.cloud.bootstrap.enabled 如果你没有配置默认使用false,也是就是说我不引入额外的包,把这个配置改成true也是可以的。
第二个配置MARKER_CLASS_EXISTS 细看一下其实就是去找一个叫做Marker的类,如果有也就放过。
再看看解决方案中的那个引入的新包:
其实就一个这个类,所以引入这个或者更改那个配置就可以让springCloud去寻找nacos配置的@Value生效。
如果你也查看了github中issue大佬给出的理由应该会注意到springCloud的一个官方指南:
https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-first-bootstrap
这个说明了刚才源码看到的东西,要么加配置要么引入新包。
所以我对它的理解就是使用一个不熟悉的东西遇到了问题,还是从官网的指南入手,毕竟你在网上搜索到的很多教程博客都是过期的,可能新版本已经改变了。
毕竟我按照着nacos的入手教程都没能搭建成功~~~
还有就是nacos虽然嵌入到了springClound里头,但是他也只是针对配置中心的一个实现 ,springClound提供了接口,nacos去实现了而已,所以这种框架还是要以官网为准。
以上。
看源码的过程中额外了解到了java的spi机制以及在spring中的使用,感兴趣的小伙伴可以关注一下我,有时间我也会整理一下写一个文章。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)