一、定义NACOS的地址环境变量配置。
SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR=127.0.0.2:8848
bootStrap的配置

最终发现,环境变量会覆盖配置文件 的配置。
- @ConfigurationProperties(NacosConfigProperties.PREFIX)
- public class NacosConfigProperties {
-
- /**
- * Prefix of {@link NacosConfigProperties}.
- */
- public static final String PREFIX = "spring.cloud.nacos.config";
-
- /**
- * COMMAS , .
- */
- public static final String COMMAS = ",";
-
- /**
- * SEPARATOR , .
- */
- public static final String SEPARATOR = "[,]";
-
- private static final Pattern PATTERN = Pattern.compile("-(\\w)");
-
- private static final Logger log = LoggerFactory
- .getLogger(NacosConfigProperties.class);
-
- @Autowired
- @JsonIgnore
- private Environment environment;
-
- @PostConstruct
- public void init() {
- this.overrideFromEnv();
- }
-
- private void overrideFromEnv() {
- if (StringUtils.isEmpty(this.getServerAddr())) {
- String serverAddr = environment
- .resolvePlaceholders("${spring.cloud.nacos.config.server-addr:}");
- if (StringUtils.isEmpty(serverAddr)) {
- serverAddr = environment.resolvePlaceholders(
- "${spring.cloud.nacos.server-addr:localhost:8848}");
- }
- this.setServerAddr(serverAddr);
- }
- if (StringUtils.isEmpty(this.getUsername())) {
- this.setUsername(
- environment.resolvePlaceholders("${spring.cloud.nacos.username:}"));
- }
- if (StringUtils.isEmpty(this.getPassword())) {
- this.setPassword(
- environment.resolvePlaceholders("${spring.cloud.nacos.password:}"));
- }
- }
-
- /**
- * nacos config server address.
- */
- private String serverAddr;
-
- /**
- * the nacos authentication username.
- */
- private String username;
-
- /**
- * the nacos authentication password.
- */
- private String password;
-
- /**
- * encode for nacos config content.
- */
- private String encode;
-
- /**
- * nacos config group, group is config data meta info.
- */
- private String group = "DEFAULT_GROUP";
-
- /**
- * nacos config dataId prefix.
- */
- private String prefix;
-
- /**
- * the suffix of nacos config dataId, also the file extension of config content.
- */
- private String fileExtension = "properties";
-
- /**
- * timeout for get config from nacos.
- */
- private int timeout = 3000;
-
- /**
- * nacos maximum number of tolerable server reconnection errors.
- */
- private String maxRetry;
-
- /**
- * nacos get config long poll timeout.
- */
- private String configLongPollTimeout;
-
- /**
- * nacos get config failure retry time.
- */
- private String configRetryTime;
-
- /**
- * If you want to pull it yourself when the program starts to get the configuration
- * for the first time, and the registered Listener is used for future configuration
- * updates, you can keep the original code unchanged, just add the system parameter:
- * enableRemoteSyncConfig = "true" ( But there is network overhead); therefore we
- * recommend that you use {@link ConfigService#getConfigAndSignListener} directly.
- */
- private boolean enableRemoteSyncConfig = false;
-
- /**
- * endpoint for Nacos, the domain name of a service, through which the server address
- * can be dynamically obtained.
- */
- private String endpoint;
-
- /**
- * namespace, separation configuration of different environments.
- */
- private String namespace;
-
- /**
- * access key for namespace.
- */
- private String accessKey;
-
- /**
- * secret key for namespace.
- */
- private String secretKey;
-
- /**
- * context path for nacos config server.
- */
- private String contextPath;
-
- /**
- * nacos config cluster name.
- */
- private String clusterName;
-
- /**
- * nacos config dataId name.
- */
- private String name;
-
- /**
- * a set of shared configurations .e.g:
- * spring.cloud.nacos.config.shared-configs[0]=xxx .
- */
- private List
sharedConfigs; -
- /**
- * a set of extensional configurations .e.g:
- * spring.cloud.nacos.config.extension-configs[0]=xxx .
- */
- private List
extensionConfigs; -
- /**
- * the master switch for refresh configuration, it default opened(true).
- */
- private boolean refreshEnabled = true;
-
- // todo sts support
-
- }
-
- }
二、调试流程
1.最终会从org.springframework.boot.context.properties.bind.Binder,是这个类的findProperty方法,会将一个配置类BEAN的每个属性都会循环寻找环境变量,配置文件等,是否能找到合适的属性定义,然后进行属性注入。
- private
Object bindObject(ConfigurationPropertyName name, Bindable target, BindHandler handler, - Context context, boolean allowRecursiveBinding) {
- ConfigurationProperty property = findProperty(name, context);
- if (property == null && context.depth != 0 && containsNoDescendantOf(context.getSources(), name)) {
- return null;
- }
- AggregateBinder> aggregateBinder = getAggregateBinder(target, context);
- if (aggregateBinder != null) {
- return bindAggregate(name, target, handler, context, aggregateBinder);
- }
- if (property != null) {
- try {
- return bindProperty(target, context, property);
- }
- catch (ConverterNotFoundException ex) {
- // We might still be able to bind it using the recursive binders
- Object instance = bindDataObject(name, target, handler, context, allowRecursiveBinding);
- if (instance != null) {
- return instance;
- }
- throw ex;
- }
- }
- return bindDataObject(name, target, handler, context, allowRecursiveBinding);
- }

从下面可以看到,环境变量的配置覆盖了bootStrap的配置。
2.具体读取属性配置的实现类org.springframework.boot.context.properties.source.
SpringIterableConfigurationPropertySource


这里将.换成_ ,最终将读取
SystemEnvironmentPropertySource.SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR

3. 
4.最终读取到这个值,并绑定到配置对象的属性中。

5.由于环境变量的优先级高于配置文件,所以会优先读取环境变量的配置,然后读取完就返回了,不会再去配置文件属性列表中寻找。
