【nacos】加载配置文件顺序解析

首先说结论

  • nacos首先加载SharedConfiguration也就是共享配置文件
    cloud.nacos.config.shared-configs下指定,可以是多个
  • 第二步加载扩展配置
    cloud.nacos.config.ext-configs下指定,也可以是多个
  • 第三步根据spring.cloud.nacos.config.prefix(这个如果没有指定的话则默认是application.name)再拼上spring.cloud.nacos.config.file-extension加载
  • 第四步根据spring.cloud.nacos.config.prefix再拼上spring.cloud.nacos.config.file-extension再拼上spring.cloud.nacos.config.file-extension加载
  • 第五步根据spring.cloud.nacos.config.prefix拼上profiles.active再拼上spring.cloud.nacos.config.file-extension加载

即如果我的共享配置指定为application.yml扩展配置为redis.yml,application.name是app1,active是dev的话加载顺序如下

  1. application.yml
  2. redis.yml
  3. app1.yml
  4. app1.yml.yml
  5. app1-dev.yml

这里注意优先级,优先级是跟加载顺序相反,即application.name+active+file-extension的优先级最高

nacos加载配置文件顺序解析

入口class

入口文件在NacosPropertySourceLocator,其中加载的顺序代码如下
this.loadSharedConfiguration(composite);
this.loadExtConfiguration(composite);
this.loadApplicationConfiguration(composite, dataIdPrefix, this.nacosConfigProperties, env);

this.loadSharedConfiguration这里就是先加载的共享配置
this.loadExtConfiguration加载扩展配置
this.loadApplicationConfiguration加载该项目独有的配置,在这个方法里面有分别尝试加载

    private void loadApplicationConfiguration(CompositePropertySource compositePropertySource, String dataIdPrefix, NacosConfigProperties properties, Environment environment) {
        String fileExtension = properties.getFileExtension();
        String nacosGroup = properties.getGroup();
        // dataIdPrefix+fileExtension  即 app.yml
        this.loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup, fileExtension, true);
        // dataIdPrefix+ "." + fileExtension + fileExtension  即 app.yml.yml
        this.loadNacosDataIfPresent(compositePropertySource, dataIdPrefix + "." + fileExtension, nacosGroup, fileExtension, true);
        String[] var7 = environment.getActiveProfiles();
        int var8 = var7.length;

        for(int var9 = 0; var9 < var8; ++var9) {
            String profile = var7[var9];
            String dataId = dataIdPrefix + "-" + profile + "." + fileExtension;
            // ddataIdPrefix + "-" + profile + "." + fileExtension  即 app-dev.yml
            this.loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup, fileExtension, true);
        }

    }

nacos加载按顺序加载完所有配置文件后,根据顺序将list返回

优先级生效的源码

加载配置文件的代码是在PropertySourceBootstrapConfiguration的initialize中

    public void initialize(ConfigurableApplicationContext applicationContext) {
        List<PropertySource<?>> composite = new ArrayList();
        AnnotationAwareOrderComparator.sort(this.propertySourceLocators);
        boolean empty = true;
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        Iterator var5 = this.propertySourceLocators.iterator();

        while(true) {
            Collection source;
            do {
                do {
                    if (!var5.hasNext()) {
                        if (!empty) {
                            MutablePropertySources propertySources = environment.getPropertySources();
                            String logConfig = environment.resolvePlaceholders("${logging.config:}");
                            LogFile logFile = LogFile.get(environment);
                            Iterator var15 = environment.getPropertySources().iterator();

                            while(var15.hasNext()) {
                                PropertySource<?> p = (PropertySource)var15.next();
                                if (p.getName().startsWith("bootstrapProperties")) {
                                    propertySources.remove(p.getName());
                                }
                            }
							//当所有配置文件加载完成后就会进入到这个方法里面将配置参数加载到内存里
                            this.insertPropertySources(propertySources, composite);
                            this.reinitializeLoggingSystem(environment, logConfig, logFile);
                            this.setLogLevels(applicationContext, environment);
                            this.handleIncludedProfiles(environment);
                        }

                        return;
                    }

                    PropertySourceLocator locator = (PropertySourceLocator)var5.next();
                    // 调用所有实现PropertySourceLocator的方法加载配置文件(刚才的入口类就实现了他)
                    source = locator.locateCollection(environment);
                } while(source == null);
            } while(source.size() == 0);

            List<PropertySource<?>> sourceList = new ArrayList();
            Iterator var9 = source.iterator();

            while(var9.hasNext()) {
                PropertySource<?> p = (PropertySource)var9.next();
                if (p instanceof EnumerablePropertySource) {
                    EnumerablePropertySource<?> enumerable = (EnumerablePropertySource)p;
                    sourceList.add(new BootstrapPropertySource(enumerable));
                } else {
                    sourceList.add(new SimpleBootstrapPropertySource(p));
                }
            }

            logger.info("Located property source: " + sourceList);
            composite.addAll(sourceList);
            empty = false;
        }
    }

这里需要重点关注一下,这个就是优先级的原理

private void insertPropertySources(MutablePropertySources propertySources, List<PropertySource<?>> composite) {
        MutablePropertySources incoming = new MutablePropertySources();
        List<PropertySource<?>> reversedComposite = new ArrayList(composite);
        // 重点在这里,当所有配置文件加载完读取之前,spring对配置文件的list做了反转,所以后加载的优先度最高
        Collections.reverse(reversedComposite);
        Iterator var5 = reversedComposite.iterator();

        while(var5.hasNext()) {
            PropertySource<?> p = (PropertySource)var5.next();
            // addFirst这个方法,是加之前先判断如果已经有的话不再加载
            incoming.addFirst(p);
        }

        PropertySourceBootstrapProperties remoteProperties = new PropertySourceBootstrapProperties();
        Binder.get(this.environment(incoming)).bind("spring.cloud.config", Bindable.ofInstance(remoteProperties));
        PropertySource p;
        Iterator var9;
        if (remoteProperties.isAllowOverride() && (remoteProperties.isOverrideNone() || !remoteProperties.isOverrideSystemProperties())) {
            if (remoteProperties.isOverrideNone()) {
                var9 = composite.iterator();

                while(var9.hasNext()) {
                    p = (PropertySource)var9.next();
                    propertySources.addLast(p);
                }

            } else {
                if (propertySources.contains("systemEnvironment")) {
                    if (!remoteProperties.isOverrideSystemProperties()) {
                        var9 = reversedComposite.iterator();

                        while(var9.hasNext()) {
                            p = (PropertySource)var9.next();
                            propertySources.addAfter("systemEnvironment", p);
                        }
                    } else {
                        var9 = composite.iterator();

                        while(var9.hasNext()) {
                            p = (PropertySource)var9.next();
                            propertySources.addBefore("systemEnvironment", p);
                        }
                    }
                } else {
                    var9 = composite.iterator();

                    while(var9.hasNext()) {
                        p = (PropertySource)var9.next();
                        propertySources.addLast(p);
                    }
                }

            }
        } else {
            var9 = reversedComposite.iterator();

            while(var9.hasNext()) {
                p = (PropertySource)var9.next();
                propertySources.addFirst(p);
            }

        }
    }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nacos是一种用于动态配置管理和服务发现的开源平台。在使用Nacos加载多个配置文件时,我们可以通过以下步骤来实现: 1. 创建多个配置文件:首先,我们可以创建多个配置文件,每个文件可以包含不同的配置项。这些配置文件可以是不同的.properties文件或者.yaml文件,根据个人偏好来选择。 2. 注册配置文件Nacos:接下来,我们需要将这些配置文件注册到Nacos中。可以使用Nacos提供的API或者控制台进行配置文件的注册。 3. 在业务应用中加载配置文件:在业务应用中,我们需要引入Nacos的client SDK,并使用SDK提供的API来加载配置文件。可以使用Nacos配置管理功能,以编程方式从Nacos服务器获取配置文件的内容。 4. 指定配置文件配置项:根据需要,我们可以指定要加载配置文件配置项。这可以通过在应用程序代码中指定配置文件配置项的名称或者通过使用注解来实现。 这样,我们就可以在应用程序中加载多个配置文件了。通过这种方式,我们可以轻松地管理和更新多个配置文件,并根据需要加载所需的配置项。同时,Nacos可以提供实时的配置更新功能,如果在Nacos中更新了配置文件,应用程序可以立即获取到最新的配置内容。 综上所述,通过使用Nacos和其提供的API和功能,我们可以方便地加载多个配置文件,实现灵活的配置管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加班狂魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值