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) {
。。。
}
讓代理去執行請求下篇說吧。
好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。