阿里NACOS配置中心学习总结
目前市面上用的比较多的配置中心有:(按开源时间排序)
Disconf(已经不再维护了)
2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年 前了。
Spring Cloud Config
2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
Apollo
2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。
Nacos
2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。
配置中心核心概念的对比
服务配置中心对比
nacos具有Apollo大部分功能,最重要的是配置中心与注册中心打通,可以省去我们在微服务治理方面 的一些投入(比如通过动态 配置来启停线程池等操作)。
nacos支持k8s,apollo配置相比nacos要麻烦点,apollo支持.Net
nacos版本升级比较简单,把服务停了升级jar包就可以了,如图所示:
这里有一篇文章可以对比:https://www.jianshu.com/p/afd7776a64c6 nacos官方文档:https://nacos.io/zh-cn/docs/quick-start.html
这里不做nacos的安装讲解,感兴趣的话,请去官方文档查阅。文档中所说的系统默认为Linux系统。
这里说一下数据源换成mysql,更改用户名密码,以及怎么搭建集群,可以参考这篇文章:https://nacos.io/zh- cn/docs/cluster-mode-quick-start.html
https://blog.csdn.net/qq_32352777/article/details/86560333
要求mysql版本:5.6.5+
初始化sql脚本后,有如下表:
表users,存放了nacos登录用户信息,怎么修改密码
公司nacos账号密码:nacos/ejiajx
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
这里说一下集群启动,以244、245、247三台服务器为例,三台服务器分别执行:
cd /ehome/local/nacos/bin
sh startup.sh
http://192.168.5.244:8848/nacos
http://192.168.5.245:8848/nacos
http://192.168.5.247:8848/nacos
启动后可以看到如下截图
当前192.168.5.247为leader,谁成为leader,跟启动顺序有关,先启动的为leader,如果leader挂了,会从一下候选者选举为leader,
如果192.168.5.247在启动成功后,不会再变成leader,会变成follower(候选者),官方推荐nacos集群(请配置3个或3个以上节 点),这里遵循RAFT协议,过半选举,我是这么理解的,如果集群是2个服务器,一台挂掉了,就剩下一台服务器,没办法过半选 举,更多资料,请参考:https://www.jianshu.com/p/ddbe4209be0f
误操作可以通过查看历史版本,回滚到哪个版本
这里说一下,几个重要的感念:
配置集 ID Data id
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应
用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如
com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
个人理解:每个data id就是一个配置文件,比如text、json、xml、yaml、html、properties等,当成一个配置文件好理解。
配置分组 Group
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分
Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用
DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
个人理解:就是组的概念,默认是DEFAULT_GROUP,可以这么理解,一个项目叫eplat,另一个项目叫mgr,但是他们都是一个 叫uriConfig.properties的配置文件,我的data id是一个名字,怎么区分谁是谁的,通过Group。
命名空间 Namespace
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不 同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
个人理解:使用Namespace来解决多环境问题,比如dev、sit、uat、prod环境切换的问题,本期文章会介绍怎么通过命名空间来 解决不同环境切换问题(官方推荐),使用配置集 ID Data id,可以配置多环境,配置方式很像Spring Cloud Config,Group组 的方式,没有深入研究。
多环境配置
yaml、properties互转工具:https://www.toyaml.com/index.html
建议在项目的resources里新建一个readme.txt总纲文件,里面介绍了使用了哪些配置文件,就是data id的名字,如果data id重名 了,标注group,使用nacos配置中心,所有配置都是同一层的,没有conf、spring目录了,都是根目录
先建立命名空间,标注都要哪些环境
怎么多环境切换,如下图 注意当前是dev环境,后面那个一长串就是你的namespace,public是空字符串的。
如下图可以看到有两个data id叫做ceshi.properties,通过Group来区分它是属于哪个项目的。
新建一个data id,命名建议跟你要替换配置文件一个名字,包括扩展名
配置格式常用的有properties和yaml,这个yaml验证太严格了,建议转成properties格式提交。建议Group:DEFAULT_GROUP,放公共配置,比如数据源,sso.properties各个项目都会用这个,再通过Group的自定义,来 保存各自项目的配置信息。
Nacos Config Spring Boot多种配置格式,以及多配置项的使用
完整参考文章:https://github.com/nacos-group/nacos-spring-boot-project/wiki/spring-boot-0.2.2-
%E4%BB%A5%E5%8F%8A-
0.1.2%E7%89%88%E6%9C%AC%E6%96%B0%E5%8A%9F%E8%83%BD%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C
使用方法
设置参数nacos.config.bootstrap.enable=true,开启配置预加载功能
参考以下配置参数进行设置
预加载不好使,就是nacos.config.ext-config[0].data-id这段配置不可以,请查看你们版本,可能太低了,nacos-spring-boot- project的0.2.2以及0.1.2,我当初换成0.2.2也不可以,然后看了他官方的nacos-config-sample项目的pom文件版本是0.2.3,然后 就好使了。
示例代码:https://github.com/nacos-group/nacos-spring-boot-project/tree/master/nacos-spring-boot-samples/nacos- config-sample
springboot预加载,读取配置文件:文件格式(properties)
MainApplication .java
Test.java
list集合减号空格一定要加 否则就是一条记录中间用空格隔开
springboot预加载,读取配置文件:文件格式(yaml)
MainApplication .java
MapList.java
动态读取data id所有信息:
怎么动态改变日志级别
附上代码:
PrintLogger .java
我的本地磁盘目录:
再进入集群版的文件夹:
再点进快照文件夹:
再点击命名空间文件夹:
再点击去默认分组文件夹DEFAULT_GROUP:
总结:
这里注意,再设置@NacosValue注解中属性autoRefreshed=true的时候,这里的文件会被同步修改,而默认刷新则不会同步本 地文件,由此可看,服务器在读取配置的时候,并不是每次远程从nacos服务器读取,而是读取这个同步在本地的配置信息,从快照 的文件的修改时间可以看出,项目启动的时候,会先同步所有配置文件,不管你是否设置了自动刷新,都会同步,那个nasos.log是 因为没有加@NacosValue这个注解,没有监听,但是如果设置autoRefreshed=false,也就是默认,后续的nacos配置中心的修 改,都不会同步这个本地文件,这也为为什么你的项目不会再识别最新的配置,是因为本地没有改,那么我把本地的配置文件修改 了,那服务器那边会识别这个修改吗?肯定不会的,测试过不会的,你想啊,如果每次从磁盘中IO一次读取这个配置,那效率多低 啊,肯定是放到JVM内存中了,本地这个文件起到持久化的作用。