记录解决Spring Cloud+nacos注入失效的问题

记录解决Spring Cloud+nacos注入失效的问题,第1张

记录解决Spring Cloud+nacos注入失效的问题 记录解决Spring Cloud+nacos注入失效的问题 问题的关键字:
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生效。

一些对springCloud看法的分享

如果你也查看了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中的使用,感兴趣的小伙伴可以关注一下我,有时间我也会整理一下写一个文章。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4828565.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-10
下一篇 2022-11-10

发表评论

登录后才能评论

评论列表(0条)

保存