Spring Cloud 2.2.2 源碼之二十八nacos客戶端獲取配置原理三

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;
        }

具體我就不跟了,就是文件判斷在不在,然後讀取。
在這裏插入圖片描述
在這裏插入圖片描述

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) {
			。。。
        }

讓代理去執行請求下篇說吧。

好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章