Nacos是阿里开源的一个项目,他可以致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理解决方案。
我们这次主要介绍配置管理和服务发现。
1.什么是配置中心
1.什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数,启动参数等。
配置主要有一下几个特点:
* 配置是独立于程序的只读变量
。配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
* 配置伴随应用的整个生命周期
。配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号,系统在运行过程中需要读取定时策略执行定时任务等。
* 配置可以有多种加载方式
。常见的有程序内部hard code ,配置文件,环境变量,启动参数,基于数据库等
* 配置需要治理
。同一份程序在不同的环境(开发,测试,生产),不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境,集群配置管理
2.什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图
下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
2.Nacos简介
1.主流配置中心对比
目前市面上用的比较多的配置中心有:Spring Clound Config, Apollo,Nacos和Disconf等。
由于Disconf不再维护,下面主要对比Spring Clound Config, Apollo和Nacos
2.Nacos简介
Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现,配置管理,服务治理的综合性解决方案。
官方的介绍是这样的:
官方地址:https://nacos.io/zh-cn/docs/what-is-nacos.html
3.Nacos特性
Nacos主要提供以下四大功能:
1.服务发现和服务健康检查
Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
2.动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
3.动态DNS服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
4.服务和元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的表述,生命周期,服务的静态依赖分析,服务的健康状态,服务的流量管理,路由及安全策略。
3.安装Nacos Server
1.预备环境准备
Nacos依赖java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置maven环境,请确保是在以下版本环境中安装使用;
- 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
- 64 bit JDK 1.8+;https://www.cnblogs.com/qingbaizhinian/p/12201073.html
- Maven 3.2.x+;https://www.cnblogs.com/qingbaizhinian/p/12337513.html
基础环境的准备我这里就不做演示了,可以参考上面链接。
2.部署的过程
#下载Nacos稳定发布包 [root@linux-test-no src]# wget https://github.com/alibaba/nacos/releases/download/1.2.1/nacos-server-1.2.1.tar.gz 这里一般官方下载比较慢,我这里有下好的可以用 链接:https://pan.baidu.com/s/16XBUXEFG1S2IYmKVmEAZew 提取码:f7q8 #解压运行Nacos包 [root@linux-test-no ~]# tar -zxvf nacos-server-1.2.1.tar.gz #编辑配置 vim conf/application.properties 一般默认配置就够用了,如果有特殊需求可参考配置列表进行自定义配置 #运行 Nacos bin/startup.sh -m standalone
[root@linux-test-no nacos]# bin/startup.sh -m standalone
这里是以单机模式运行的命令,如果要配置集群需要编辑conf/cluster.conf 文件,并且需要在每个Nacos实例内conf/application.properties 配置数据库连接信息 #启动完毕访问http://ip:8848/nacos,默认账号密码都是nacos
3.OPEN API配置管理测试
启动nacos成功之后,可通过nacos提供的http api验证nacos服务运行是否正常。
下边我们通过curl工具来测试nacos的open api:
curl是开发中常用的命令行工具,可以用作http协议测试。
通过下面的命令进行测试,通过测试可判断nacos是否正常工作:
发布配置
[root@linux-test-no ~]# curl -X POST "http://172.31.46.38:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
上边的命令表示向nacos发布一个配置:
获取配置
向nacos发布配置成功,就可以通过客户端从nacos获取配置信息,执行下面的命令
[root@linux-test-no ~]# curl -X GET "http://172.31.46.38:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test" HelloWorld
通过测试发现,可以从nacos获取前边发布的配置:HelloWorld
4.关闭服务器
关闭nacos服务的方式如下:
[root@linux-test-no ~]# nacos/bin/shutdown.sh The nacosServer(24570) is running... Send shutdown request to nacosServer(24570) OK
5.外部mysql数据库支持(推荐做)
单机模式是nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤:
1.安装数据库,版本要求:5.6.5+,mysql8以下
2.初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome/conf/nacos-mysql.sql
3.修改${nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url,用户名和密码。
#部署数据库的过程我们这里就不演示了。 #首先创建进到数据库里创建nacos_config库并验证 mysql> create database nacos_config; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nacos_config | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) #然后进入到nacos_config库下,并导入数据库初始化文件。 mysql> use nacos_config; Database changed mysql> select database(); +--------------+ | database() | +--------------+ | nacos_config | +--------------+ 1 row in set (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql> source /root/nacos/conf/nacos-mysql.sql; 。。。。。 mysql> show tables; +------------------------+ | Tables_in_nacos_config | +------------------------+ | config_info | | config_info_aggr | | config_info_beta | | config_info_tag | | config_tags_relation | | group_capacity | | his_config_info | | permissions | | roles | | tenant_capacity | | tenant_info | | users | +------------------------+ 12 rows in set (0.00 sec) #接下来就是修改nacos的配置文件application.properties,增加支持mysql数据源配置。
[root@linux-test-no ~]# vim nacos/conf/application.properties
spring.datasource.platform=mysql #在配置文件里找到这一行,取消注释,然后在在其下加入下面几行
db.num=1
db.url.0=jdbc:mysql://172.31.46.38:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true #这里的地址填你数据库服务所在的地址
db.user=root #这里写对nacos_config库有权限的用户和密码,我这里为了方便直接用了数据库的root账号和密码,生产中不建议。
db.password=LiuBo@2020
#接下来我们重启一下nacos,使配置生效
[root@linux-test-no ~]# nacos/bin/shutdown.sh
The nacosServer(7692) is running...
Send shutdown request to nacosServer(7692) OK
[root@linux-test-no ~]# nacos/bin/startup.sh -m standalone
#重新执行上面的发布配置命令,然后到Mysql数据库表中进行验证,看是否nacos配置mysql成功
mysql> select * from config_info; #这里重新执行发布配置命令我这里就省略掉了,执行完之后我们看到confing_info表下生成了表记录,证明nacos关联mysql配置成功
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
| id | data_id | group_id | content | md5 | gmt_create | gmt_modified | src_user | src_ip | app_name | tenant_id | c_desc | c_use | effect | type | c_schema |
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
| 1 | nacos.cfg.dataId | test | HelloWorld | 68e109f0f40ca72a15e05cc22786f8e6 | 2020-07-15 16:32:17 | 2020-07-15 16:32:17 | NULL | 172.31.46.38 | | | NULL | NULL | NULL | NULL | NULL |
+----+------------------+----------+------------+----------------------------------+---------------------+---------------------+----------+--------------+----------+-----------+--------+-------+--------+------+----------+
1 row in set (0.00 sec)
4.Nacos配置入门
1.发布配置
首先在nacos发布配置。
浏览器访问我们部署的nacos地址:http://172.31.46.38:8848/nacos
打开nacos的控制台,并点击菜单配置管理-配置列表:
在Nacos添加如下的配置:
Data ID: nacos-simple-demo.yaml
Group: DEFAULT_GROUP
配置格式: YAML
配置内容: common:
config1: something
Note:注意dataid是以properties(默认的文件扩展名方式)为扩展名,这里使用yaml。
操作过程如下图:
2.nacos客户端获取配置(这里主要介绍面向Spring Boot使用者的)
这里主要从官方文档里借鉴下来的,其他开发语言应用nacos配置可以看https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
这块开发看起来应该简单点,在自动化部署过程中一般建议开发把配置成可以通过启动参数来集成nacos的。
1.修改需要获取Nacos配置的项目里的pom.xml文件,加入下面的配置。
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
2.在 application.properties
中配置 Nacos server 的地址:
nacos.config.server-addr=127.0.0.1:8848
3.使用 @NacosPropertySource
加载 dataId
为 example
的配置源,并开启自动更新:
@SpringBootApplication @NacosPropertySource(dataId = "example", autoRefreshed = true) public class NacosConfigApplication { public static void main(String[] args) { SpringApplication.run(NacosConfigApplication.class, args); } }
4.通过 Nacos 的 @NacosValue
注解设置属性值。
@Controller @RequestMapping("config") public class ConfigController { @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true) private boolean useLocalCache; @RequestMapping(value = "/get", method = GET) @ResponseBody public boolean get() { return useLocalCache; } }
5.启动 NacosConfigApplication
,调用 curl http://localhost:8080/config/get
,返回内容是 false
。
6.通过调用 Nacos Open API 向 Nacos server 发布配置:dataId 为example
,内容为useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"
7.再次访问 http://localhost:8080/config/get
,此时返回内容为true
,说明程序中的useLocalCache
值已经被动态更新了。
5.Nacos配置管理基础应用
1.Nacos配置管理模型
对于Nacos配置管理,通过Namespace,group,Data ID能够定位到一个配置集。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含系统的各种配置信息,例如,一个配置集可能包含了数据源,线程池,日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID;
配置项
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以key=value的形式存在。列如我们常配置系统的日志输出级别(longLevel=INFO|WARN|ERROR)就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如Buy或Trade)来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。配置分组的常见场景:可用于区分不同的项目或应用,列如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。
命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。列如可以隔离开发环境,测试环境和生产环境,因为他们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命令空间下,可以存着相同名称的配置分组(Group)或配置集。
最佳实践
Nacos抽象定义了Namespace,Group,Data ID的概念,具体这几个概率代表什么,取决我们把它们看成什么,这里推荐给大家一种用法,如下图:
Namespace:代表不同环境,如开发,测试,生产环境。
Group:代表某项目,如XX医疗项目,XX电商项目;
Dataid:每个项目下往往有若干个工程,每个配置集(DataID)是一个工程的主配置文件
获取某配置集的代码:
获取配置集需要指定:
1.nacos服务地址,必须指定
2.namespace,如不指定默认public
3.group,如不指定默认DEFAULT_GROUP
4.dataId,必须指定
代码如下:
看懂即可不用运行。
以上代码说明将从地址为127.0.0.1:8848的nacos配置中心获取配置,通过以下信息定位配置集,
注意:namespace需要指定id。
2.命名空间管理
1.namespace隔离设计
单个用户使用nacos client,可通过不同的namespace来做不同环境下的配置/服务 数据隔离
2.命名空间管理
3.配置管理
Nacos支持基于Namespace和Group都配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用,模块等分组管理微服务的大量配置,在配置管理中主要提供了配置历史版本,回滚,订阅者查询等核心管理能力。
1.配置列表
编辑DIFF
Nacos支持编辑DIFF能力,帮助用户体验修改内容,减低改错带来的风险。
配置集导出
此功能一般用于拷贝老namespace里的配置集到新的namespace下面。过程如下
上述方法可以跨主机导入配置集。还有一种在nacos本地服务器进行不同namespace下配置集的复制拷贝。过程如下。
历史版本
这里主要的功能就是记录配置集的修改操作,对配置集可以进行回滚操作。操作过程如下。
监听查询
Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配置变更是否推送到client端。
通过以下代码可对某配置进行监听: