研究Nacos一個多月了,對其配置中心多多少少了解了一點。
本文就對Nacos的三大功能之一:服務的配置管理作一定的探索。
主要回答以下幾個問題:
配置中心架構圖
動態更新流程介紹
配置內容,Key-Value?文件?
答:服務端存Key-Value,存MsSQL中
客戶端存本地,存儲路徑:
~/nacos/config/fixed-{address}8848nacos/snapshot/DEFAULT_GROUP/{dataId}
持久層對比,Mysql?Oracle?能否支持分庫?分庫保證CP還是AP?
答:只支持MySQL,不支持分庫。默認是一主一從。
Server端保證是CP還是AP?
看看Maintainer的回答吧
加配置的方式,是頁面配置還是Http請求?
答:控制檯+OpenAPI
- Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常見配置格式
- 在線編輯、語法高亮、格式校驗(幫助用戶高效編輯的同時大幅降低格式錯誤帶來的風險)
- Nacos支持配置標籤的能力(幫助用戶更好更靈活的做到基於標籤的配置分類及管理)
- 支持編輯DIFF能力,幫助用戶校驗修改內容,降低改錯帶來的風險。
取配置的方式,嵌入SDK?Http請求?;配置中心通知還是客戶端自己輪詢?
答:嵌入SDK和Http結合
客戶端維持一個長輪詢,當服務端配置信息發生變更時,客戶端將最新的數據獲取下來之後,保存在了 CacheData 中。所以只需要通過一個無狀態的 http 請求即可獲取到服務端的數據。
客戶端存配置的方式,是直接刷新Java系統配置?是Load到Bean裏?還是落本地文件?
答:Load到Bean裏。
客戶端拉取最新的數據後保存在 CacheData 中,同時更新該 CacheData 的 Md5 值,當下次執行 checkListenerMd5 方法時,若本地的Md5 值和最新配置的Md5值不一樣,就意味着Server端的配置信息發生改變,這時將最新的數據通知給監聽器的持有者。
監聽器獲取配置方式:
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receive: " + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
Spring cloud中@RefreshCope 方式刷新配置:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}