【2023.0.3.2】从 2023.0.1.2 升级至 2023.0.3.2 配置中心不读取配置文件
我翻阅了不少 issues 得出的结论就是配置方式发上了变化(但是官方没有任何的声明),我有如下几个问题?
- 为什么要抛弃原有的配置方式,而使用
spring.config.import的方式?原来的配置模式是有什么弊端吗? - 为什么不兼容原始的配置方式?明明是一个小版本的升级,改动确如此之大。
- 既然不兼容,为什么不将版本号提升为
2024.0.0或者2023.1.0.0并做出明确标注? - 能否保留之前的配置方式,个人觉得新的方式在
spring.config.import配置很乱,这种类 url 参数的模式并没有原来的对象形式好。
我看这个问题是在 2023.0.1.3 开始出现的,我暂时放弃升级,等待完善。
PS:这种做法显得太不专业了(其实我这个白嫖党没有资格说这个话,但是我还是要提一下)
谁说不是呢,不支持就不支持吧,spring-configuration-metadata.json配置元数据里竟然还保留这些配置的信息,这不是误导人嘛
Nacos 配置中心进阶指南 文档里保留着之前的配置方式,有没有这个可能:他们原是想支持的,但是出了bug
指定的spring.profiles.active无效导致读取不到配置,如果把nacos的相关配置放入application.yml就能够读取到配置。使用bootstrap也是一样的。。。
把spring.config.import的配置放入对应的application-${profile}.yml中就行了,应用启动时会先加载spring.config.import然后才是spring.profiles.active所以就导致了读取不到配置
就是,你的心不痛嘛!他娘的配置老不生效我都怀疑人生拉哈哈。
spring.config.import 在 spring boot 的启动过程中,触发的很早,另外 bootstrap.properties / yaml 被取消了,所以导致 以原有方式设置的 spring.cloud.nacos.x.x 相关值拿不到。这是出现问题的主要原因。所以只要让这些设置发生在 spring.config.import 之前,问题就可以解决。 两个思路:
- 把这下配置直接放在 spring.config.import 所在的 properties 文件里;
- 自己定制一个 GenericApplicationListener,在 ApplicationEnvironmentPreparedEvent 事件里,把这些设置加载到 Environment 里就可以解决问题。
This issue has been open 30 days with no activity. This will be closed in 7 days.
github上官方的例子跑起来是没问题,我查下来,有两个问题需要注意:
- 配置方式调整。原来依赖bootstrap的方式已经被放弃,其它配置方式的import集合的文件一定不能有后缀,否则会找不到文件,配置如下。另外2023.0.1.2原本会默认加载工程名的配置文件,在2023.0.3.2测试下来是以import的文件列表为准,看起来不会再加载nacos中的默认工程文件。
spring:
config:
import:
- nacos:common-server
- 要去除spring-cloud-starter-bootstrap依赖,这点很重要!!!我查了几天,最后才发现一旦工程依赖这个jar包,会默认启用bootstrap方式,最后在代码的RefreshEventListener的refresh属性会自动注入LegacyContextRefresher,这个refresh不会读取nacos中的配置更新。要让nacos配置更新能生效,refresh属性必须注入ConfigDataContextRefresher,这个refresh监听到context的refresh事件后,会主动去调用NacosConfigDataLoader的load加载nacos中配置属性,并生成propertySource设置到Environment对象中。去除spring-cloud-starter-bootstrap依赖,才会让ConfigDataContextRefresher自动注入到RefreshEventListener。
最后的代码示例:
spring:
config:
import:
- nacos:common-server
cloud:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: xxxxxx
discovery:
heart-beat-interval: 2000
heart-beat-timeout: 4000
ip-delete-timeout: 4000
failureToleranceEnabled: true
config:
fileExtension: yaml
官方样例代码: https://github.com/alibaba/spring-cloud-alibaba/tree/2023.x/spring-cloud-alibaba-examples/nacos-example/nacos-config-example
2023.0.1.2 之后的版本都是这个问题 见: #3882 。之前没人管理,很多同类问题 ISSUE 都被系统自动关闭了。
SCA 2023.0.1.3 以及之后的版本变化,一方面是为了提取共用模块;另一方面是不打算再兼容 Bootstrap 模式。
因为,确实是 Boostrap 模式是兼容的模式,是 Spring 本身也已经不再推荐使用。
所以,现在最好的办法就是:
- 把现在所有的 Nacos 配置,全部改成
spring.config.import的方式 - 把服务中的 Bootstrap.yml 全部改成 application.yml
这样的话spring-cloud-starter-boostrap 也不需要依赖了。这样操作之后,现在的 SCA 2023.0.3.3 就直接可以用,不会有任何问题。
这两天我也仔细看了看。我提交的 PR 也仅是兼容老用户 Bootstrap 模式的补救措施。与 SCA 新版本的用法不符,也不符合 Spring 的规范。
因为 Bootstrap 模式还是需要依赖于
spring.factories配置文件,但这个文件已经不是 Spring Boot 3.x 标准用法了,由此可见 不推荐 Bootstrap 模式是对的,早晚要被淘汰。特别是今年的年底要发布 Spring Boot 4.X 了。
This issue has been open 30 days with no activity. This will be closed in 7 days.
This issue has been automatically marked as stale because it hasn't had any recent activity.If you think this should still be open, or the problem still persists, just pop a reply in the comments and one of the maintainers will (try!) to follow up. Thank you for your interest and contribution to the Sping Cloud Alibaba Community.