聊聊NacosConfigEnvironmentProcessor

  • 2019 年 10 月 8 日
  • 筆記

本文主要研究一下NacosConfigEnvironmentProcessor

NacosConfigEnvironmentProcessor

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

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

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