文章目錄
一、Nacos簡介
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZmCpjvtb-1585720730083)(https://ask.qcloudimg.com/draft/1060300/m0qjivhld2.png)]
Nacos是阿里開源的一個微服務配置中心,其官方宣傳:
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
目前是github的一個明星項目,高達6k+的star。有大量組織在現網使用Nacos,詳見官方issue:https://github.com/alibaba/nacos/issues/273
二、微服務配置中心探討
1.爲什麼要配置管理
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CXdzg3ss-1585720730085)(https://ask.qcloudimg.com/draft/1060300/x0ntfth9rc.png)]
微服務背景下,配置管理呈現兩大特徵:分散、動態。這兩點都很易於理解: 微服務下是不可能一個配置文件管理多個服務,同時同一個服務會分散在海量機器上。這會帶來程序配置管理的碎片化,也就是“分散”。同時微服務需要更靈活地更及時地獲取到配置,也就是“動態”。
所以傳統的靜態配置文件\代碼寫死的管理方式無法滿足現在的要求。
2.配置管理策略
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jUF0Yv24-1585720730086)(https://ask.qcloudimg.com/draft/1060300/pfqzf8hk22.png)]
所以我們的配置管理策略主要是需要這兩點
- 降低運維困難
- 實時推送能力
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NxBrpmtV-1585720730087)(https://ask.qcloudimg.com/draft/1060300/e2mw86ijfo.png)]
三、Nacos基礎
1.Nacos設計原則
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xXjAAdCk-1585720730087)(https://ask.qcloudimg.com/draft/1060300/4my7q63n1l.png)]
Nacos使用Namespace + Group + DataId 來確定一個配置的內容。
2.Nacos的接口
Nacos支持三類接口:
- OPEN-API: 純HTTP接口
- SDK:目前官方社區已有JAVA版本
- spring註解
簡單的demo如下:
# OPEN-API
curl -x GET "http://serverIp:8848/nacos/v1/cs/configs?dataId=dataIdparam&group=groupParam&tenant=tenantParam
"
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException
@NacosInjected
private ConfigService configService;
@Test
public void testPublishConfig() throws NacosException {
configService.publishConfig(DATA_ID, DEFAULT_GROUP, "9527");
}
3.完整的客戶端實例
- 生成一個configService
- configService獲取配置(getConfig)(SDK層面看是拉配置)
- configService調用addListener方法監聽服務端的變化(SDK層面看是服務端在推送配置)
String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("recieve1:" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
// 測試讓主線程不退出,因爲訂閱配置是守護線程,主線程退出守護線程就會退出。 正式代碼中無需下面代碼
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
四、一些思考
1.Nacos 客戶端是怎麼實時獲取到 Nacos 服務端的最新數據的?
服務端和客戶端直接本質上還是通過 http 進行數據通訊的,之所以有“推”的感覺,是因爲服務端主動將變更後的數據通過 http 的 response 對象提前寫入了。
詳見:
2.Nacos如何兼容apache的configuration
將Nacos的SDK與apache的configuration結合起來,儘量少地修改我們的業務代碼以實現Nacos的接入。以下是一個完整的例子:
String serverAddr = "localhost";
String dataId = "DATA_ID";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
// 加載文件前設置分隔符失效(不使用任何分隔符).
config.setDelimiterParsingDisabled(true);
// 將字符串轉換成PropertiesConfiguration格式
config.load(new ByteArrayInputStream(content.getBytes()));
configService.addListener(dataId, group, new Listener() {
// 監聽變化
public void receiveConfigInfo(String configInfo) {
try {
// 需要先clear再load,不然load不生效
config.clear();
config.load(new ByteArrayInputStream(configInfo.getBytes()));
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
public Executor getExecutor() {
return null;
}
});
} catch (ConfigurationException e) {
logger.error("create conf file error.", e);
e.printStackTrace();
}
2.AP還是CP,還是mixed
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PyWzvG0g-1585720730088)(https://ask.qcloudimg.com/draft/1060300/o101oyarqw.png)]
詳見官方的issue,待深入研究
文章首發:
https://cloud.tencent.com/developer/article/1446931