一、介绍
Nacos (Dynamic Naming and Configuration Service):
在最初开源时,Nacos 选择进行内部三个产品合并统一开源 (Configserver 非持久注册中心,VIPServer 持久化注册中心,Diamond 配置中心)。定位为:一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。所以 Nacos 是一个注册中心组件,但它又不仅仅是注册中心组件。
官网:https://nacos.io/
仓库:https://github.com/alibaba/nacos
二、安装 Nacos
2.1 Windows 安装
Nacos 跟 Eureka 不一样,Nacos 官方给我们了一个程序,我们下载对应的 Windows 版本就行了。
解压缩后 bin 目录下会有启动脚本。
由于 Windows 默认启动 Nacos 是集群模式,用记事本打开 startup.cmd 后将 set MODE="cluster" 改为:set MODE="standalone"
这样就可以启动 Nacos 了,如果还有报错,可以看 log 目录里面的错误日志 logs/nacos.log,看是不是 4888 端口被占用了。
启动成功后就可以访问 http://127.0.0.1:8848/nacos
2.2 Linux 安装
上传提前下载好的安装包到服务器上。
安装 unzip 命令:
apt-get install unzip
解压安装包:unzip nacos-server-2.3.2.zip
解压后目录结构清晰。
进入 nacos/bin 目录,启动单机模式:bash startup.sh -m standalone
然后通过服务器 ip 加上端口访问即可。
三、快速使用
还是跟前面 Eureka 一样,我们也使用第一次微服务的启动项目来学习 Nacos。复制一份,将项目名字和文件里面的项目名改一下即可。
3.1 服务注册/发现
3.1.1 引入 Spring Cloud Alibaba 依赖
在父工程文件中引入 Spring Cloud Alibaba 依赖。
<properties>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
3.1.2 引入 Nacos 依赖
在 order-service 和 product-service 中引入 Nacos 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.1.3 引入 Load Balance 依赖
在 order-service 和 product-service 中引入 Load Balance 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
3.2 修改配置
配置 Nacos 地址:
spring:
application:
name: product-service
cloud:
nacos:
discovery:
server-addr: 服务器 ip 加端口
3.3 远程调用
启动多个服务,测试负载均衡。
为 restTemplate 添加负载均衡注解 @LoadBalanced。
修改 IP 为项目名称。
四、Nacos 负载均衡
生产环境相对是比较恶劣的,我们需要对服务的流量进行更加精细的控制。Nacos 支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。
4.1 服务下线
当某一个节点上接口的性能较差时,我们可以直接在 Nacos 中第一时间对该节点进行下线。下线后这个端口就不会在接收到请求。
4.2 权重配置
除了下线之外,我们也可以配置这个节点的流量权重。
找到对应节点 -> 编辑 -> 在弹出的窗口修改权重值。
但是这样直接修改是我们后端使用的负载均衡就是 Nacos 的,如果不兼容需要去查兼容方法。
如何解决 MSENacos 上修改服务实例的权重不生效问题_微服务引擎 (MSE)-阿里云帮助中心
4.3 开启 Nacos 负载均衡策略
由于我们现在使用的 Spring Cloud LoadBalance 组件自身有负载均衡配置方式,所以不支持 Nacos 的权重属性配置。
我们需要开启 Nacos 的负载均衡策略,让权重配置生效。
在 yml 文件中配置:
spring:
cloud:
loadbalancer:
nacos:
enabled: true
五、同集群优先
Nacos 把同一个机房内的实例,划分为一个集群。所以同集群优先访问,在一定程度上也可以理解为同机房优先访问。
微服务架构下一个服务通常有多个实例,这些实例可以在不同的服务器上,而服务器也可以在不同的机房内。而同一个机房一般在同一个局域网之下,所以当访问服务的时候,同机房的服务速度会更快。
比如 order-service 在上海机房,product-service 在北京和上海机房都有实例,那我们希望可以优先访问上海机房,如果上海机房没有实例,或者实例不可用,再访问北京机房的实例。
5.1 配置集群名称
yml 文件配置集群名称:
spring:
cloud:
nacos:
discovery:
cluster-name: SH
设置其他复制的服务:
-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ
这样我们就可以在 Nacos 管理页面看见集群的分布了。
5.2 开启 Nacos 负载均衡策略
同权重配置:
spring:
cloud:
loadbalancer:
nacos:
enabled: true
5.3 测试
当前的 order-service 服务是在 SH 集群下,现在就只有 9091 和 9092 端口的服务可以收到请求,9090 服务是收不到的。
当 9091 和 9092 端口下线之后,9090 必须要接收请求了。
六、Nacos 健康检查
6.1 两种检查机制
Nacos 作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务。
Nacos 中提供了两种健康检查机制:
客户端主动上报机制:客户端通过心跳上报方式告知服务端 (Nacos 注册中心) 健康状态,默认心跳间隔 5 秒;Nacos 会在超过 15 秒未收到心跳后将实例设置为不健康状态,超过 30 秒将实例删除
服务器端反向探测机制:Nacos 主动探知客户端健康状态,默认间隔为 20 秒健康检查失败后实例会被标记为不健康,不会被立即删除
Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的。
6.2 Nacos 服务实例类型
Nacos 的服务实例 (注册的节点) 分为临时实例和非临时实例:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
Nacos 对临时实例,采取的是客户端主动上报机制,对非临时实例,采取服务器端反向探测机制。
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false
Nacos 会记录每个服务实例的 IP 和端口号,当发现 IP 和端口都没有发生变化时,Nacos 不允许一个服务实例类型发生变化,比如从临时实例,变为非临时实例,或者从非临时实例,变成临时实例。
解决办法:
- 停掉 Nacos
- 删除 Nacos 目录下 /data/protocol/raft 信息,里面会保存应用实例的元数据信息。
七、Nacos 环境隔离
企业开发中,一个服务会分为开发环境,测试环境和生产环境。
- 开发环境:开发人员用于开发的服务器,是最基础的环境。一般日志级别设置较低,可能会开启一些调试信息。
- 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境。
- 生产环境:正式提供对外服务的环境,通常关掉调试信息。
通常情况下,这几个环境是不能互相通信的。Nacos 提供了 namespace(命名空间) 来实现环境的隔离。不同的 namespace 的服务不可见。
7.1 创建 Namespace
默认情况下所有服务都在 public 空间下。
我们可以新建命名空间。
7.2 配置 Namespace
在 yml 文件中配置
spring:
cloud:
nacos:
discovery:
namespace: 005dd957-fa48-41b6-9c1c-9a8a3d7ec7a5
八、Nacos 配置中心
除了注册中心和负载均衡之外,Nacos 还是一个配置中心,具备配置管理的功能。
配置中心就是对配置项进行统一管理。通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件。提高效率的同时,也降低了出错的风险。
8.1 使用配置中心
8.1.1 添加配置
选中配置列表,选择配置环境,为当前所选环境添加配置即可。
- Data ID 设置为项目名称
- 配置内容的数据格式,目前只支持 properties 和 yaml 类型
设置配置内容。
8.1.2 获取配置
引入依赖:
引入 Nacos Config 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置 bootstrap.properties:
微服务启动前,需要先获取 Nacos 中配置,并与 application.yml 配置合并。在微服务运行之前,Nacos 要求必须使用 bootstrap.properties 配置文件来配置 Nacos Server 地址。
spring.application.name=product-service
spring.cloud.nacos.config.server-addr=ip:端口
spring.application.name 需要和 Nacos 配置管理的 Data ID 一致
spring.cloud.nacos.config.server-addr 为 Nacos Server 的地址
8.1.3 编写程序
- @Value 读取配置
- @RefreshScope 配置进行热更新
package com.cloud.product.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/config")
@RefreshScope
@RestController
public class NacosController {
@Value("${nacos.config}")
private String nacosConfig;
@RequestMapping("/get")
public String get() {
return "从 nacos 获取的配置项:" + nacosConfig;
}
}
测试。
8.2 详解
8.2.1 设置命名空间
Nacos 配置管理的命名空间和服务列表的命名空间是分别设置的。默认是 public
Nacos 命名空间配置依然在 bootstrap.properties 中进行配置:
spring.cloud.nacos.config.namespace=命名空间
8.2.2 Data Id
Data Id 格式介绍
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为
spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。默认为 properties
微服务启动时,会从 Nacos 读取多个配置文件:
${prefix}-${spring.profiles.active}.${file-extension} 如:product-servicedev.properties
${prefix}.${file-extension} , 如:product-service.properties
${prefix} 如 product-service
九、Eureka 和 Nacos 的区别
共同点:
区别:
- 功能
Nacos 除了服务发现和注册之外,还提供了配置中心,流量管理和 DNS 服务等功能
- CAP 理论
Eureka 遵循 AP 原则,Nacos 可以切换 AP 和 CP 模式,默认 AP。
Nacos 根据配置识别 CP 或者 AP 模式。如果注册 Nacos 的 Client 的节点是临时节点,那么 Nacos 对这个 Client 节点的效果就是 AP,反之是 CP。AP 和 CP 可以同时混合存在。
- 服务发现
Eureka:基于拉模式。Eureka Client 会定期从 Server 拉取服务信息,有缓存,默认每 30 秒拉取一次。
Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接。