Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
英文全称Dynamic Naming and Configuration Service,即注册发现服务(注册中心)、配置服务(配置中心),在Nacos中服务(Service)是核心。
Nacos是Dubbo体系、Spring Cloud Alibaba体系中重要的注册中心实现。
Nacos = Spring Cloud eurake + Spring Cloud Config。
与同类注册中心产品相对比,存在一定优势,支持CP+AP。
| 特点 | Nacos | Eurake | Zookeeper | Consul |
|---|---|---|---|---|
| 一致性协议 | CP+AP | AP | CP | CP |
| 健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Alive | TCP/Http/gRPC/Cmd |
| 负载均衡 | 权重/metadata/Selector | Ribbon | - | RoundRobin |
| 雪崩保护 | 有 | 有 | 无 | 无 |
| 自动注销实例 | 支持 | 支持 | 支持 | 不支持 |
| 访问协议 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
| 多数据中心 | 支持 | 支持 | 不支持 | 支持 |
| 跨注册中心同步 | 支持 | 不支持 | 不支持 | 支持 |
| SpringCloud | 支持 | 支持 | - | 支持 |
| Dubbo | 支持 | - | 支持 | - |
| K8S | 支持 | - | - | 支持 |
服务发现和服务健康监控:
支持基于DNS和基于RPC的服务发现,对服务健康的实时检查,阻止像不健康的主机或服务实例发送请求。
动态配置服务:
以中心化、外部化、动态化的方式管理所有环境的应用配置和服务配置。
动态DNS服务:
支持权重路由,更容易的实现中间层的负载均衡、路由策略、流量控制。
服务以及元数据管理:
从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
物理的数据中心,资源创建成功后不能更换。
同一地域内,电力和网络互相独立的物理区域。同一可用区内,实例的网络延迟较低。
地域的某个服务的入口域名。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。
通过预定义接口网络访问的提供给客户端的软件功能。
服务提供的标识,通过该标识可以唯一确定其指代的服务。
存储服务实例和服务负载均衡策略的数据库。
在计算机网络上,(通常使用服务名)对服务下的实例的地址和元数据进行探测,并以预先定义的接口提供给客户端进行查询。
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
用于标识服务提供方的服务的属性。
不同的服务可以归类到同一分组。
同一个服务下的所有服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群。
提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。
实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。
以指定方式检查服务下挂载的实例 (Instance) 的健康度,从而确认该实例 (Instance) 是否能提供服务。根据检查结果,实例 (Instance) 会被判断为健康或不健康。对服务发起解析请求时,不健康的实例 (Instance) 不会返回给客户端。
为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例数 (Instance) 占总服务实例数 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群中剩余健康实例 (Instance) 能正常工作。
Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用。
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
你可以通过源码和发行包两种方式来获取 Nacos。
目前最新版是 2.0.3
注意
由此可见,要想使用nacos就必须提供一个数据库,要么使用内置的Derby,要么使用外置的mysql,在本文使用外置的mysql。
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
在/nacos/conf下找到文件application.properties,定位到 Config Module Related Configurations
将原本注释的部分放开并修改为自己的数据库连接信息。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8mb4&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacosPW=123456
mysql> `create user nacos@'localhost' identified by 'nacosPW=123456';`
mysql> `grant all privileges on nacos_config.* to nacos@'localhost' with grant option;`
mysql> `flush privileges;`
mysql> `alter user nacos@'localhost' identified with mysql_native_password by 'nacosPW=123456';`
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --add-port=10245/tcp --permanent
firewall-cmd --reload
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
访问 http://ip:8848/nacos 出现以下页面,代表启动成功,初始密码为 nacos/nacos
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYCvluVu-1660918621208)(…/resource/nacos.png)]
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
sh shutdown.sh
shutdown.cmd 或者双击shutdown.cmd运行文件。
cd /usr/lib/systemd/systemnacos.service拷贝到对应的服务器上systemctl daemon-reloadsystemctl enable nacos.servicesystemctl is-enabled nacos.servicesystemctl status nacos.servicesystemctl enable nacos.servicesystemctl start nacos.servicesystemctl stop nacos.service默认情况下Nacos会将配置信息存储在内嵌存储器中,但通常我们希望在数据库中存储或管理这些配置信息,那么就需要进行持久化修改,目前Nacos仅支持MYSQL5.6以上数据库。
| 配置项 | Key | 默认值 | 说明 |
|---|---|---|---|
| 服务端地址 | spring.cloud.nacos.discovery.server-addr | Nacos Server 启动监听的ip地址和端口 | |
| 服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 注册的服务名 |
| 权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 |
| 网卡名 | spring.cloud.nacos.discovery.network-interface | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 | |
| 注册的IP地址 | spring.cloud.nacos.discovery.ip | 优先级最高 | |
| 注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
| 命名空间 | spring.cloud.nacos.discovery.namespace | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 | |
| AccessKey | spring.cloud.nacos.discovery.access-key | 当要上阿里云时,阿里云上面的一个云账号名 | |
| SecretKey | spring.cloud.nacos.discovery.secret-key | 当要上阿里云时,阿里云上面的一个云账号密码 | |
| Metadata | spring.cloud.nacos.discovery.metadata | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 | |
| 日志文件名 | spring.cloud.nacos.discovery.log-name | ||
| 集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos集群名称 |
| 接入点 | spring.cloud.nacos.discovery.endpoint | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | |
| 是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
| 是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
${prefix}-${spring.profiles.active}.${file-extension}
${prefix} 默认值是 spring.application.name。也可以配置spring.cloud.nacos.config.prefix。spring.profiles.active
${spring.profiles.active} 默认当前环境对应的 profile。注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
${file-extension} 配置内容的数据格式。目前只支持 properties 和 yaml 类型。
# 自定义 Data Id 的配置
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true
# 多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
# spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
# 通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
# 为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:[参考shared-configshe和extension-configs](../config-model/bootstrap.yml)
#
# systemd service file for Nacos Server forking server
#
[Unit]
Description=Nacos Server
Documentation=nacos 2.0.3
Documentation=https://nacos.io/zh-cn/
Documentation=https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html
After=network.target
[Service]
User=root
Type=forking
Environment="JAVA_HOME=/opt/openjdk/jdk1.8.0_311" #改成自己的jdk路径,因为服务脚本的环境和系统环境变量不能共享,所以还得设置才能生效。
ExecStart=/opt/nacos/bin/startup.sh -m standalone #standalone 是单机,默认是集群cluster
ExecReload=/opt/nacos/bin/shutdown.sh
ExecStop=/opt/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#
# /usr/lib/systemd/system
# systemd service file for Nacos Server forking server
#
[Unit]
Description=Nacos Metadata Server
Documentation=Nacos Dubbo Metadata Center
Documentation=nacos 2.0.3
Documentation=https://nacos.io/zh-cn/
Documentation=https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html
Documentation=dubbo 2.7.8
Documentation=https://dubbo.apache.org/zh/
Documentation=dubbo-admin 0.3.0
Documentation=https://github.com/apache/dubbo-admin
After=network.target
[Service]
User=root
Type=forking
Environment="JAVA_HOME=/opt/openjdk/jdk1.8.0_311" #改成自己的jdk路径,因为服务脚本的环境和系统环境变量不能共享,所以还得设置才能生效。
ExecStart=/opt/nacos-metadata/bin/startup.sh -m standalone #standalone 是单机,默认是集群cluster
ExecReload=/opt/nacos-metadata/bin/shutdown.sh
ExecStop=/opt/nacos-metadata/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target