一、nacos 简介
Nacos (Dynamic Naming and Configuration Service) 是一个开源的动态服务发现、配置管理和服务管理平台,主要用于云原生应用的构建和管理。它由阿里巴巴开发,旨在帮助开发者更好地管理微服务架构中的服务发现和配置。
主要功能:
-
服务发现:支持服务的注册和发现,使微服务能够轻松找到彼此,支持多种服务注册模式
-
动态配置管理:提供实时的配置管理,可以动态地推送配置变化到客户端,支持多环境管理。
-
服务管理:包括服务的健康检查、服务的元数据管理等,帮助维护服务的稳定性。
-
高可用性:支持集群模式,能够应对高并发的请求,并且具备容错机制。
二、Nacos 安装
Ubuntu 系统下
1. 下载 nacos 压缩包 https://github.com/alibaba/nacos/releases
2. 上传压缩包到某个目录下,使用 unzip 命令(apt-get install unzip)解压
3. 解压后的目录结构如下
bin: Nacos启停脚本
startup.cmd:windows平台的启动脚本
startup.sh:Linux平台的启动脚本
shutdown.cmd: windows平台的停止脚本
shutdown.sh: Linux平台的停止脚本
conf: Nacos配置文件
target: 存放 Nacos 应用的 jar 包
4. 启动:进入nacos/bin目录,输入命令 bash startup.sh -m standalone
standalone 指定为单机模式下启动
5. 启动成功后访问 Nacos :http://IP:port/nacos,port 默认为 8848
三、nacos 入门
1. 服务注册,服务发现
在父工程中引入 Spring Cloud Alibaba 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Spring Boot 和 Spring Cloud 的版本是有一定对应关系的,Spring Cloud Alibaba 也遵循 Spring Cloud 的标准,在引入依赖时,要确认各个版本的对应关系,Spring Cloud Alibaba 和Spring Cloud 版本对应关系,参考官方文档:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/
在对应子工程中引入Nacos依赖和 Load Balance依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
nacos配置
2. 负载均衡
Nacos 支持多种负载均衡策略,包括权重,同机房,同地域,同环境等
服务下线:当某一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线
权重配置:可以配置某个节点的流量权重,然后开启 nacos 负载均衡策略,由于 Spring Cloud LoadBalance 组件自身有负载均衡配置方式,所以不支持 Nacos 的权重属性配置,所有需要开启Nacos 的负载均衡策略,让权重配置生效。
spring:
cloud:
loadbalancer:
nacos:
enabled: true
3. 同集群优先访问
需配置上述负载均衡策略
Nacos把同一个机房内的实例,划分为一个集群,所以同集群优先访问,在一定程度上也可以理解为同机房优先访问;
微服务访问时,应尽量访问同机房的实例,当本机房内实例不可用时,才访问其他机房的实例,通常情况下,因为同一个机房的机器属于一个局域网,局域网访问速度更快一点.
为实例配置集群名称
spring:
cloud:
nacos:
discovery:
server-addr: IP地址 + 端口号 # 127.0.0.1:XXXX
cluster-name: BJ # 集群名称
4. 健康检测
客户端主动上报机制
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,默认心跳间隔5秒
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除
服务器反向探测机制
nacos主动探知客户端健康状态,默认间隔为20秒
健康检查失败后实例会被标记为不健康,不会被立即删除
nacos 服务实例类型
Nacos 的服务实例(注册的节点)分为临时实例和非临时实例
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认类型
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
Nacos对临时实例,采取的是客户端主动上报机制,对非临时实例,采取服务器端反向探测机制
配置⼀个服务实例为永久实例
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为⾮临时实例
设置服务实例类型,重新启动Nacos可能会报错
原因:Nacos 会记录每个服务实例的 IP 和端口号,当发现 IP 和端口都没有发生变化时,Nacos 不允许该服务实例类型发生变化,比如从临时实例变为非临时实例,或从非临时实例变成临时实例
解决办法
停掉 nacos 删除 nacos 目录下 /data/protocol/raft 信息,里面会保存应用实例的元数据信息,再次重启 nacos
5. 配置中心
除了注册中心和负载均衡之外,Nacos还是一个配置中心,具备配置管理的功能。
Namespace 的常用场景之一是不同环境的配置区分隔离,例如开发环境,测试环境和生产环境的配置隔离
配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提高效率的同时,也降低了出错的风险
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在微服务运行之前,Nacos要求必须使用 bootstrap.properties(或.yaml) 配置文件来配置 Nacos Server 地址
${prefix}-${spring.profiles.active}.${file-extension} //dataId 的完整格式
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置
spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active为空时,对应的连接符-也将不存在,datald的拼接格式变成${prefix}.${file-extension},file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型,默认为 properties
微服务启动时,会从 Nacos 读取多个 dataId 配置项并监听(当存在多个dataId 时,(以上述dataId 为例)优先级 为 dataId=oj-manage-dev.yaml > dataId=oj-manage.yaml > dataId=oj-manage)