Nacos安装及使用
介绍
Nacos 官方地址为https://nacos.io/zh-cn/index.html。由阿里开源,官方定义为:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 具备以下职能:
- 服务发现及管理;
- 动态配置服务;
- 动态 DNS 服务。
Nacos 概念
Nacos 领域模型
数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
Namespace: 可以将NameSpace 分为 开发环境、测试环境、预发布环境、生产环境等 ,作为数据隔离,不同命名空间内服务不能进行通信
Group: 分组 将不同的项目分在不同的分组下
Service: 项目下的不同服务模块
DataId: 服务的配置信息Id
服务模型
服务:可以通过nacos控制台进行
健康检查开关
、元数据
、路由机制
、保护阈值
进行配置
- 保护阈值为 0 - 1 之间的浮点数据,当
健康实例/总实例
的比例低于保护阈值时,nacos会将所有的实例信息返回,从而避免服务产生雪崩- 例如:服务下有10个实例,高负载情况下8个实例即可满足正常请求,如果有5个实例出现问题,成为不健康实例,这时当系统在高负载状态下运行,只有5个健康实例可以使用,那么实例可能因为压力过大而停止服务,从而产生服务雪崩,这是如果有保护阈值,当触发阈值时,nacos会在消费者请求时将所有实例信息返回,这样即使有5个实例不可用,但是他们同样也分担了流量压力,从而以部分服务调用失败来换取服务的部分正常使用,不至于全部不可用,退而求其次
集群:同一个服务可以有实例构成不同的集群 配置参考,
- 可以通过nacos控制台进行
健康检查模式
、元数据
、同步机制
进行配置- 服务消费者请求时会优先提供统一集群信息,可以配置为数据中心标识,降低服务调用延迟及开销,提高性能
实例:多个实例组成集群,可以通过naocs控制台配置
权重
、上下线
、元数据
,同时可以查看ip、端口、健康状态、响应时间
等信息
配置模型
围绕配置,主要有两个关联的实体,一个是配置变更历史(History 方便配置的回滚等操作),一个是服务标签(Tag 用于打标分类,方便索引),由 ID 关联。
Namespace: 可以将NameSpace 分为 开发环境、测试环境、预发布环境、生产环境等 ,作为数据隔离
Group: 分组 将不同的项目分在不同的分组下
DataId: 服务的配置信息Id
实现配置的数据隔离
Nacos 快速部署
我是用的Ubuntu虚拟机安装
环境准备
安装JDK
# 安装jdk
apt-get install openjdk-8-jdk
# 验证版本信息
java -version
配置JAVA_HOME
安装后 JDK 不要忘记设置 JAVA_HOME 环境变量,OpenJDK 默认安装在 /usr/lib/jvm/ 路径下,之后通过编辑 profile 设置 JAVA_HOME 环境变量。
# 编辑环境变量
vim /etc/profile
# 添加以下配置
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# 更新环境变量
root@halt:/home/nacos# source /etc/profile
# 验证
root@halt:/home/nacos# echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
安装Nacos
-
访问 Nacos GitHub:https://github.com/alibaba/nacos/releases/获取 Nacos 最新版安装包地址
-
使用 wget 下载
wget https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz
-
解压安装包
tar -xzvf nacos-server-2.0.3.tar.gz
解压后 Nacos 目录结构如下:
-
bin:保存启用/关闭 Nacos Server 脚本;
-
conf:Nacos Server 配置目录;
-
data:Nacos 数据目录;
-
logs:存放日志目录;
-
target:Nacos Jar 包存放目录;
-
-
以单点方式启动 Nacos。
# 进入脚本目录 cd nacos/bin # 以单机模式启动 bash startup.sh -m standalone
-
访问
关闭Ubuntu虚拟机防火墙
ufw disable
查看虚拟机地址
ip addr
访问:http://192.168.59.102:8848/nacos
其中,8848 端口是 Nacos 对客户端提供服务的端口,7848 是 Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等
默认用户名密码
nacos
Nacos集群部署
集群部署官方文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
克隆虚拟机
将虚拟机克隆成三份 地址分别为
201
202
203
-
修改虚拟机中的ip
cd /etc/netplan/ # 编辑网路配置文件 vim vim 00-installer-config.yaml
# This is the network config written by 'subiquity' network: ethernets: ens33: dhcp4: true addresses: [192.168.59.201/24] optional: true gateway4: 192.168.59.2 nameservers: addresses: [223.5.5.5,223.6.6.6] version: 2
搭建Nacos集群
-
创建cluster配置文件
在nacos下conf目录下创建cluster.conf文件里写入各个节点信息
例如:
192.168.59.201:8848 192.168.59.202:8848 192.168.59.203:8848
-
创建mysql服务器
克隆虚拟机独立部署一个mysql nacos集群靠mysql实现节点之间的数据共享
# 安装mysql apt install mysql-server # 开机启动 systemctl status mysql # 根据提示进行设置 mysql_secure_installation # 允许远程连接 登录mysql mysql -uroot -proot # 进入mysql表 use mysql # 允许root远程登陆 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION; # 重载授权表 FLUSH PRIVILEGES;
关闭mysql绑定本地设置
# 进入 cd /etc/mysql/mysql.conf.d # 编辑mysql配置 vim mysqld.cnf # 注释掉 #bind-address = 127.0.0.1
-
创建nacos数据库
用
nacos/config/nacos-mysql.sql
脚本创建数据库 -
编辑nacos配置文件
编辑数据库配置
cd nacos/conf # 编辑配置 vim application.properties #*************** 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://192.168.59.210:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=mengshuo
使用 scp 将配置传到其他两个节点
scp application.properties root@192.168.59.202:/home/nacos/nacos/conf/ root@192.168.59.203:/home/nacos/nacos/conf/
-
启动nacos 查看效果
展开节点元数据可以看当前节点是 那种角色
Nacos 集群采用 Raft 算法实现。它是一种比较简单的选举算法,用于选举出 Nacos 集群中最重要的 Leader(领导)节点。
在 Nacos 集群中,每个节点都拥有以下三种角色中的一种。
-
Leader:领导者,集群中最重要的角色,用于向其他节点下达指令。
-
Candidate:参选者,参与竞选 Leader 的节点。
-
Follower:跟随者,用于接收来自 Leader 或者 Candidate 的请求并进行处理。
在集群中选举出 Leader 是最重要的工作,产生选举的时机有三个:
-
在 Nacos 节点启动后,还没有产生Leader时选举;
-
集群成员总量变更时重新选举;
-
当 Leader 停止服务后重新选举。
-
Nacos 配置项
SpringBootStarter 配置参考
注册中心
配置项参考:
com.alibaba.cloud.nacos.NacosDiscoveryProperties
中的属性
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
权重 | 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.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
配置中心
配置项参考:
com.alibaba.cloud.nacos.NacosConfigProperties
中的属性用法参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
下图中配置从
com.alibaba.cloud.nacos.NacosConfigProperties
摘取,自己总结的可能有错
仅供参考
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.config.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
dataId名称 | spring.cloud.nacos.config.name | 无 | 定义dataId |
配置分组 | spring.cloud.nacos.config.group | DEFAULT_GROUP | 设置服务所处的分组 |
命名空间 | spring.cloud.nacos.config.namespace | 无 | 设置服务所在命名空间 |
配置文件后缀 | spring.cloud.nacos.config.file-extension | properties | 配置文件后缀 |
用户名 | spring.cloud.nacos.config.username | 无 | 配置中心用户名 |
密码 | spring.cloud.nacos.config.password | 无 | 配置中心密码 |
编码 | spring.cloud.nacos.config.encode | UTF-8 | 配置编码格式 |
前缀 | spring.cloud.nacos.config.prefix | ${spring.application.name} | 配置 dataId 前缀 |
查询配置超时时间 | spring.cloud.nacos.config.timeout | 3000 | 从 nacos 获取配置超时时间 |
连接错误最大数量 | spring.cloud.nacos.config.max-retry | 可容忍的服务器重连错误的最大数量 | |
获取长轮询超时时间 | spring.cloud.nacos.config.config-long-poll-timeout | 获取配置长轮询超时时间 | |
获取配置失败重试时间 | spring.cloud.nacos.config.config-retry-time | 获取配置失败重试时间 | |
是否自定义配置拉取和监听 | spring.cloud.nacos.config.enable-remote-sync-config | false | 如果想在程序第一次开始获取配置的时候自己拉取,并且注册的监听器用于以后的配置更新 设置为true |
接入点 | spring.cloud.nacos.config.endpoint | 无 | Nacos的端点,服务的域名,通过它可以动态获取服务器地址。 |
accessKey | spring.cloud.nacos.config.access-key | 无 | 命名空间的访问密钥 |
secretKey | spring.cloud.nacos.config.secret-key | 无 | 命名空间的密钥 |
上下文路径 | spring.cloud.nacos.config.context-path | nacos 配置服务器的上下文路径 | |
集群名称 | spring.cloud.nacos.config.cluster-name | DEFAULT | 集群名称 |
共享配置信息 | spring.cloud.nacos.config.shared-configs | 无 | 一组共享配置。例如: spring.cloud.nacos.config.shared-configs[0]=xxx |
扩展配置信息 | spring.cloud.nacos.config.extension-configs | 无 | 一组扩展配置 .eg: spring.cloud.nacos.config.extension-configs[0]=xxx |
是否自动刷新配置 | spring.cloud.nacos.config.refresh-enabled | true | 刷新配置的主开关,默认打开 |
下文引用自官方Wiki
支持自定义扩展的 Data Id 配置
Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:
spring.application.name=opensource-service-provider spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # config external configuration # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新 spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties # 2、Data Id 不在默认的组,不支持动态刷新 spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP # 3、Data Id 既不在默认的组,也支持动态刷新 spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP spring.cloud.nacos.config.extension-configs[2].refresh=true
可以看到:
- 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式来支持多个 Data Id 的配置。- 通过
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。- 通过
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。
spring.cloud.nacos.config.extension-configs[n].data-id
的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
# 配置支持共享的 Data Id spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml # 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1 # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false spring.cloud.nacos.config.shared-configs[0].refresh=true
可以看到:
- 通过
spring.cloud.nacos.config.shared-configs[n].data-id
来支持多个共享 Data Id 的配置。- 通过
spring.cloud.nacos.config.shared-configs[n].group
来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。- 通过
spring.cloud.nacos.config.shared-configs[n].refresh
来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。配置的优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
- A: 通过
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置- B: 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置- C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
完全关闭配置
通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config
接入Nacos
最简单的接入
接入Nacos注册中心
详细请参考Wiki: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
添加依赖
<!-- boot启动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 端点监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加配置
spring:
application:
name: simple-service
cloud:
# nacos 配置
nacos:
# 注册中心配置
discovery:
# 注册中心地址 多个以逗号隔开
server-addr: 192.168.59.201:8848,192.168.59.202:8848,192.168.59.203:8848
# 端点监控
management:
endpoints:
web:
exposure:
include: "*"
启用服务注册与发现
@EnableDiscoveryClient
package top.mengshuo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* simpleService 启动类
*
* @author mengshuo
* @since 2021-11-16
*/
@EnableDiscoveryClient
@SpringBootApplication
public class SimpleServiceApplication {
public static void main(String[] args) {
SpringApplication.run(
SimpleServiceApplication.class, args);
}
}
查看服务列表
接入Nacos配置中心
详情请参考Wiki: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
添加依赖
<!-- Nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
添加配置
创建bootstrap.yml 配置文件,
properties
文件也可同时可以按照环境进行区分创建 dev、prod 等,待正式发布时无需修改,直接通过启动参数指定为prod环境,无需再修改为正式环境的配置中心地址等配置
-
bootstrap.yml 配置
spring: application: name: simple-service profiles: active: dev
-
bootstrap-dev.yml 配置
spring: cloud: nacos: config: # 配置中心地址 server-addr: 192.168.59.102:8848 # nacos config dataId 的后缀,也是配置内容的文件扩展名 file-extension: yaml
-
bootstrap-prod.yml 配置
spring: cloud: nacos: config: # 配置中心地址 server-addr: 192.168.59.202:8848 # nacos config dataId 的后缀,也是配置内容的文件扩展名 file-extension: yaml
Nacos配置中心添加配置
在 Nacos Spring Cloud 中,
dataId
的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。同时还可以设置分组、命名空间等配置
我直接将
application.yml
中的配置移动到nacos中 本地配置文件删除 依然可以正常启动并注册到注册中心
动态刷新配置
@Configuration
@RefreshScope
-
创建自定义系统配置类
package top.mengshuo.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; import java.io.Serializable; /** * @author mengshuo * @since 2021-11-16 */ @Data @ConfigurationProperties(prefix = "system") @Configuration @RefreshScope public class SystemConfig implements Serializable { private static final long serialVersionUID = 6537627716715024027L; private String name; private String desc; }
-
创建测试接口
package top.mengshuo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.mengshuo.config.SystemConfig; import javax.annotation.Resource; /** * @author mengshuo * @since 2021-11-16 */ @RequestMapping("/config") @RestController public class ConfigController { @Resource private SystemConfig systemConfig; @GetMapping("/info") public SystemConfig getConfig(){ return this.systemConfig; } }
-
nacos配置中心添加配置
system: name: ${spring.application.name} desc: 123456
-
修改配置并进行对比
system: name: ${spring.application.name} desc: 654321
-
测试结果