Nacos 帮我们解决什么问题?(配置管理篇)

Nacos 是阿里巴巴今年7月份开源的项目,如其名, Naming Configuration Service ,专注于服务发现和配置管理领域。本系列文章,将从 5W1H(What、Where、When、Who、Why、How)全面剖析 Nacos,给大家安利一下 Nacos。本文作为 Nacos 系列文章的开篇,也就从 “What” 开始。我们开始关注一个开源项目的时候,通常最先冒出的 2 个问题是:

  • 它是什么?
  • 它帮我们解决什么问题?

Nacos 是什么?上面已经大概介绍了,更多详细内容可以从 官网Github 了解。

Nacos 能帮我们解决什么问题?本文围绕其“配置管理”功能来解答。

配置,作为代码如影随形的小伙伴,伴随着应用的整个生命周期,我们当然对它也非常的熟悉,想想配置一般都通过哪几种形式存在?

  • 硬编码
  • 配置文件
  • DB 配置表

硬编码

配置项作为类字段的形式存在,如:

public class AppConfig {

    private int connectTimeoutInMills = 5000;

    public int getConnectTimeoutInMills() {
        return connectTimeoutInMills;
    }

    public void setConnectTimeoutInMills(int connectTimeoutInMills) {
        this.connectTimeoutInMills = connectTimeoutInMills;
    }
}

这种形式主要有三个问题:

如果配置是需要动态修改的话,需要当前应用去暴露管理该配置项的接口,至于是 Controller 的 API 接口,还是 JMX ,都是可以做到。

另外,配置变更都是发生在内存中,并没有持久化。因此,在修改配置之后重启应用,配置又会变回代码中的默认值了,这是一个坑啊,笔者就曾经掉进去过,爬了好一会才上岸。

最后一个问题,就是当你有多台机器的时候,要修改一个配置,每一台都得去操作一遍,运维成本可想而知,极其蛋疼。

配置文件

Spring 中常见的 properties、yml 文件,或其他自定义的,如,“conf”后缀等:

# application.properties
connectTimeoutInMills=5000

相比“硬编码”的形式,它解决了第二个问题,持久化了配置。但是,另外两个问题并没有解决,运维成本依旧还是很高的。

配置动态变更,可以是通过类似“硬编码”暴露管理接口的方式,这时,代码中会多一步持久化新配置到文件的逻辑。或者,简单粗暴点,直接登录机器上去修改配置文件,再重启应用,让配置生效。当然,你也可以在代码中增加一个定时任务,如每隔 10s 读取配置文件内容,让最新的配置能够及时在应用中生效,这样也就免去了重启应用这个“较重”的运维操作。

通过增加“持久化逻辑”、“定时任务”让“配置文件”的形式比“硬编码”前进了一小步。

DB 配置表

这里的 DB 可以是 MySQL 等的关系型数据库,也可以是 Redis 等的非关系型数据库。数据表如:

CREATE TABLE `config` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `key` varchar(50) NOT NULL DEFAULT ‘‘ COMMENT ‘配置项‘,
  `value` varchar(50) NOT NULL DEFAULT ‘‘ COMMENT ‘配置内容‘,
  `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_key` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘配置信息‘;

INSERT INTO `config` (`key`, `value`, `updated_time`, `created_time`) VALUES (‘connectTimeoutInMills‘, ‘5000‘, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

它相对于前两者,更进一步,将配置从应用中抽离出来,集中管理,能较大的降低运维成本。

那么,它能怎么解决动态更新配置的问题呢?据我所知,有两种方式。

其一,如同之前一样,通过暴露管理接口去解决,当然,也一样得增加持久化的逻辑,只不过,之前是写文件,现在是将最新配置写入数据库。不过,程序中还需要有定时从数据库读取最新配置的任务,这样,才能做到只需调用其中一台机器的管理配置接口,就能把最新的配置下发到整个应用集群所有的机器上,真正达到降低运维成本的目的。

其二,直接修改数据库,程序中通过定时任务从数据库读取最新的配置内容。

“DB 配置表”的形式解决了主要的问题,但是它不够优雅,带来了一些“累赘”。

Nacos 配置管理

Nacos 真正将配置从应用中剥离出来,统一管理,优雅的解决了配置的动态变更、持久化、运维成本等问题。

应用自身既不需要去添加管理配置接口,也不需要自己去实现配置的持久化,更不需要引入“定时任务”以便降低运维成本。Nacos 提供的配置管理功能,将配置相关的所有逻辑都收拢,并且提供简单易用的 SDK,让应用的配置可以非常方便被 Nacos 管理起来。

如果是在 Spring 中使用 Nacos,只需三个步骤即可:

  • 添加依赖
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-spring-context</artifactId>
    <version>${latest.version}</version>
</dependency>
  • 添加?@EnableNacosConfig?注解启用 Nacos Spring 的配置管理服务。以下示例中,我们使用?@NacosPropertySource?加载了?dataId?为?example?的配置源,并开启自动更新:
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {

}
  • 通过 Spring 的?@Value?注解设置属性值。

注意:需要同时有?Setter方法才能在配置变更的时候自动更新。

public class AppConfig {

    @Value("${connectTimeoutInMills:5000}")
    private int connectTimeoutInMills;

    public int getConnectTimeoutInMills() {
        return connectTimeoutInMills;
    }

    public void setConnectTimeoutInMills(int connectTimeoutInMills) {
        this.connectTimeoutInMills = connectTimeoutInMills;
    }
}

以上的三个步骤,对应用本身几乎没有任何的侵入,1 个依赖 2 注解,寥寥数行,就把配置通过 Nacos 管理起来了。

关于配置的动态更新,对 Nacos Spring 的用户来说,在自身应用中就只是设置 “autoRefreshed” 的一个布尔值。然后在需要修改配置的时候,调用 Nacos 修改配置的接口,或使用 Nacos 的控制台去修改,配置发生变更后, Nacos 就会把最新的配置推送到该应用的所有机器上,简单而高效。

想想之前,为了实现此功能,写了多少冤枉代码,做了多少冤枉的运维工作。要是早一点认识 Nacos,该有多好呀!

总结

本文作为 Nacos 5W1H 系列文章的开篇,从“What” 讲述了 Nacos 配置管理能帮我们解决的问题:以简单、优雅、高效的方式管理配置,实现配置的动态变更,大大降低运维成本,让开发同学早点下班。

当然,Nacos 的配置管理,不单单只有上述的那些功能,还有诸如“灰度发布”、“版本管理”、“快速回滚”、“监听查询”、“推送轨迹”、“权限控制”、“敏感配置(如,数据库连接配置)的加密存储”等等,这些有的已经在 Nacos 中开源实现了,有的在 Nacos 配置管理的阿里云免费产品 ACM 中提供了,当然,后续也会慢慢开源到 Nacos 中,敬请期待。

本系列文章,会持续为大家讲述 Nacos 的点点滴滴,不单单讲述 “Nacos 能帮我们解决什么问题?”,还会深入源码分析“Nacos 是如何做到简单而强大的?”。同时,如果小伙们有兴趣的话,我们还会给大家八卦一下 Nacos 的 稗官野史,关于 Nacos 在阿里内部的历史,关于 Nacos 服务端口的寓意等等。总之,一句话:我有故事,也有美酒,君还何求?

欢迎关注“阿里巴巴中间件”,加入中间件开发者群,与技术同行。

原文地址:http://blog.51cto.com/13995002/2307036

时间: 2024-11-08 23:02:54

Nacos 帮我们解决什么问题?(配置管理篇)的相关文章

阿里云配置中心nacos单机使用MySQl作为数据源配置方法

Nacos数据持久化: 修改Nacos的数据持久化配置为MySQL存储.默认情况下,Nacos使用嵌入式数据库CMDB实现数据的存储.所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的.为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只要支持MySQL的存储配置Nacos的MySQL存储只需要下面三步: 第一步:安装数据库,版本要求:5.6.5+ (我在centos7.4使用yum安装了mysql-5.7) 第二步:初始化MySQL数据库,数据库初始

Zookeeper 到底能帮我们解决哪些问题?

Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式,关于 Zookeeper 的详细架构等内部细节可以阅读 Zookeeper 的源码 下面详细介绍这些典型的应用场景,也就是 Zookeeper 到底能帮我们解决哪些问题?下面将给出

帮用户解决以往消费中的例如信息不透明、使用不便捷、无法按照服务质量付费等痛点(转)

在所有还算得上成功的互联网公司中,大众点评一直是一个异类. 它既不会像其它公司那样像坠落凡间的天使,只需要短短几年的修复,迅速克隆一个“美国公司”,就立马可以腾云驾雾,再次回到天堂:也不像那些泯然众人的公司那样,似乎永远不在舆论的中心,但一直默默在赚钱,只是在某一个瞬间,纳斯达克的钟声将人们唤醒,“哦,原来它这么厉害”! O2O 2.0 的演变 7 月 22 日,久不露面的大众点评 CEO 张涛出现在了成立丽人事业部的发布会上,除了为其新拓展的丽人事业部站台之外,张涛对外纰漏了大众点评未来的发展

辛星彻底帮您解决CSS中的浮动问题

浮动,是CSS布局中必须经过的一道坎,如果不熟悉浮动,那么CSS的布局就如同空中楼阁,而谈到浮动,更多的是和div相结合,div是一个块级元素,这个我前面的博文有介绍,如果大家喜欢我的风格,可以搜索下. 下面我们进入正题,所谓浮动,可以用css的属性float来定义,比如float:left就是向左浮动,float:right就是向右浮动,我们先看一个不浮动的例子把,首先是这个html文件,这个文件我们是一直都不会动它了,它的内容如下: <html> <head> <link

解决eclipse spring配置报错:cvc-elt.1: Cannot find the declaration of element

解决eclipse spring配置报错:cvc-elt.1: Cannot find the declaration of element 'beans'.Referenced file contains errors (http://www.springframework.org/schema/aop/spring-aop-3.1.xsd). 原因是无法从网络上读取到相应的schema文件,但实际上在浏览器中是可以访问的.却一直在eclipse中显示红叉,当然,并不影响编译打包. 查看所依赖

涂料消泡剂彻底帮你解决泡沫烦恼

众所周知涂料使用时最忌讳气泡针孔的出现,一单出现这种问题,如果不及时解决就可能导致一件产品的失败.气泡和针孔的产生主要有两个方面:一在使用过程中使用不规范导致气泡和针孔的出现,这样可以通过正确的指导消除,二生产工艺不完善,这个可以在生产过程中加入涂料消泡剂就能解决.中联邦生产的涂料消泡剂彻底帮你解决泡沫烦恼. 涂料消泡剂是有机聚醚酯化物.矿物油.醇复合型产品,经过特殊工艺精制而成.具有自乳化.易分散.通用性强.抑泡持久等性能.不会产生表面缺陷或影响成膜性,对水性涂料体系有特别效果. 涂料消泡剂主

[转] Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决

说起U盘,相信大家都不陌生. 这个不起眼的小东西在我们日常生活息息相关,一旦损坏可能就会造成一些不必要的麻烦. 最近驱动哥就收到了一大批用户关于U盘问题的相关咨询,一起来看看到底是什么情况吧! 据其中的一位用户反馈,他的电脑是win10系统在插入U盘后却打不开,但是在其他电脑上却可以正常使用,这是什么情况? 下面大家就和驱动哥一起来看看到底是什么情况! 当用户将U盘插入电脑后,电脑上里面及弹出一个[设备未就绪,无法访问]的提示. 遇到这种情况,当然是需要打开驱动人生进行检查啦. 驱动哥指导用户将

解决:Elipse配置Jython Interpreters时报错Error: Python stdlib source files not found

今天学习lynnLi的博客monkeyrunner之eclipse中运行monkeyrunner脚本之环境搭建(四)时,遇到了一个问题,即: lynnLi给出的解决办法是:将Python下的Lib拷贝到sdk中jython-standalone-2.5.3.jar所在目录tools\lib,再次New一个Jython,添加jython-standalone-2.5.3.jar路径即可 但是这样尝试,又报错了: 后来借鉴了这篇文章的做法,成功配置Jython Interpreters: 将\sdk

(已解决)#warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权。

#warning:尚未配置[微信]URL Scheme:wx4868b35061f87884, 无法使用进行授权. (说白了就是注册白名单) " -canOpenURL: failed for URL: "weixin://app/wx4868b35061f87885/" - error: "This app is not allowed to query for scheme weixin"  " 此error源自iOS9 URL Scheme