springboot 2.4.13,集成了nacos,启动后,nacos注册中心有服务,但是,发现,配置没有生效。于是,开启了一段源码查找的过程。
首先,是pom 导入的nacos配置
然后,application.yml添加nacos配置
启动后,发现注册中心有服务,但是,服务的配置不是从nacos配置中心获取的,而是 本地的。
查找配置一下nacos源码,找到nacos自动注入那块儿:
然后发现,是这个NacosPropertySourceLocator实现的配置导入的
查询 ,可以发现,相关的配置的源码,是通过这个方法,加载的,这个方法是总入口。
于是,尝试加断点,查看配置信息,看看为什么没有导入配置。但是, 程序根本就没有进入这个方法里面!!!
根据接口实现,可以发现NacosPropertySourceLocator是PropertySourceLocator的实现类,这个方法的调用执行,不是nacos自己在走的,而是通过spring在走的 的。
spring cloud 通过BootstrapApplicationListener,以监听器的方式,通过监听springboot启动过程中的事件,通过onApplicationEvent方法处理事件,导入spring cloud相关配置。
通过添加 断点,可以发现,这里的方法bootstrapEnabled()返回值是false,直接不会执行后续的加载了。
因此,需要保证bootstrapEnabled值是true。
查看PropertyUtils源码,可以发现,需要配置项 spring.cloud.bootstrap.enabled=true 并且存在 org.springframework.cloud.bootstrap.marker.Marker 类的时候,spring cloud 才会去加载spring cloud 的配置。
因此,pom中需要添加marker所在组件的依赖:
同时,需要在bootstrap.yml中添加spring cloud配置:
(至于为什么是bootstrap.yml) yml而不是application.yml,这又是另一个问题了)
有了上面的配置,程序启动后,就可以正常的从nacos配置中心获取配置了。