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 小时前
Webpack 有哪些特性?构建速度?如何优化?
前端·webpack·node.js
ST.J16 小时前
webpack笔记
前端·笔记·webpack
Baklib梅梅16 小时前
2025 年 8 个最佳网站内容管理系统(CMS)
前端·ruby on rails·前端框架·ruby
IT_陈寒16 小时前
🔥5个必学的JavaScript性能黑科技:让你的网页速度提升300%!
前端·人工智能·后端
Bling_Bling_116 小时前
面试常考:js中 Map和 Object 的区别
开发语言·前端·javascript
前端小巷子17 小时前
JS实现丝滑文字滚动
前端·javascript·面试
oil欧哟17 小时前
🧐 我用 Vibe Coding 从 0 到 1 打造 AI 产品,上线一个月效果如何?有什么心得?
前端·产品·vibecoding
霍克itxt点top17 小时前
NestJS 入门到实战 前端必学服务端新趋势无密分享
前端
xiguolangzi17 小时前
1panel web服务部署
前端
写不出来就跑路17 小时前
基于 HTML+CSS+JavaScript 的薪资实时计算器(含本地存储和炫酷动画)
javascript·css·html