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指定。

相关推荐
sTone8737518 小时前
Electron 进程架构模型
前端·electron
ZC跨境爬虫18 小时前
跟着 MDN 学CSS day_25:(高级区块效果)
前端·css·html·tensorflow·媒体
Bug-制造者18 小时前
前端流式输出完全指南:原理、实现与工程化实践
前端
暴躁小师兄数据学院18 小时前
【AI大模型应用开发工程师特训笔记】第04讲(第7章):函数与模块
前端·人工智能·python
跟着珅聪学java18 小时前
ECharts subtext(副标题)边距开发教程
前端·javascript·echarts
哈撒Ki18 小时前
快速入门 Electron
前端·面试·electron
还有多久拿退休金18 小时前
LLM应用开发一:给失忆的大模型装上"脑子"——LangChain.js对话记忆从零实战
前端·llm
思考着亮18 小时前
1.window.location.href 和 router.push 跳转方式
前端
ZengLiangYi18 小时前
插件式架构设计:SourceAdapter 接口抽象
前端·javascript·后端
万岳科技系统开发18 小时前
私域直播系统开发从0到1:企业直播平台搭建全过程
前端·小程序·架构