您好,登錄后才能下訂單哦!
這篇文章主要講解了“nacos中LocalConfigInfoProcessor的原理和應用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“nacos中LocalConfigInfoProcessor的原理和應用”吧!
本文主要研究一下nacos的LocalConfigInfoProcessor
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java
public class LocalConfigInfoProcessor { private static final Logger LOGGER = LogUtils.logger(LocalConfigInfoProcessor.class); static public String getFailover(String serverName, String dataId, String group, String tenant) { File localPath = getFailoverFile(serverName, dataId, group, tenant); if (!localPath.exists() || !localPath.isFile()) { return null; } try { return readFile(localPath); } catch (IOException ioe) { LOGGER.error("[" + serverName + "] get failover error, " + localPath, ioe); return null; } } /** * 獲取本地緩存文件內容。NULL表示沒有本地文件或拋出異常。 */ static public String getSnapshot(String name, String dataId, String group, String tenant) { if (!SnapShotSwitch.getIsSnapShot()) { return null; } File file = getSnapshotFile(name, dataId, group, tenant); if (!file.exists() || !file.isFile()) { return null; } try { return readFile(file); } catch (IOException ioe) { LOGGER.error("[" + name + "]+get snapshot error, " + file, ioe); return null; } } static private String readFile(File file) throws IOException { if (!file.exists() || !file.isFile()) { return null; } if (JVMUtil.isMultiInstance()) { return ConcurrentDiskUtil.getFileContent(file, Constants.ENCODE); } else { InputStream is = null; try { is = new FileInputStream(file); return IOUtils.toString(is, Constants.ENCODE); } finally { try { if (null != is) { is.close(); } } catch (IOException ioe) { } } } } static public void saveSnapshot(String envName, String dataId, String group, String tenant, String config) { if (!SnapShotSwitch.getIsSnapShot()) { return; } File file = getSnapshotFile(envName, dataId, group, tenant); if (null == config) { try { IOUtils.delete(file); } catch (IOException ioe) { LOGGER.error("[" + envName + "] delete snapshot error, " + file, ioe); } } else { try { File parentFile = file.getParentFile(); if (!parentFile.exists()) { boolean isMdOk = parentFile.mkdirs(); if (!isMdOk) { LOGGER.error("[{}] save snapshot error", envName); } } if (JVMUtil.isMultiInstance()) { ConcurrentDiskUtil.writeFileContent(file, config, Constants.ENCODE); } else { IOUtils.writeStringToFile(file, config, Constants.ENCODE); } } catch (IOException ioe) { LOGGER.error("[" + envName + "] save snapshot error, " + file, ioe); } } } /** * 清除snapshot目錄下所有緩存文件。 */ static public void cleanAllSnapshot() { try { File rootFile = new File(LOCAL_SNAPSHOT_PATH); File[] files = rootFile.listFiles(); if (files == null || files.length == 0) { return; } for (File file : files) { if (file.getName().endsWith("_nacos")) { IOUtils.cleanDirectory(file); } } } catch (IOException ioe) { LOGGER.error("clean all snapshot error, " + ioe.toString(), ioe); } } static public void cleanEnvSnapshot(String envName) { File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos"); tmp = new File(tmp, "snapshot"); try { IOUtils.cleanDirectory(tmp); LOGGER.info("success delete " + envName + "-snapshot"); } catch (IOException e) { LOGGER.info("fail delete " + envName + "-snapshot, " + e.toString()); e.printStackTrace(); } } static File getFailoverFile(String serverName, String dataId, String group, String tenant) { File tmp = new File(LOCAL_SNAPSHOT_PATH, serverName + "_nacos"); tmp = new File(tmp, "data"); if (StringUtils.isBlank(tenant)) { tmp = new File(tmp, "config-data"); } else { tmp = new File(tmp, "config-data-tenant"); tmp = new File(tmp, tenant); } return new File(new File(tmp, group), dataId); } static File getSnapshotFile(String envName, String dataId, String group, String tenant) { File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos"); if (StringUtils.isBlank(tenant)) { tmp = new File(tmp, "snapshot"); } else { tmp = new File(tmp, "snapshot-tenant"); tmp = new File(tmp, tenant); } return new File(new File(tmp, group), dataId); } public static final String LOCAL_FILEROOT_PATH; public static final String LOCAL_SNAPSHOT_PATH; static { LOCAL_FILEROOT_PATH = System.getProperty("JM.LOG.PATH", System.getProperty("user.home")) + File.separator + "nacos" + File.separator + "config"; LOCAL_SNAPSHOT_PATH = System.getProperty("JM.SNAPSHOT.PATH", System.getProperty("user.home")) + File.separator + "nacos" + File.separator + "config"; LOGGER.info("LOCAL_SNAPSHOT_PATH:{}", LOCAL_SNAPSHOT_PATH); } }
getFailover方法首先會通過getFailoverFile獲取本地配置文件,然后通過readFile讀取;getSnapshot方法首先通過getSnapshotFile獲取snapshot文件,然后通過readFile讀取;saveSnapshot方法會存儲新的config;cleanAllSnapshot方法會清除snapshot目錄下所有緩存文件
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/CacheData.java
public class CacheData { //...... public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group) { if (null == dataId || null == group) { throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group); } this.name = name; this.configFilterChainManager = configFilterChainManager; this.dataId = dataId; this.group = group; this.tenant = TenantUtil.getUserTenantForAcm(); listeners = new CopyOnWriteArrayList<ManagerListenerWrap>(); this.isInitializing = true; this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant); this.md5 = getMd5String(content); } public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group, String tenant) { if (null == dataId || null == group) { throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group); } this.name = name; this.configFilterChainManager = configFilterChainManager; this.dataId = dataId; this.group = group; this.tenant = tenant; listeners = new CopyOnWriteArrayList<ManagerListenerWrap>(); this.isInitializing = true; this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant); this.md5 = getMd5String(content); } private String loadCacheContentFromDiskLocal(String name, String dataId, String group, String tenant) { String content = LocalConfigInfoProcessor.getFailover(name, dataId, group, tenant); content = (null != content) ? content : LocalConfigInfoProcessor.getSnapshot(name, dataId, group, tenant); return content; } //...... }
CacheData的構造器會通過loadCacheContentFromDiskLocal從本地磁盤加載緩存數據;loadCacheContentFromDiskLocal方法則是通過LocalConfigInfoProcessor.getFailover或LocalConfigInfoProcessor.getSnapshot來獲取數據
LocalConfigInfoProcessor的getFailover方法首先會通過getFailoverFile獲取本地配置文件,然后通過readFile讀取;getSnapshot方法首先通過getSnapshotFile獲取snapshot文件,然后通過readFile讀取;saveSnapshot方法會存儲新的config;cleanAllSnapshot方法會清除snapshot目錄下所有緩存文件
感謝各位的閱讀,以上就是“nacos中LocalConfigInfoProcessor的原理和應用”的內容了,經過本文的學習后,相信大家對nacos中LocalConfigInfoProcessor的原理和應用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。