bootstrap.yml与spring.config.import导入nacos配置

在Spring Cloud项目里,将Nacos配置相关信息配置在bootstrap.yml(或bootstrap.properties)而不是application.yml(或application.properties)才能生效,这主要和Spring Cloud的配置加载顺序与机制有关,下面详细解释:

1. 配置加载顺序

Spring Cloud应用启动时,会按特定顺序加载配置,bootstrap.yml的加载时机早于application.yml

  • bootstrap.yml :它属于Spring Cloud Context上下文的一部分,在Spring Boot的主应用上下文(application.yml对应的上下文)创建之前加载。其作用是负责加载一些基础的、必要的配置信息,为后续应用的启动和配置加载提供支撑。
  • application.yml :这是Spring Boot默认的配置文件,在bootstrap.yml加载完成后才会加载,用于配置应用自身的一些常规属性。

2. Nacos配置加载原理

Nacos作为Spring Cloud的配置中心,在应用启动时需要提前获取相关配置信息,而这些信息依赖于一些基础配置,比如Nacos服务器地址、命名空间、Data ID等。

  • bootstrap.yml :由于它先被加载,所以可以在这里配置Nacos的连接信息和要加载的配置文件信息。Spring Cloud会依据这些配置,在主应用上下文创建之前就从Nacos服务器获取相应的配置,并将其注入到应用环境中。这样,当应用后续加载application.yml以及启动时,就能使用从Nacos获取的配置了。
  • application.yml :如果把Nacos的配置信息放在application.yml中,此时Spring Cloud还没有依据这些信息从Nacos获取配置,因为application.yml的加载是在Nacos配置获取机制启动之后,所以无法正确加载Nacos上的配置。

3. 示例说明

假设要从Nacos加载数据库配置,配置在bootstrap.ymlapplication.yml中的效果如下:

bootstrap.yml
yaml 复制代码
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: your-dev-namespace-id
        data-id: db.properties
        group: DEFAULT_GROUP

当应用启动时,会先读取bootstrap.yml,根据其中的Nacos配置信息从Nacos服务器获取db.properties的配置内容,并将其注入到应用环境。之后,应用继续启动,就可以使用这些配置。

application.yml
yaml 复制代码
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: your-dev-namespace-id
        data-id: db.properties
        group: DEFAULT_GROUP

由于application.yml加载较晚,在它加载时,Spring Cloud已经尝试去加载配置,但因为没有从bootstrap.yml获取到Nacos配置信息,所以无法正确连接Nacos服务器获取配置,导致配置不生效。

总结

bootstrap.yml和application.yml可以看作是两种框架或者两种生态下的运行配置文件,对于springboot应用来说,但应用启动时,程序会从application.yml中配置的内容进行应用创建,例如@Value赋值等。而对于bootstrap.yml 主要作用是在应用启动早期配置并获取 Nacos 等配置中心的配置,这些配置会被合并到 Spring 应用的环境中,之后 Spring Boot 应用可以从该环境中获取并使用这些配置。如果没有把nacos的配置放在bootstrap.yml中,那么就无法提前加载进行属性合并,从而无法正确启动Spring应用。

最佳实践

  • bootstrap.yml方式
yaml 复制代码
spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: dev #指定配置中心使用dev命名空间
        file-extension: properties
        extension-configs:
          - data-id: db.properties
            group: DEFAULT_GROUP
          - data-id: order.properties

通过namespace配置拉取的命名空间。

通过file-extension配置默认拉取的文件后缀名,nacos默认拉取的有 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{spring.cloud.nacos.config.file-extension},如果指定的激活环境,还会默认拉取 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}。

  • spring.config.import
    从 Spring Boot 2.4 版本开始,新增了spring.config.import也可以实现提前从外部加载配置的功能。
yaml 复制代码
server:
  port: 3377

spring:
  config:
    import:
      - nacos:db.properties
      - nacos:nacos-config.properties
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: dev
  application:
    name: nacos-config

其中加载部分源码如下:

对于spring.config.import配置项可以单独指定每个dataId的group,而nameSpace是通过全局的nacos.config.namespace指定。

相关推荐
崔庆才丨静觅16 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人16 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼16 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空16 小时前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
Mr Xu_16 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus16 小时前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空16 小时前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范
子兮曰16 小时前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
会一丢丢蝶泳的咻狗17 小时前
Sass实现,蛇形流动布局
前端·css
攀登的牵牛花17 小时前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端