SpringCloudAlibaba-2.1.2.RELEASE 升级SpringCloudAlibaba-2023.0.3.4 ,升级大版本后,Nacos配置踩坑。
Quick start with spring cloud
文章目录
问题1:bootstrap-starter 导致实时刷新失效。
问题描述
历史项目迁移后
工程按照springcloudalibaba2020的配置来的,使用了bootstrap.yml+application.yml的方案解决工程配置文件。按照nacos官网最版本的对接文档配置后,可以连上nacos,但是实时刷新不生效。(springcloud2023默认不支持bootstrap,需要单独导入spring-cloud-starter-bootstrap)
application.yml
spring:
cloud:
nacos:
# username: @nacos.username@
# password: @nacos.password@
discovery:
server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848}
watch:
enabled: true
watch-delay: 1000
namespace: ${NACOS_NAMESPACE}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${NACOS_NAMESPACE}
config:
import:
- optional:nacos:application-${spring.profiles.active}.yml?group=MY_GROUP
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml?group=MY_GROUP
bootstrap.properties
spring.application.name=my_app
#指定开发环境
spring.profiles.active=@env@
bootstrap-local.yml
NACOS_HOST: ***nacos host***
NACOS_NAMESPACE: ***nacos namespace***
pom文件会把resources.local/bootstrap-local.yml 也打到target中。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources.${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
1、Bootstrap 的历史背景
Bootstrap 的来源:
Bootstrap 配置机制来自 Spring Cloud,不是 Spring Boot 原生的
主要用于加载外部配置中心的配置(如 Spring Cloud Config、Nacos、Consul 等)
需要额外引入 spring-cloud-starter-bootstrap 依赖
Bootstrap 的工作原理:
启动顺序(旧机制):
1. 加载 bootstrap.yml/properties (父上下文)
2. 从配置中心获取远程配置
3. 加载 application.yml/properties (子上下文)
4. 启动应用
为什么要移除/改变 Bootstrap?
- 复杂性和混淆
问题:
- 开发者常常困惑于该在哪个文件配置什么
- 两个上下文的概念增加了学习曲线
- 配置优先级不直观
- 性能开销
- Bootstrap 需要创建一个父 ApplicationContext
- 增加了启动时间和内存开销
- 对于不需要外部配置中心的应用是不必要的负担
- 统一配置机制
Spring Boot 团队引入了spring.config.import,实现了统一的配置导入机制:
优势:
✅ 所有配置导入在一个地方定义
✅ 加载顺序清晰明确(从上到下)
✅ 统一的语法支持多种配置源
✅ 更好的性能
2、问题原因
nacos修改配置后,会触发监听器NacosContextRefresher, 其中configInfo的确是最新的配置,往下publishEvent之后,会走到ContextRefresher,
ContextRefresher更新上下文updateEnvironment的时候,走的bootstrap那一套LegacyContextRefresher,获取到的都是老数据,无法更新。
由于我们是使用spring.config.import导入的nacos配置,预期应该走config这套ConfigDataContextRefresher。


3、解决方法
因为是老项目迁移的,有历史包袱原因,使用了bootstrap,但是又没有使用bootstrap的方式来配置nacos,导致配置没有生效。
这次直接全用最新的,一不做二不休,甩掉历史包袱,干掉bootstrap,完全使用spring.config.import
问题2:springboot 2.4+ 配置文件加载问题
因为把bootstrap全干掉了,全部交给application来配置,期间产生的配置问题。
1、问题描述
Nacos的namespace、serverAddr等信息都在环境配置里,可是启动项目后并没有加载local配置文件。
导致项目启动链接不上nacos的配置 工程的配置目录:

2、问题原因
从 Spring Boot 2.4 开始,配置文件的加载机制发生了重大变化:
引入了 spring.config.import 属性用于显式导入配置
当使用 spring.config.import 时,不再自动加载所有的 profile-specific 配置文件
需要显式指定要导入的配置文件
为什么 Spring 不自动加载配置文件?
-
在 Spring Boot 2.4 之前:
Spring Boot 会自动加载application.yml和application-{profile}.yml
这是隐式行为,不需要显式配置 -
在 Spring Boot 2.4+ 之后:
当使用spring.config.import时,Spring Boot 采用了更明确的配置导入机制
必须显式声明要导入的配置源
这样做的好处是:- 配置加载顺序更明确
- 支持从外部源(如 Nacos、Consul、Vault 等)导入配置
- 避免配置加载的歧义
3、解决方法
使用spring.config.import的方式管理所有的配置文件,profile配置也要单独导入一下。
optional:classpath:application-${spring.profiles.active}.yml
application.yml
spring:
application:
name: my-app
profiles:
active: @env@
cloud:
nacos:
# username: @nacos.username@
# password: @nacos.password@
discovery:
server-addr: ${NACOS_HOST:127.0.0.1}:${NACOS_PORT:8848}
watch:
enabled: true
watch-delay: 1000
namespace: ${NACOS_NAMESPACE}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${NACOS_NAMESPACE}
config:
import:
# ========== 这一句,导入profile配置 =============
- optional:classpath:application-${spring.profiles.active}.yml
- optional:nacos:application-${spring.profiles.active}.yml?group=MY_GROUP
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml?group=MY_GROUP
- optional:nacos:${spring.application.name}-dtp-${spring.profiles.active}.yaml?group=MY_GROUP
application-local.yml
NACOS_HOST: ***nacos host***
NACOS_NAMESPACE: ***nacos namespace***

6472

被折叠的 条评论
为什么被折叠?



