nacos配置加载顺序

news2025/1/9 4:06:13

spring boot 调整日志打印情况

logging:
  level:
    com:
      alibaba:
        cloud: debug
#        nacos: debug
    org:
      springframework:
        context: debug
        cloud: debug
#        boot: debug

项目启动时打印了

properties search order:PROPERTIES->JVM->ENV->DEFAULT_SETTING

查看具体代码位置,发现位于 nacos-client 中

SearchableProperties

private List<AbstractPropertySource> sortPropertySourceDefaultOrder(
		AbstractPropertySource... propertySources) {
	final Map<SourceType, AbstractPropertySource> sourceMap = Arrays.stream(propertySources)
			.collect(Collectors.toMap(AbstractPropertySource::getType, propertySource -> propertySource));
	final List<AbstractPropertySource> collect = DEFAULT_ORDER.stream().map(sourceMap::get)
			.collect(Collectors.toList());
	LOGGER.info("properties search order:PROPERTIES->JVM->ENV->DEFAULT_SETTING");
	return collect;
}

其中 DEFAULT_ORDER 引用当前类的全局变量

private static final List<SourceType> DEFAULT_ORDER = Arrays.asList(SourceType.PROPERTIES, SourceType.JVM,
            SourceType.ENV, SourceType.DEFAULT_SETTING);

间接引用 SourceType

package com.alibaba.nacos.client.env;

enum SourceType {
    /**
     * get value from properties.
     */
    PROPERTIES,
    /**
     * get value from jvm args.
     */
    JVM,
    /**
     * get value from system environment.
     */
    ENV,
    /**
     * get value from default setting.
     */
    DEFAULT_SETTING
}

通过模板模式来对各种参数的获取

package com.alibaba.nacos.client.env;

import java.util.Properties;

abstract class AbstractPropertySource {
    
    /**
     * get property's type.
     * @return name
     */
    abstract SourceType getType();
    
    /**
     * get property, if the value can not be got by the special key, the null will be returned.
     * @param key special key
     * @return value or null
     */
    abstract String getProperty(String key);
    
    /**
     * Tests if the specified object is a key in this propertySource.
     * @param key key – possible key
     * @return true if and only if the specified object is a key in this propertySource, false otherwise.
     */
    abstract boolean containsKey(String key);
    
    /**
     * to properties.
     * @return properties
     */
    abstract Properties asProperties();
    
}

AbstractPropertySource的实现类

PROPERTIES

package com.alibaba.nacos.client.env;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;

class PropertiesPropertySource extends AbstractPropertySource {
    
    private final Properties properties = new Properties();
    
    private final PropertiesPropertySource parent;
    
    PropertiesPropertySource() {
        this.parent = null;
    }
    
    PropertiesPropertySource(PropertiesPropertySource parent) {
        this.parent = parent;
    }
    
    @Override
    SourceType getType() {
        return SourceType.PROPERTIES;
    }
    
    @Override
    String getProperty(String key) {
        return getProperty(this, key);
    }
    
    private String getProperty(PropertiesPropertySource propertiesPropertySource, String key) {
        final String value = propertiesPropertySource.properties.getProperty(key);
        if (value != null) {
            return value;
        }
        final PropertiesPropertySource parent = propertiesPropertySource.parent;
        if (parent == null) {
            return null;
        }
        return getProperty(parent, key);
    }
    
    @Override
    boolean containsKey(String key) {
        return containsKey(this, key);
    }
    
    boolean containsKey(PropertiesPropertySource propertiesPropertySource, String key) {
        final boolean exist = propertiesPropertySource.properties.containsKey(key);
        if (exist) {
            return true;
        }
        final PropertiesPropertySource parent = propertiesPropertySource.parent;
        if (parent == null) {
            return false;
        }
        return containsKey(parent, key);
    }
    
    @Override
    Properties asProperties() {
        List<Properties> propertiesList = new ArrayList<>(8);
        
        propertiesList = lookForProperties(this, propertiesList);
        
        Properties ret = new Properties();
        final ListIterator<Properties> iterator = propertiesList.listIterator(propertiesList.size());
        while (iterator.hasPrevious()) {
            final Properties properties = iterator.previous();
            ret.putAll(properties);
        }
        return ret;
    }
    
    List<Properties> lookForProperties(PropertiesPropertySource propertiesPropertySource, List<Properties> propertiesList) {
        propertiesList.add(propertiesPropertySource.properties);
        final PropertiesPropertySource parent = propertiesPropertySource.parent;
        if (parent == null) {
            return propertiesList;
        }
        return lookForProperties(parent, propertiesList);
    }
    
    synchronized void setProperty(String key, String value) {
        properties.setProperty(key, value);
    }
    
    synchronized void addProperties(Properties source) {
        properties.putAll(source);
    }
}

JVM

package com.alibaba.nacos.client.env;

import java.util.Properties;

class JvmArgsPropertySource extends AbstractPropertySource {
    
    private final Properties properties;
    
    JvmArgsPropertySource() {
        this.properties = System.getProperties();
    }
    
    @Override
    SourceType getType() {
        return SourceType.JVM;
    }
    
    @Override
    String getProperty(String key) {
        return properties.getProperty(key);
    }
    
    @Override
    boolean containsKey(String key) {
        return properties.containsKey(key);
    }
    
    @Override
    Properties asProperties() {
        Properties properties = new Properties();
        properties.putAll(this.properties);
        return properties;
    }
}

jvm参数通过 System.getProperties() 来获取。

ENV

package com.alibaba.nacos.client.env;

import java.util.Map;
import java.util.Properties;

class SystemEnvPropertySource extends AbstractPropertySource {
    
    private final Map<String, String> env = System.getenv();
    
    @Override
    SourceType getType() {
        return SourceType.ENV;
    }
    
    @Override
    String getProperty(String key) {
        String checkedKey = checkPropertyName(key);
        if (checkedKey == null) {
            final String upperCaseKey = key.toUpperCase();
            if (!upperCaseKey.equals(key)) {
                checkedKey = checkPropertyName(upperCaseKey);
            }
        }
        if (checkedKey == null) {
            return null;
        }
        return env.get(checkedKey);
    }
    
    /**
     * copy from https://github.com/spring-projects/spring-framework.git
     * Copyright 2002-2021 the original author or authors.
     * Since:
     * 3.1
     * Author:
     * Chris Beams, Juergen Hoeller
     */
    private String checkPropertyName(String name) {
        // Check name as-is
        if (containsKey(name)) {
            return name;
        }
        // Check name with just dots replaced
        String noDotName = name.replace('.', '_');
        if (!name.equals(noDotName) && containsKey(noDotName)) {
            return noDotName;
        }
        // Check name with just hyphens replaced
        String noHyphenName = name.replace('-', '_');
        if (!name.equals(noHyphenName) && containsKey(noHyphenName)) {
            return noHyphenName;
        }
        // Check name with dots and hyphens replaced
        String noDotNoHyphenName = noDotName.replace('-', '_');
        if (!noDotName.equals(noDotNoHyphenName) && containsKey(noDotNoHyphenName)) {
            return noDotNoHyphenName;
        }
        // Give up
        return null;
    }
    
    @Override
    boolean containsKey(String name) {
        return this.env.containsKey(name);
    }
    
    @Override
    Properties asProperties() {
        Properties properties = new Properties();
        properties.putAll(this.env);
        return properties;
    }
}

环境变量通过 System.getenv() 来获取。

DEFAULT_SETTING

package com.alibaba.nacos.client.env;

import com.alibaba.nacos.common.utils.ResourceUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.Properties;

class DefaultSettingPropertySource extends AbstractPropertySource {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSettingPropertySource.class);
    
    private static final String DEFAULT_SETTING_PATH = "classpath:nacos_default_setting.properties";
    
    private final Properties defaultSetting = new Properties();
    
    DefaultSettingPropertySource() {
        try (final InputStream inputStream = ResourceUtils.getResourceUrl(DEFAULT_SETTING_PATH).openStream()) {
            defaultSetting.load(inputStream);
        } catch (Exception e) {
            LOGGER.error("load default setting failed", e);
        }
    }
    
    @Override
    SourceType getType() {
        return SourceType.DEFAULT_SETTING;
    }
    
    @Override
    String getProperty(String key) {
        return defaultSetting.getProperty(key);
    }
    
    @Override
    boolean containsKey(String key) {
        return defaultSetting.containsKey(key);
    }
    
    @Override
    Properties asProperties() {
        Properties properties = new Properties();
        properties.putAll(defaultSetting);
        return properties;
    }
}

默认设置读取 nacos_default_setting.properties 中的配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

股票配资交易系统【实盘】

股票配资系统建设&#xff0c;本文档主要针对实盘股票配资系统。 股票配资交易系统主要包含三部分&#xff1a;App客户端、交易程序服务端、管理后台 App客户端 app客户端是原生应用&#xff0c;非H5生成。客户端主要功能是承接用户的股票订单委托、查询、用户资金转入&#x…

2023.5.12解决Ubuntu中ens33没有ip

在Ubtuntu中的ens33没有ip 如果Ubuntu版本过高 sudo netplan apply如果是Ubuntu 16.04及更早版本 sudo vi /etc/systemd/resolved.conf具体情况如下图所示 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopbac…

java版企业工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

iVX和其它低代码的平台的区别,“低代码/无代码”分三类

前言 这个图非常认真地对整个“低代码”领域做了严格的分类&#xff0c;这个里面并没有把只针对工作流或单纯BI的工具产品划分进去&#xff0c;主要是这一类&#xff0c;在我个人理解里面更像“SaaS”&#xff0c;也就是增强版SaaS产品&#xff0c;这类产品也主要是给业务人员使…

SpringCloud学习-实用篇04

以下内容的代码可见&#xff1a;SpringCloud_learn/day04 1.初始MQ 同步通讯和异步通讯 微服务间通讯有同步和异步两种方式&#xff0c;同步通讯就像打电话需要实时响应&#xff0c;异步通讯就像发邮件不需要马上回复。两种方式各有优劣&#xff0c;比如打电话能立即得到响应&a…

STM8使用pwm接口调试GDS06灰尘传感器

背景 刚好有项目使用GDS06这款传感器&#xff0c;这里简单做个记录。 GDS06接口如下&#xff0c;这里支持串口和PWM的输出到MCU&#xff0c;由于项目采用STM8S003F3P6&#xff0c;资源极其有限。 所以硬件设计的时候&#xff0c;就考虑采用PWM的接口方式&#xff0c;这样只是…

安科瑞有源电力滤波器的设计原理及应用前景

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;该文介绍了有源电力滤波器的工作原理和基本控制方法&#xff0c;并阐述有源电力滤波器的现状及发展前景等等。 关键词&#xff1a;有源电力滤波器&#xff1b;谐波&#xff1b;工作原理&#xff1b;…

方案绞尽脑汁想不出?试试这款AI代写方案

一份计划方案&#xff0c;往往是工作进行下去的核心环节&#xff0c;需要考虑很多因素和变量&#xff0c;在某些情况下&#xff0c;可能没有足够的信息来制定有效的方案。这可能会导致需要额外的研究和调查&#xff0c;以便了解更多关于问题的信息&#xff0c;这将延长制定方案…

侧边拖拉功能

一、页面 <div class"resize-handle" mousedown"startResizing">⋮</div> 二、js data() {return {showSideBar: true,leftPaneWidth: 63, // 左侧区域的初始宽度isResizing: false, // 标记是否正在调整大小startX: 0, // 调整大小开始时的…

Spring AOP 中的切点是什么?如何定义切点?

Spring AOP 中的切点是什么&#xff1f;如何定义切点&#xff1f; 什么是切点&#xff1f; 在 Spring AOP 中&#xff0c;切点&#xff08;Pointcut&#xff09;是指一组连接点&#xff08;Join Point&#xff09;的集合。连接点是程序执行过程中的某个特定点&#xff0c;例如…

初识SpringMVC -- SpringMVC入门保姆级教程(一)

文章目录 前言一、初识SpringMVC1.认识SpringMVC2.SpringMVC入门案例3.SpringMVC开发的一般步骤4.入门案例涉及的知识点5.入门案例工作流程 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能…

阿里云服务器端口怎么打开?详细教程一步步

阿里云服务器端口怎么打开&#xff1f;云服务器ECS端口在安全组中开启&#xff0c;轻量应用服务器端口在防火墙中打开&#xff0c;新手站长以开通80端口为例来详细说下阿里云服务器端口开放图文教程&#xff0c;其他的端口如8080、3306、443、1433也是同样的方法进行开启端口&a…

双轮云台小车实现追踪彩色目标功能

1. 功能说明 在R216a样机上安装一个摄像头&#xff0c;本文示例将实现双轮小车通过二自由度云台自主寻找彩色目标的功能。 2. 结构说明 R216a样机主要是由一个 双轮小车 和一个 2自由度云台 组合而成。 3. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大…

CRM系统软件不好用有哪些原因?如何选择?

CRM系统的实施也会出现无法落地使用的情况&#xff0c;让CRM系统软件名存实亡。这不仅仅只是个例&#xff0c;很多企业即使投入了很大成本&#xff0c;也不能让CRM系统真正用起来。CRM系统软件用不起来&#xff0c;可以排查这三个原因&#xff0c;教你解决&#xff01; 1.操作…

简单粗暴实现el-input只允许输入数字

<el-input input"phoneNumberphoneNumber.replace(/[^0-9.]/g,)" v-model"phoneNumber" maxlength"11" > </el-input> 如果加入type"number"&#xff0c;会在输入框右侧出现这个恶心的东西 尽管可以使用样式来屏蔽掉 …

基于ArcGIS Pro、Python、USLE、R、INVEST模型等多技术融合的生态系统服务构建生态安全格局

目录 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局 第一章 生态安全评价理论及方法介绍 第二章 平台基础 第三章 数据获取与清洗 第四章 基于USLE模型的土壤侵蚀评价 第五章 基于风蚀修正模型的防风固沙功能评估 第六章 水源涵…

联想集团财报:收入持续下滑,联想集团财务前景已恶化

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 联想集团2023财年第三季度财务业绩回顾 联想集团&#xff08;00992&#xff09;于2023年2月16日盘后公布了该公司2023财年第三季度的财报。 财报显示&#xff0c;联想集团的收入已经从2022财年第三季度的201.27亿美元下降到…

西门子PLC如何实现1主多从网口无线通讯

常规来说&#xff0c;多台plc要实现以太网无线连接&#xff0c;首先要先确定以太网线必须正确连接&#xff0c;并建立物理连接。然后需要在PLC端设置好IP地址&#xff0c;以使不同PLC以相同协议可以实现通信交流。最后是建立PLC端数据采集及交换系统&#xff0c;要求在PLC端设置…

一篇必读的物联网平台物模型开发指南,为你解锁未来科技趋势

《高并发系统实战派》-- 值得拥有 文章目录 一、什么是物模型&#xff1f;二、为什么要设计物模型&#xff1f;三、如何设计物模型&#xff1f;设备属性的设计设备服务的设计设备事件的设计 四、物模型案例五、不设计物模型会有什么影响&#xff1f;六、总结 设计物模型可以使物…

热烈欢迎CSDN副总裁邹欣老师入驻知识星球

重磅消息 CSDN 副总裁 邹欣 老师成功入驻知识星球 —— 英雄算法联盟&#xff0c;成为合伙人之一。 这将是未来几年内&#xff0c;IT界最震撼的一次合作&#xff01;我相信就算现在不是&#xff0c;将来必定是&#xff01; 当然&#xff0c;这对我来说也是一种极大的鼓舞&#…