前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务配置中心-Nacos

微服务配置中心-Nacos

原创
作者头像
皮皮熊
修改2019-06-17 11:16:17
2.9K0
修改2019-06-17 11:16:17
举报
文章被收录于专栏:大数据与实时计算

一、Nacos简介

image.png
image.png

Nacos是阿里开源的一个微服务配置中心,其官方宣传:

代码语言:txt
复制
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

目前是github的一个明星项目,高达6k+的star。有大量组织在现网使用Nacos,详见官方issue:https://github.com/alibaba/nacos/issues/273

二、微服务配置中心探讨

1.为什么要配置管理

image.png
image.png

微服务背景下,配置管理呈现两大特征:分散、动态。这两点都很易于理解: 微服务下是不可能一个配置文件管理多个服务,同时同一个服务会分散在海量机器上。这会带来程序配置管理的碎片化,也就是“分散”。同时微服务需要更灵活地更及时地获取到配置,也就是“动态”。

所以传统的静态配置文件\代码写死的管理方式无法满足现在的要求。

2.配置管理策略

image.png
image.png

所以我们的配置管理策略主要是需要这两点

  • 降低运维困难
  • 实时推送能力
image.png
image.png

三、Nacos基础

1.Nacos设计原则

image.png
image.png

Nacos使用Namespace + Group + DataId 来确定一个配置的内容。

2.Nacos的接口

Nacos支持三类接口:

  • OPEN-API: 纯HTTP接口
  • SDK:目前官方社区已有JAVA版本
  • spring注解

简单的demo如下:

代码语言:txt
复制
# OPEN-API
curl -x GET "http://serverIp:8848/nacos/v1/cs/configs?dataId=dataIdparam&group=groupParam&tenant=tenantParam
"
代码语言:txt
复制
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException
代码语言:txt
复制
@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层面看是服务端在推送配置)
代码语言:txt
复制
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的接入。以下是一个完整的例子:

代码语言:txt
复制
			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

image.png
image.png

详见官方的issue,待深入研究

代码语言:txt
复制

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Nacos简介
  • 二、微服务配置中心探讨
    • 1.为什么要配置管理
      • 2.配置管理策略
      • 三、Nacos基础
        • 1.Nacos设计原则
          • 2.Nacos的接口
            • 3.完整的客户端实例
            • 四、一些思考
              • 1.Nacos 客户端是怎么实时获取到 Nacos 服务端的最新数据的?
                • 2.Nacos如何兼容apache的configuration
                  • 2.AP还是CP,还是mixed
                  相关产品与服务
                  云服务器
                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档