升级SpringCloud2023对接nacos踩坑

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?

  1. 复杂性和混淆
    问题:
  • 开发者常常困惑于该在哪个文件配置什么
  • 两个上下文的概念增加了学习曲线
  • 配置优先级不直观
  1. 性能开销
  • Bootstrap 需要创建一个父 ApplicationContext
  • 增加了启动时间和内存开销
  • 对于不需要外部配置中心的应用是不必要的负担
  1. 统一配置机制
    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.ymlapplication-{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***
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值