Nacos是阿里开源的一个微服务配置中心,其官方宣传:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
目前是github的一个明星项目,高达6k+的star。有大量组织在现网使用Nacos,详见官方issue:https://github.com/alibaba/nacos/issues/273
微服务背景下,配置管理呈现两大特征:分散、动态。这两点都很易于理解: 微服务下是不可能一个配置文件管理多个服务,同时同一个服务会分散在海量机器上。这会带来程序配置管理的碎片化,也就是“分散”。同时微服务需要更灵活地更及时地获取到配置,也就是“动态”。
所以传统的静态配置文件\代码写死的管理方式无法满足现在的要求。
所以我们的配置管理策略主要是需要这两点
Nacos使用Namespace + Group + DataId 来确定一个配置的内容。
Nacos支持三类接口:
简单的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");
}
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();
}
}
服务端和客户端直接本质上还是通过 http 进行数据通讯的,之所以有“推”的感觉,是因为服务端主动将变更后的数据通过 http 的 response 对象提前写入了。
详见:
将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();
}
详见官方的issue,待深入研究
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。