前期调研
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) 就是一个配置项。
配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集 ID
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 进行服务的调用。
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置 。
- Maven 3.2.x+;下载 & 配置 。
2.下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
nacos server 版本
目前最新版是 2.0.3
- application.properties是nacos单机启动配置文件。
- application.properties.example单机默认配置文件。
- cluster.conf.example是nacos集群默认配置文件。
- nacos-logback.xml是日志配置文件。
- nacos-mysql.sql是mysql数据库初始化脚本。
- schema.sql是Derby 数据库初始化脚本。
注意
- 在0.7版本之前,在单机模式时nacos使用嵌入式数据库(Derby)实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,所以只要使用0.7及以上版本的nacos,便可以配置mysql数据库,可视化的查看数据的存储情况了。
- 使用mysql数据库时,需要使用mysql5.7以上版本。
由此可见,要想使用nacos就必须提供一个数据库,要么使用内置的Derby,要么使用外置的mysql,在本文使用外置的mysql。
从 Github 上下载源码方式
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
3.持久化配置修改
初始化数据库表
- 在/nacos/conf下找到文件nacos-mysql.sql,在数据库执行该文件内容,完成库表初始化工作。
- 根据nacos-mysql.sql,创建数据库nacos_config
Nacos配置
在/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数据库添加用户
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
4.启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
5.服务注册&发现和配置管理
访问nacos
访问 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"
6.关闭服务器
Linux/Unix/Mac
sh shutdown.sh
Windows
shutdown.cmd
或者双击shutdown.cmd运行文件。
7.设置开机启动
Linux/Unix/Mac
- 进入目录
cd /usr/lib/systemd/system
- 将
nacos.service
拷贝到对应的服务器上 - 重新加载服务
systemctl daemon-reload
- 设置为开机启动
systemctl enable nacos.service
- 查看是否已开机启动
systemctl is-enabled nacos.service
- 查看服务状态
systemctl status nacos.service
- 启用服务
systemctl enable nacos.service
- 启动服务
systemctl start nacos.service
- 停止服务
systemctl stop nacos.service
Windows
环境要求
默认情况下Nacos会将配置信息存储在内嵌存储器中,但通常我们希望在数据库中存储或管理这些配置信息,那么就需要进行持久化修改,目前Nacos仅支持MYSQL5.6以上数据库。
配置说明
Nacos Discovery Starter
配置项 | 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 |
dataId
${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 类型。
ext-config
# 自定义 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)
pom插件说明
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
参考
nacos.service
#
# 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
nacos-metadata.service
#
# /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