前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊NacosConfigEnvironmentProcessor

聊聊NacosConfigEnvironmentProcessor

作者头像
code4it
发布2019-09-29 20:15:50
1.3K0
发布2019-09-29 20:15:50
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下NacosConfigEnvironmentProcessor

NacosConfigEnvironmentProcessor

nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigEnvironmentProcessor.java

代码语言:javascript
复制
public class NacosConfigEnvironmentProcessor implements EnvironmentPostProcessor, Ordered {

    private NacosConfigProperties nacosConfigProperties;

    private final LinkedList<NacosConfigUtils.DeferNacosPropertySource> deferPropertySources = new LinkedList<>();

    private Function<Properties, ConfigService> builder = properties -> {
        try {
            // TODO And prevent to create a large number of ConfigService optimization point is given
            return NacosFactory.createConfigService(properties);
        } catch (NacosException e) {
            throw new NacosBootConfigException("ConfigService can't be created with properties : " + properties, e);
        }
    };

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        application.addInitializers(new NacosConfigApplicationContextInitializer(this));
        nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment);
        if (enable()) {
            System.out.println("[Nacos Config Boot] : The preload log configuration is enabled");
            loadConfig(environment);
        }
    }

    private void loadConfig(ConfigurableEnvironment environment) {
        NacosConfigUtils configUtils = new NacosConfigUtils(nacosConfigProperties, environment, builder);
        configUtils.loadConfig();
        // set defer NacosPropertySource
        deferPropertySources.addAll(configUtils.getNacosPropertySources());
    }

    boolean enable() {
        return nacosConfigProperties != null && nacosConfigProperties.getBootstrap().isLogEnable();
    }

    LinkedList<NacosConfigUtils.DeferNacosPropertySource> getDeferPropertySources() {
        return deferPropertySources;
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}
  • NacosConfigEnvironmentProcessor实现了EnvironmentPostProcessor, Ordered接口;其getOrder方法返回的是Ordered.LOWEST_PRECEDENCE
  • 其postProcessEnvironment方法往SpringApplication添加了NacosConfigApplicationContextInitializer;同时使用NacosConfigPropertiesUtils.buildNacosConfigProperties创建了nacosConfigProperties
  • 之后判断是否preload log configuration,是的话则执行loadConfig方法,该方法通过NacosConfigUtils.loadConfig加载配置,最后将configUtils.getNacosPropertySources()添加到deferPropertySources

NacosConfigApplicationContextInitializer

nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigApplicationContextInitializer.java

代码语言:javascript
复制
public class NacosConfigApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    private final Logger logger = LoggerFactory.getLogger(NacosConfigApplicationContextInitializer.class);

    private ConfigurableEnvironment environment;

    private final NacosConfigEnvironmentProcessor processor;

    private NacosConfigProperties nacosConfigProperties;

    public NacosConfigApplicationContextInitializer(NacosConfigEnvironmentProcessor configEnvironmentProcessor) {
        this.processor = configEnvironmentProcessor;
    }

    @Override
    public void initialize(ConfigurableApplicationContext context) {
        CacheableEventPublishingNacosServiceFactory singleton = CacheableEventPublishingNacosServiceFactory.getSingleton();
        singleton.setApplicationContext(context);
        environment = context.getEnvironment();
        nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment);
        if (!enable()) {
            logger.info("[Nacos Config Boot] : The preload configuration is not enabled");
        } else {
            Function<Properties, ConfigService> builder = properties -> {
                try {
                    return singleton.createConfigService(properties);
                } catch (NacosException e) {
                    throw new NacosBootConfigException("ConfigService can't be created with properties : " + properties, e);
                }
            };
            NacosConfigUtils configUtils = new NacosConfigUtils(nacosConfigProperties, environment, builder);

            // If it opens the log level loading directly will cache DeferNacosPropertySource release
            if (processor.enable()) {
                configUtils.addListenerIfAutoRefreshed(processor.getDeferPropertySources());
            } else {
                configUtils.loadConfig();
                configUtils.addListenerIfAutoRefreshed();
            }
        }
    }

    private boolean enable() {
        return processor.enable() || nacosConfigProperties.getBootstrap().isEnable();
    }

}
  • NacosConfigApplicationContextInitializer实现了ApplicationContextInitializer接口;其initialize方法在开启preload configuration的时候会创建NacosConfigUtils,若processor也开启了preload configuration则会执行configUtils.addListenerIfAutoRefreshed(processor.getDeferPropertySources()),否则执行configUtils.loadConfig()及configUtils.addListenerIfAutoRefreshed()

小结

  • NacosConfigEnvironmentProcessor实现了EnvironmentPostProcessor, Ordered接口;其getOrder方法返回的是Ordered.LOWEST_PRECEDENCE
  • 其postProcessEnvironment方法往SpringApplication添加了NacosConfigApplicationContextInitializer;同时使用NacosConfigPropertiesUtils.buildNacosConfigProperties创建了nacosConfigProperties
  • 之后判断是否preload log configuration,是的话则执行loadConfig方法,该方法通过NacosConfigUtils.loadConfig加载配置,最后将configUtils.getNacosPropertySources()添加到deferPropertySources

doc

  • NacosConfigEnvironmentProcessor
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NacosConfigEnvironmentProcessor
  • NacosConfigApplicationContextInitializer
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档