文章目录
一、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