Nacos 实战指南:服务注册、分级与环境隔离
Nacos 实战指南:服务注册、分级与环境隔离
- 一 . 认识、安装 Nacos
- 二 . 服务注册到 Nacos
- 2.1 引入依赖
- 2.2 配置 Nacos 地址
- 2.3 重启服务
- 2.4 小结
- 三 . 服务分级存储模型
- 3.1 给 user-service 配置集群
- 3.2 同集群优先的负载均衡
- 3.3 小结
- 四 . 权重配置
- 五 . 环境隔离
- 5.1 什么是环境隔离 ?
- 5.2 环境隔离的演示
- 5.2.1 创建命名空间
- 5.2.2 给微服务配置 namespace
- 5.3 小结
- 六 . Nacos 与 EureKa 的区别
- 6.1 Nacos 注册中心细节分析
- 6.2 临时实例 VS 非临时实例
- 6.3 小结
- 七 . CAP 定理 (了解)
- 7.1 数据一致性
- 7.2 服务可用性
- 7.3 分区容错性
在微服务开发中,选择合适的服务注册中心是确保系统高效运行的关键。Nacos 作为阿里巴巴推出的产品,具有丰富的功能和良好的性能。本文将从 Nacos 的安装入手,详细介绍其服务注册、存储模型和权重配置等方面的内容,最后对比它与 Eureka 的不同,为您的微服务架构提供优化方案
本专栏的内容均来自于 B 站 UP 主黑马程序员的教学视频,感谢你们提供了优质的学习资料,让编程不再难懂。
专栏地址 : https://blog.csdn.net/m0_53117341/category_12835102.html
一 . 认识、安装 Nacos
Nacos 是阿里巴巴的产品 , 现在作为 Spring Cloud 的一个组件 .
它相比于 Eureka 来说 , 功能更加丰富 , 在国内的受欢迎程度较高 .
那接下来 , 我们带大家安装一下 Nacos
番外 2 : Nacos 的安装
小结 : Nacos 服务搭建
- 下载安装包
- 解压
- 在 bin 目录下运行指令 : startup.cmd -m standalone
二 . 服务注册到 Nacos
2.1 引入依赖
第一步 : 在 cloud-demo 的父工程中 , 添加 spring-cloud-alibaba 的管理依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
第二步 : 替换掉 order-service 和 user-service 中原有的 EureKa 依赖
将 Nacos 的依赖替换掉原有的 EureKa 依赖
<!-- Nacos 的客户端依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.2 配置 Nacos 地址
修改 order-service 和 user-service 中的 application.yml 文件 , 注释掉 EureKa 的配置 , 添加 Nacos 的地址
spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服务端的地址
如果报错的话 , 将配置修改成这样
spring: cloud:nacos:server-addr: localhost:8848 # Nacos 服务端的地址username: nacos # Nacos 的账号password: nacos # Nacos 的密码
修改 user-service :
修改 order-service :
2.3 重启服务
然后我们回到 Nacos 的页面看一眼
然后我们启动了两个 user-service 服务 , 那他的实例数就是 2
那我们点击详情 , 还可以看到一系列更具体的信息
2.4 小结
Nacos 服务注册或发现
- 引入 nacos.discovery 依赖
- 配置 Nacos 地址 : spring.cloud.nacos.server-addr
三 . 服务分级存储模型
服务分级存储模型.png
3.1 给 user-service 配置集群
我们先将 user-service 服务停止掉
那在 Nacos 的页面中 , user-service 服务并不会立马消失 , 稍等片刻即可
那接下来 , 我们对 user-service 来去设置集群信息
spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服务端的地址username: nacos # Nacos 的账号password: nacos # Nacos 的密码discovery:cluster-name: HZ # 配置集群名称, 也就是机房位置, 比如: HZ-杭州
然后重新运行 user-service , 我们一个一个来运行
那我们修改一下配置文件 , 将集群修改成上海
3.2 同集群优先的负载均衡
那我们在 order-service 下面 , 也去设置集群信息
然后注释掉我们下面设置的随机规则
那就代表现在 Nacos 负载均衡策略执行的是默认的策略 , 我们可以看一下默认的策略是什么 ?
此时重启 order-service 服务
那按照我们的理解 , 我们访问 order-service 服务 , 那他就会选择同集群下面的节点
但是我们发现 , 他依然是按照负载均衡的策略访问每个节点的 .
那我们需要进行配置 , 才能够实现访问同一集群下面的节点的这种策略
userservice: # 给某个微服务配置负载均衡规则, 这里是 userservice 服务ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 访问同一集群下面的节点
那这个 NacosRule 也应该是实现了 IRuler 接口的
那接下来我们继续重启 , 这次想要达到的效果就是访问同一集群下面的实例 , 那就会永远访问 8082 端口
我们可以发现 , 这次就一直访问 8082 端口了
那如果说 , 同集群下面的实例挂掉了 , 那会怎么办呢 ?
此时我们再去访问 order-service 服务 , 他就会一直访问 8081 端口
3.3 小结
Nacos 服务分级存储模型
- 一级是服务 , 例如 : userservice
- 二级是集群 , 例如 : HZ 或者 SH
- 三级是实例 , 例如杭州机房部署了 user-service 的服务器
如何修改实例的集群属性 : 修改 application.yml 文件 , 添加 spring.cloud.nacos.discovery.cluster-name 属性
四 . 权重配置
那在实际部署的过程中 , 一般会有这样的场景 : 由于服务器性能之间存在差异 , 部分实例所在的机器性能较好 , 那我们就希望让性能更强的实例来去接收更多用户的请求
Nacos 就提供了权重配置来控制访问的频率 , 权重越大则访问频率越高
权重值的范围在 0~1 之间 , 0 就代表这台机器永远不会被访问到 .
我们可以在 Nacos 的控制中心设置实例的权重值
我们首先让两个节点都挂载到 HZ 机房
那接下来 , 我们就可以修改这两个节点的优先级
那我们可以尝试一下 , 是否会大概率访问 81 端口 , 那相对来说 , 访问 81 的次数确实是多了一些
小结 : 实例的权重控制
- Nacos 控制台可以设置实例的权重值 , 权重值在 0~1 之间
- 同集群内的多个实例 , 权重越高则被访问的频率越高
- 权重设置为 0 就永远不会被访问
五 . 环境隔离
5.1 什么是环境隔离 ?
我们在项目开发的过程中 , 会涉及到不同的环境 : 开发环境、测试环境、生产环境 …
那不同的环境下注册的服务需要互相隔离 .
比如我们不可能在生产环境中去调用开发环境的实例
Nacos 中 , 服务存储和数据存储的最外层都是一个叫做 namespace (命名空间) 的东西 , 用来做最外层隔离
服务存储 : 服务注册信息的存储
数据存储 : 配置信息的存储
如果我们不指定 namespace 的话 , 默认就是 public 的
那后续我们就可以自定义 test / dev / … 命名空间
那每个 namespace 下面 , 还具体向下进行了细分
命名空间.png
其中 , 第二层 - 默认的组名称叫做 DEFAULT_GROUP
5.2 环境隔离的演示
5.2.1 创建命名空间
在 Nacos 控制台可以创建 namespace , 用来隔离不同的环境
然后填写一个新的命名空间信息
保存后会在控制台看到这个命名空间的 ID
我们将这个命名空间 ID 复制下来 , 马上就会用到
此时我们再去查看服务管理 , 也能看到新的命名空间
5.2.2 给微服务配置 namespace
修改 order-service 的 application.yml , 添加 namespace 命名空间相关信息
spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服务端的地址username: nacos # Nacos 的账号password: nacos # Nacos 的密码discovery:cluster-name: SH # 配置集群名称, 也就是机房位置, 比如: SH-上海namespace: 677bd75f-bfa7-43ca-a7fe-aa4cf10ad12d # 指定隔离的环境, 这里是 dev
此时 , 我们重新运行 order-service
但是 dev 命名空间下还并没有 user-service 服务 , 那由于命名空间存在环境隔离性 , 这就会导致不同命名空间下的服务不能互相调用 , 也就是说 order-service 调用 user-service 就会调用失败
那我们把 user-service 也调整到 dev 命名空间下 , 就能调用成功
然后重启 user-service 服务
5.3 小结
Nacos 环境隔离
- 不特意设置的话 , 默认的命名空间就是 public
- 每个 namespace 都有唯一 id
- 服务设置 namespace 时要写 id 而不是名称
- 不同 namespace 下的服务互相不可见
六 . Nacos 与 EureKa 的区别
6.1 Nacos 注册中心细节分析
小结 :
1、与 Eureka 相同 , 在服务启动的时候都需要将自身节点的信息推送给 Nacos , 服务消费方可以从 Nacos 中拉取可用节点列表 , 根据某种策略进行调用即可 .
2、Nacos 也存在与 Eureka 相同的心跳检测机制 , 在 Nacos 中叫做临时实例 . 如果临时实例心跳包发送失败 , 那 Nacos 会立刻将该节点丢弃掉 , 保证 Nacos 注册中心的服务列表中剩下的一定都是健康的实例
3、Nacos 中也存在非临时实例 , 非临时实例是通过 Nacos 主动询问健康状态而不是客户端主动发送心跳包给服务端 . 如果非临时实例挂掉了 , Nacos 也不会将该实例踢出服务列表 , 这样可以保证服务的消费方获取到的服务列表与服务提供者所提供的服务列表是一样的 , 保证了可用性
4、当 Nacos 注册中心的消息列表发生变化之后 , Nacos 还支持主动推送
6.2 临时实例 VS 非临时实例
我们创建出来的实例 , 默认都是临时实例 .
那非临时实例具有以下特点
- 服务异常 , Nacos 不会剔除节点信息
- 维护了注册信息的一致性
如果我们需要创建非临时实例的话 , 就需要在配置文件中进行配置
spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例
那我们重启 order-service
如果报错的话 , 在父工程的 pom.xml 中添加作为配置中心的依赖即可
<!-- 引入 Nacos config 配置依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
那这个节点 , 如果挂掉 , Nacos 也不会将他剔除出服务列表
6.3 小结
Nacos 与 EureKa 的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式来进行健康检测
Nacos 与 EureKa 的区别
- Nacos 支持服务端主动监测提供者的状态 : 临时实例采用心跳模式 , 非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除 , 非临时实例则不会被剔除
- Nacos 支持服务列表变更的消息推送模式 , 服务列表更新及时
- Nacos 集群默认采用 AP 方式 (如果服务挂掉了 , 就将它从服务列表剔除掉) , 当集群中存在非临时实例时 , 采用 CP 模式 (如果服务挂掉了 , 就不会将它从服务列表中剔除掉) . EureKa 采用 AP 方式 .
七 . CAP 定理 (了解)
1998 年 , 加州大学的计算机科学家 Eric Brewer 提出 , 分布式系统有三个指标 :
- Consistency (数据一致性)
- Availability (服务可用性)
- Partition tolerance (分区容错性)
这三个特性只能满足其二 , 不能全部满足 .
并且一般在分布式环境下 , Partition tolerance 是满足不了的 , 所以我们需要对分区进行容错 , 要么保证 A 牺牲 C , 要么保证 C 牺牲 A , 也就是 CP 和 CA .
7.1 数据一致性
Consistency (一致性) : 用户访问分布式系统中的任意节点 , 得到的数据必须一致
数据一致性.png
7.2 服务可用性
Availability (可用性) : 用户访问集群中的任意健康节点 , 必须能够得到响应 , 而不是超时或者拒绝 .
服务可用性.png
7.3 分区容错性
Partition tolerance (分区容错性) : 因为网络故障或者其他原因导致分布式系统中的部分节点与其他节点失去连接 , 形成独立分区 .
分区容错性-1.png
那这种情况下 , 我们只有两种解决方案 :
- 停用 node03 节点 : 保证了数据一致性 , 但是破坏了服务可用性
分区容错性-2.png
- 继续使用 node03 节点 : 虽然服务可用性保持不变 , 但是由于 node03 分区已经断联 , 导致数据不能进行同步 , 就会破坏数据一致性 .
分区容错性-3.png
Naocs 默认是 AP 模式 (服务可用性 + 分区容错性) , 但是可以手动设置 CP 模式 , Eureka 只支持 AP 模式 .
小结 :
一、Nacos 安装与启动
下载安装:获取 Nacos 安装包并解压至目标目录。
单机启动:进入 bin 目录执行 startup.cmd -m standalone(Windows)启动服务。
访问验证:通过 http://localhost:8848/nacos 访问控制台,默认账号密码为 nacos/nacos。
二、服务注册与发现
依赖配置:
替换 Eureka 依赖为 spring-cloud-starter-alibaba-nacos-discovery。
父工程需添加 spring-cloud-alibaba-dependencies 管理依赖。
地址配置:在 application.yml 中配置 spring.cloud.nacos.server-addr。
三、服务分级存储模型
三级结构:服务 → 集群(如机房位置)→ 实例。
集群配置:通过 spring.cloud.nacos.discovery.cluster-name 指定集群。
同集群优先:使用 NacosRule 负载均衡策略实现同集群优先调用。
四、权重配置
控制访问频率:权重范围 0~1,值越高访问概率越大。
特殊场景:权重设为 0 可完全禁用实例访问。
五、环境隔离
命名空间:通过 namespace 实现环境隔离(dev/test/prod等)。
配置方式:在服务配置中添加 spring.cloud.nacos.discovery.namespace(需填命名空间ID)。
六、Nacos 与 Eureka 对比
健康检测:
Nacos:临时实例用心跳模式,非临时实例用主动检测。
Eureka:仅支持心跳检测。
实例剔除:
Nacos 临时实例异常会剔除,非临时实例保留。
Eureka 所有实例异常都会剔除。
数据一致性:
Nacos 默认 AP 模式,支持切换 CP 模式。
Eureka 仅支持 AP 模式。
七、CAP 定理应用
Nacos 策略:临时实例采用 AP 模式(保证可用性),非临时实例采用 CP 模式(保证一致性)。
设计选择:分布式系统需在一致性©和可用性(A)之间权衡,分区容错性§通常必须保证。