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

相关推荐
drebander几秒前
[特殊字符] 基于 FastAPI 和 React 构建车牌号识别网站
前端·react.js·fastapi
Lanwarf-前端开发24 分钟前
gis风场加载
开发语言·前端·javascript
Merlin-Ice25 分钟前
Unity Shader Feature
服务器·前端·unity
吃蛋糕的居居29 分钟前
疯狂前端面试题(四)
前端·javascript·chrome·ajax·正则表达式·firefox·html5
一川晚照人闲立1 小时前
JEECGBOOT前端VUE3版本浏览器兼容支持chrome>=76版本方法
java·前端·vue.js·chrome·anti-design-vue·jeecgboot·jeecg
前端加油站2 小时前
高级前端成长之路必看前端请求
前端·vue.js·react.js
baby_hua2 小时前
2021版小程序开发5——小程序项目开发实践(2)-完
前端·小程序·apache
tick-tick2 小时前
npm常用命令以及nvm切换node版本
前端·npm·node.js
ChinaRainbowSea2 小时前
十四. Redis 新功能
java·数据库·redis·缓存·bootstrap
Jackson@ML2 小时前
Django开发入门 – 3.用Django创建一个Web项目
前端·django·sqlite