2024.5.10 关于 SpringCloud —— Nacos 的基本认知

目录

引言

Nacos 服务注册发现

Nacos 服务分级存储模型

服务跨集群调用问题

服务集群属性配置

配置 Nacos 负载均衡策略

设置 Nacos 服务实例权重

namespace 环境隔离

Nacos 注册中心细节分析

Nacos 与 Eureka 的共同点

Nacos 与 Eureka 的区别

临时实例 与 非临时实例配置


引言

  • Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一个组件
  • 相比于 Eureka 其功能更加丰富,在国内受欢迎程度高

关于 Nacos 配置与安装可点击下方链接进行跳转

Nacos 的安装与配置

Nacos 服务注册发现

  • 此处我们将尝试把 order-server 和 user-server 服务注册到 Nacos 中

1) 在项目父工程的 pom.xml 文件中添加 spring-cloud-alibaba 依赖

<!-- nacos 的管理依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
  • 版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本
  • 版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本
  • 版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本

2)在 order-service 和 user-service 中的 pom.xml 中添加 Nacos 客户端依赖

<!-- nacos客户端依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在添加 Nacos 依赖之前,如果存在 Eureka 依赖,我们需要将 Eureka 依赖注释掉

3)修改  order-service 和 user-service 中的 application.yml 文件,添加 Nacos 地址

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务地址
  • 在修改 application.yml 文件之前,如果存在 Eureka 地址,我们任需将 Eureka 地址注释掉

4)重新启动 user-service 和 order-service,进入 Nacos 管理平台查看

5)点击 userservice 详情,查看如下图所示的服务详情

Nacos 服务分级存储模型


服务跨集群调用问题

  • 服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
  • 本地集群不可访问时,再去访问其他集群

服务集群属性配置

  • 假设此处我们按下图所示,给 user-service 分配集群

 1)修改 user-service 中的 application.yml,添加下方所示内容

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务地址
      discovery:
        cluster-name: HZ # 集群名称,HZ 代指杭州

2)重新启动 UserApplication 和 UserApplication(2) 这两个实例

3)修改 user-service 中的 application.yml,将 cluster-name 修改为 CS

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务地址
      discovery:
        cluster-name: CS # 集群名称,CS 代指长沙

4)重新启动 UserApplication(3) 这个实例

5)进入 Nacos 管理平台,点击查看 userservice 服务详情


小总结

  • Nacos 服务分级存储模型
  1. 服务为一级,例如 user-service
  2. 集群为二级,例如 杭州 或 长沙
  3. 实例为三级,例如 长沙机房的某台部署了 user-service 的服务器

配置 Nacos 负载均衡策略

  • 在配置 Nacos 负载均衡策略之前,我们首先测试 Nacos 的默认负载均衡策略

1)在 order-service 中的 application.yml 添加配置集群信息

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务端地址
      discovery:
        cluster-name: HZ # 配置集群名称,也就是机房位置

2)重新启动 OrderApplication 实例

3)在浏览器输入对应 url,查询 101、102、103 号订单

4)查看控制台中的 user-service 日志

  • 观察上图日志,我们可以了解到 Nacos 默认的负载均衡策略就是 轮询
  • 101、102、103 订单分别在 UserApplication、UserApplication(2)、UserApplication(3) 这三个实例中被轮询

  • 如果我们需要配置 Nacos 服务优先访问本地集群呢?
  • 让 order-service 优先访问本地,即杭州集群中的 UserApplication 实例

1)在 order-service 中的 application.yml 文件中添加下方信息

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

2)重新启动 OrderApplication 实例

3)在浏览器输入对应 url,查询 101、102、103 号订单

4)查看控制台中的 user-service 日志

  • 观察上图,处于长沙集群的 8083端口 UserApplication(3) 并未接收到 order-service 的请求

注意:

  • 此处 Nacos 为随机访问 user-service 的实例
  • 即 Nacos 优先选择本地集群,随后在本地集群中采用随机方式进行负载均衡

5)我们终止运行杭州集群中的两个 UserApplication 实例

6)在浏览器输入对应 url,查询 101 号订单

7)查看控制台中的 order-service 和 user-service 日志

  • 此处的 order-service 日志打印了一个警告
  • 警告内容 ——> 一次跨集群访问发生了!本想访问 杭州集群,却访问了 长沙集群
  • 同时我们也可以看到长沙集群的 UserApplication(3) 实例打印的日志信息中,出现了对 101 订单用户信息的查询日志
  • 即当本地集群无法访问时,Nacos 便会去尝试访问其他集群

小总结

  • 有关 NacosRule 的负载均衡策略
  1. 优先选择同集群服务实例列表
  2. 本地集群找不到提供者,才去其它集群寻找,并且会报警告
  3. 确定了可用实例列表后,再采取随机负载均衡挑选实例

设置 Nacos 服务实例权重

  • Nacos 会根据权重进行负载均衡

实例:

  • 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

解决方案:

  • 通过 Nacos 设置权重来控制访问频率,权重越大,则访问频率越高

1)选中 Nacos 管理平台 ——> 服务列表 ——> 服务详情 ——> 编辑按钮

2)此时我们便可以修改指定实例的权重值

  • 此处我们将 8081 端口实例的权重修改为 0.1,同时测试可以发现 8081 被访问到的概率大大降低

注意:

  • 当我们将某一实例权重设置为 0 时,此时该实例将不会接收任何请求

小总结

  • Nacos 管理平台可以设置实例的权重值,0~1 之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为 0,则完全不会被访问

实例理解

  • 假设此时我们需要对某一服务进行版本升级,该服务有 8081 和 8082 两个实例

解决方案:

  1. 我们可以先将  8081 的权重设为 0,然后再针对 8081 进行停机和版本升级,升级完成之后再重启
  2. 8081 升级完成之后,其权重先调小点,放出少量用户进来做测试,看功能和请求是否正常
  3. 如果没啥问题,便可针对 8081 的权重进行扩大,转而针对 8082 进行版本升级
  4. 由此我们便可在用户无感知的前提下,完成对服务的版本更新,十分的平滑和优雅

namespace 环境隔离

  • Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西
  • namespace 常用于最外层隔离

  • 此处我们假设想要创建一个生产环境,并将 order-service 放入新创建的生产环境中

1)在 Nacos 管理平台中点击命名空间

2)点击新建命名空间,根据需求创建命名空间

3)观察新创建的命名空间

  • 此时我们新创建的命名空间会自动生成一个 命名空间 ID

4)修改 order-service 的 application.yml,添加 namespace 和 命名空间 ID

spring:
  cloud:
    nacos:
      discovery:
        namespace: c7e49b09-f9a2-487c-8582-db31d4f5add0 # dev 环境

5)重新启动 OrderApplication,观察 Nacos 管理平台

  • 此时我们的 order-service 成功放入到新创建的生产环境中

6)在浏览器输入对应 url,查询 101 号订单

  • 此时将无法查询到订单号 101 的用户信息
  • 因为 user-service 和 order-service 在不同的 namespace 下

小总结

  1. 每个 namespace 都有唯一 id
  2. 服务设置 namespace 时要写 id 而不是名称
  3. 不同 namespace 下的服务互相不可见

Nacos 注册中心细节分析


Nacos 与 Eureka 的共同点

  1. 都支持服务注册和服务拉取
  2. 都支持服务提供者心跳方式做健康检测

Nacos 与 Eureka 的区别

  1. Nacos 支持服务端主动检测提供者状态:临时实例采取用心跳模式,非临时实例采用主动检测模式
  2. 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
  3. Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
  4. Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式,Eureka 采用 AP 模式

临时实例 与 非临时实例配置

  • 服务注册到 Nacos 时,可以选择注册为临时实例或非临时实例,通过下面的配置来设置
  • 如果未添加下方配置信息,将默认注册为临时实例
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

实例理解

  • 此处我们想将 order-server 配置为非临时实例,即将下图的 true 改为 false

1)在 OrderApplication 的 pom.xml 中添加上述配置,随后直接重启 OrderAppliction

2)再次查看 Nacos 管理平台,观察临时实例是否变为 false

  • 由上图可知,order-service 成功被注册为 非临时实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茂大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值