2023-09-15  阅读(4)
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105738895

NacosPropertySourceLocator的loadNacosDataIfPresent

先加载,然后把结果放CompositePropertySource 的最前面,加载不到也没关系。

    	private void loadNacosDataIfPresent(final CompositePropertySource composite,
    			final String dataId, final String group, String fileExtension,
    			boolean isRefreshable) {
    		...
    		NacosPropertySource propertySource = this.loadNacosPropertySource(dataId, group,
    				fileExtension, isRefreshable);
    		this.addFirstPropertySource(composite, propertySource, false);
    	}

NacosPropertySourceLocator的loadNacosPropertySource

第一次进来的时候是要去获取的,所以走 nacosPropertySourceBuilder.build

    	private NacosPropertySource loadNacosPropertySource(final String dataId,
    			final String group, String fileExtension, boolean isRefreshable) {
    		if (NacosContextRefresher.getRefreshCount() != 0) {//刷新过了
    			if (!isRefreshable) {//不刷新,直接缓存取
    				return NacosPropertySourceRepository.getNacosPropertySource(dataId,
    						group);
    			}
    		}
    		return nacosPropertySourceBuilder.build(dataId, group, fileExtension,
    				isRefreshable);
    	}

NacosPropertySourceBuilder的build

先加载数据,然后结果封装成NacosPropertySource,放进缓存。

    	NacosPropertySource build(String dataId, String group, String fileExtension,
    			boolean isRefreshable) {
    		Map<String, Object> p = loadNacosData(dataId, group, fileExtension);
    		NacosPropertySource nacosPropertySource = new NacosPropertySource(group, dataId,
    				p, new Date(), isRefreshable);
    		NacosPropertySourceRepository.collectNacosPropertySource(nacosPropertySource);//缓存
    		return nacosPropertySource;
    	}

loadNacosData

NacosConfigService来加载,加载到了就解析成LinkedHashMap返回,否则就是个空的LinkedHashMap

    	private Map<String, Object> loadNacosData(String dataId, String group,
    			String fileExtension) {
    		String data = null;
    		try {
    			data = configService.getConfig(dataId, group, timeout);
    			...
    			Map<String, Object> dataMap = NacosDataParserHandler.getInstance()
    					.parseNacosData(data, fileExtension);
    			return dataMap == null ? EMPTY_MAP : dataMap;
    		}
    		return EMPTY_MAP;
    	}

NacosConfigService的getConfig一

    
        @Override
        public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
            return getConfigInner(namespace, dataId, group, timeoutMs);
        }

首先优先从本地获取,其实就是从本地读取,比如windows的话,就是C:\Users\Administrator\nacos\config\fixed-127.0.0.1_8848_nacos\data下的config-data后者config-data-tenant目录中获取相应配置文件。

    private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
            group = null2defaultGroup(group);//默认组
            ParamUtils.checkKeyParam(dataId, group);//检查参数
            ConfigResponse cr = new ConfigResponse();//创建响应
    
            cr.setDataId(dataId);
            cr.setTenant(tenant);
            cr.setGroup(group);
    
            // 优先使用本地配置
            String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
            if (content != null) {
                LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", agent.getName(),
                    dataId, group, tenant, ContentUtils.truncateContent(content));
                cr.setContent(content);
                configFilterChainManager.doFilter(null, cr);
                content = cr.getContent();
                return content;
            }

具体我就不跟了,就是文件判断在不在,然后读取。

202309152315337991.png

202309152315345862.png

NacosConfigService的getConfig二

如果不本地不存在的话,就从网络读。

     	try {
                String[] ct = worker.getServerConfig(dataId, group, tenant, timeoutMs);
                cr.setContent(ct[0]);
    
                configFilterChainManager.doFilter(null, cr);
                content = cr.getContent();
    
                return content;
            } catch (NacosException ioe) {
              ...
            }
ClientWorker的getServerConfig

用代理请求/v1/cs/configs,传参数dataId,group,tenant获取配置文件。

     public String[] getServerConfig(String dataId, String group, String tenant, long readTimeout)
            throws NacosException {
            String[] ct = new String[2];//放文件内容和类型
            if (StringUtils.isBlank(group)) {
                group = Constants.DEFAULT_GROUP;
            }
    
            HttpResult result = null;
            try {
                List<String> params = null;
                if (StringUtils.isBlank(tenant)) {
                    params = new ArrayList<String>(Arrays.asList("dataId", dataId, "group", group));
                } else {
                    params = new ArrayList<String>(Arrays.asList("dataId", dataId, "group", group, "tenant", tenant));
                }
                result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
            } catch (IOException e) {
    			。。。
            }

让代理去执行请求下篇说吧。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文