目录
一、什么是Nacos
Nacos/nɑ:kəʊs/的全称为Dynamic Naming and Configuration Service,它是阿里开源的一个整合了动态服务发现、配置管理和服务管理的基础服务平台。服务(Service)是Nacos世界的一等公民,它提供了服务注册与发现、配置管理、动态 DNS服务、服务元数据及流量管理等功能,用于满足微服务架构和云原生应用的需求。
其关键特性如下:
-
服务注册与发现:Nacos 支持多种服务注册发现,包括基于DNS、基于RPC和基于K8s的服务发现。
-
动态配置服务:Nacos 提供了一个集中式的配置管理平台,UI简洁易用,支持动态配置,消除了配置变更时重新部署应用的需要,从而提高了应用的灵活性和可管理性。
-
动态 DNS 服务:Nacos 提供了轻量级的动态DNS服务,可以将服务名映射到实际的网络地址,实现服务的动态访问和负载均衡,支持权重路由,更容易实现灵活的路由策略和流量控制。
-
服务及元数据管理:Nacos提供了数据中心所有服务及元数据的管理功能,包括服务的描述、生命周期、静态依赖分析、健康状态、流量管理、路由及安全策略、服务SLA 以及metrics统计数据,并提供可视化界面展示。
-
服务健康检查:Nacos 内置了健康检查功能,支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查,可以对服务实例的健康状态进行监控和管理。
二、Nacos安装部署
Nacos支持单机(开发和测试环境)、集群(推荐生产环境)和多集群(推荐多数据中心场景)三种部署模式,本文以单机部署为例,详细介绍Nacos安装部署方法。
环境准备
- 推荐硬件配置至少2CCPU/4G内存/60G磁盘。
- 安装64bit JDK 1.8+ Nacos依赖Java运行时环境。
- 安装数据库MySQL5.7 要求版本5.6.5+,方便观察数据存储情况。
安装方法
下载Nacos
从Nacos Github Assets下载nacos-server-2.2.0.tar.gz安装
包并解压
# 下载
wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz
# 解压
tar xvf nacos-server-2.2.0.tar.gz
初始化数据库
首先创建数据库nacos_config和用户nacos,授权所有权限给用户nacos。
# 创建数据库nacos_config
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
# 授权
grant all privileges on nacos_config.* to 'nacos'@'%' identified by 'nacos' with grant option;
# 刷新权限
flush privileges;
数据库初始化sql文件位于./nacos/conf/mysql-schema.sql,执行如下命令导入表结构和数据。
# 导入sql文件,输入密码nacos
mysql -u nacos -p -D nacos_config < ./nacos/conf/mysql-schema.sql
修改配置
Nacos本质上是一个SpringBoot应用,全局配置位于./nacos/conf/application.properties。
设置MySQL数据源连接
务必先启用数据源MySQL,设置spring.datasource.platform=mysql,从2.2.1版本开始设置spring.sql.init.platform=mysql,否则不生效,默认将保存到内嵌的derby数据库。
db.num=1
db.url.0=jdbc:mysql://192.168.5.10:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
Nacos支持多种数据源配置
db.num表示数据源数目。
db.url.<index>表示第index+1个数据源Url配置,index默认从0开始。
db.user.<index>表示第index+1个Url的用户名。
db.password.<index>表示第index+1个Url的密码。
注意:如果db.user和
db.password
没有设置index,
所有Url使用db.user
和db.password
认证,多个用户名和密码会根据逗号切割。如果数据库名称、用户名或密码错误,会报No DataSource set异常,请检查连接是否正确。
开启认证鉴权
Nacos适合内网运行,不可暴露在公网环境,否则会带来安全风险,Nacos内置了默认鉴权插件,通过以下方式开启服务认证鉴权。
# 开启默认鉴权插件
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
# key和value可以自定义,本例中请求api时header需要携带serverIdentity=security
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
# 2.1.0版本后还需要配置插件密钥
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
启动服务器
standalone表示单机模式运行,非集群模式。
# 启动
bin/startup.sh -m standalone
验证日志
启动日志位于/opt/nacos/logs/start.out,出现Nacos started successfully表示启动成功。
2023-08-28 17:16:06,648 INFO Exposing 1 endpoint(s) beneath base path '/actuator'
2023-08-28 17:16:06,678 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'
2023-08-28 17:16:06,694 INFO Nacos started successfully in stand alone mode. use external storage
验证登录
浏览器打开登录界面:http://192.168.5.10:8848/nacos/index.html#/login,默认登录用户名/密码是nacos/nacos。
关闭服务器
bin/shutdown.sh
配置systemctl管理服务
创建Nacos服务的Unit配置文件/lib/systemd/system/nacos.service
可能异常:ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8。
解决方法:通过设置Environment=JAVA_HOME=/path/to/jdk
加载JAVA_HOME环境变量。
[root@node1 nacos]# vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target
[Service]
Environment=JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
Type=forking
ExecStart=/opt/nacos/bin/startup.sh -m standalone
ExecReload=/opt/nacos/bin/shutdown.sh
ExecStop=/opt/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
加载Unit配置文件
systemctl daemon-reload
启动nacos.service
systemctl status nacos.service
设置开机启动
systemctl enable nacos.service
Nacos配置优先级
多个配置加载优先级
本地配置文件优先级
spring:
application:
name: nacos-config-multi
main:
allow-bean-definition-overriding: true
cloud:
nacos:
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
# 用于共享的配置文件
shared-configs:
- data-id: common-1.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-2.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-3.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
......
# 常规配置文件
# 优先级大于 shared-configs,在 shared-configs 之后加载
extension-configs:
- data-id: nacos-config-1.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- data-id: nacos-config-2.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- data-id: nacos-config-3.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- 优先级:扩展配置(extension-configs) > 共享配置(shared-configs)
- 同为扩展配置,下标越大优先级越高:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]
- 同为共享配置,下标越大优先级越高:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]