【Nacos】微服務配置中心介紹

pierre94發表於2019-06-17

一、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 物件提前寫入了。

詳見:

https://github.com/all4you/nacos-tutorial/blob/master/nacos-config-realtime-update/nacos-config-realtime-update.md

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

相關文章