当前位置: 代码网 > it编程>编程语言>Java > nacos(SpringCloud)配置加载过程

nacos(SpringCloud)配置加载过程

2024年12月11日 Java 我要评论
nacos(springcloud)配置加载要说nacos配置加载,首先说一下bootstrap配置文件加载。众所周知,springboot由run方法启动,这里就不展开讲了,我们主要看下面的代码,创

nacos(springcloud)配置加载

要说nacos配置加载,首先说一下bootstrap配置文件加载。

众所周知,springboot由run方法启动,这里就不展开讲了,我们主要看下面的代码,创建spring容器之前先准备环境

org.springframework.boot.springapplication#prepareenvironment

首先会创建或获取一个environment,然后加载一些系统配置(环境变量等)

接下来关键了,发布applicationenvironmentpreparedevent事件

监听器有很多,与此次有关的是

  • bootstrapapplicationlistener (创建spring容器和配置中心交互)
  • configfileapplicationlistener(读取配置文件加载到environment)

首先是bootstrapapplicationlistener,如下,可知默认配置名字bootstrap,接着会进入bootstrapservicecontext方法创建spring容器

org.springframework.cloud.bootstrap.bootstrapapplicationlistener#bootstrapservicecontext

这里会重走run方法进行容器的创建,两个容器是不同的

springboot容器为annotationconfigservletwebserverapplicationcontext,cloud为annotationconfigapplicationcontext,由上面的内容可知这里又会重走监听器,

bootstrapapplicationlistener,不过会由于以下代码返回

接下来我们看一下另一个重要的监听器configfileapplicationlistener

由上可知,这里主要调用environmentpostprocessorpostprocessenvironment进行处理;我们主要看的还是

org.springframework.boot.context.config.configfileapplicationlistener#postprocessenvironment

这里没有展开,有兴趣可以看源码,我们主要看加载前后cloud 的environment的变化

加载前

加载后

可以看出主要就是多了bootstrap.yml配置。

接下来我们看boot的environment的变化

加载前

加载后

可以看出多了application.properties的配置

那么问题来了,cloud的配置(bootstrap.yml)是如何加载到boot中的呢

listener看完了,接下来就到initializer

而initializer的调用时机就在org.springframework.boot.springapplication#preparecontext

这里我们也重点看两个

ancestorinitializer

创建时机,cloud的容器创建完成

initialize方法,添加了bootstrap.yml方法到boot 的environment中

另一个是propertysourcebootstrapconfiguration

我们先来看一下它是如何引入的

在创建cloud 的容器时,会引入一个配置bootstrapimportselectorconfiguration

又引入了bootstrapimportselector

这里利用spi加载了propertysourcebootstrapconfiguration

接下来我们看看initialize方法

这里就是使用propertysourcelocator.locate()方法加载配置,然后添加到environment。

比如nacospropertysourcelocator

至此nacos(springcloud)配置加载完毕。

后续补充:naocs共享配置和扩展配置

spring:
  profiles:
    active: dev
  application:
    name: alibaba-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        #共享配置
        shared-configs:
          - data-id: shard-test.yaml
            group: shard_group
            refresh: true
        #扩展配置
        extension-configs:
          - data-id: ext-test.yaml
            group: ext_group
            refresh: true

不管是shared-configs还是extension-configs,对应的data-id都需要加上文件后缀,如.yaml

数组下标越大的配置项优先级越高

不同配置优先级 默认配置 > 扩展配置 > 共享配置

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com