SpringCloud之注册中心之Nacos负载均衡详解

 更新时间:2025年03月07日 10:55:14   作者:新绿MEHO  
Nacos提供多种负载均衡策略,包括权重、同机房、同地域、同环境等,服务下线和权重配置可以通过Nacos管理界面进行,同时,Nacos使用Raft算法选举Leader节点,若IP地址改变可能会影响Leader选举,配置同集群优先访问可以提高访问速度,通过配置集群名称和负载均衡策略

负载均衡

生产环境相对是⽐较恶劣的, 我们需要对服务的流量进⾏更加精细的控制. Nacos⽀持多种负载均衡策略, 包括权重, 同机房, 同地域, 同环境等.

服务下线

当某⼀个节点上接⼝的性能较差时, 我们可以第⼀时间对该节点进⾏下线.

操作步骤: 服务详情 -> 下线

点击下线后, 再次请求接⼝, 会发现该服务没有请求进来了。再次单击上线, 该节点会继续收到请求。

下线之前

下线端口号为9091的服务进程之后:

权重配置

除了下线之外, 我们也可以配置这个节点的流量权重。

配置权重

操作步骤: 找到对应节点 ->编辑 -> 在弹出的窗⼝修改权重值。

下面修改端口号为9091的服务进程的权重为0.1

观察结果:

我们可以看到,三个服务实例接收到的请求次数几乎一样多,这是为什么呢?明明我们已经配置了权重且比例稍微比较大,按理说应该能看到现象。

是因为我们使用了LoadBalance,它本来就是负责负载均衡的,此时就不会使用Nacos的权重属性进行负载均衡。

我们可以参考一下文章:

解决办法

开启Nacos负载均衡策略

application.properties

spring.cloud.loadbalancer.nacos.enabled=true

application.yml

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

观察结果:

由此我们可以看到,我们设置的权重生效了。

常见问题

修改权重时, 可能会报错:

报错信息为:

caused: errCode: 500, errMsg: do metadata operation failed ;caused:com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group[naming_instance_metadata] did not find the Leader node;caused: The Raft Group[naming_instance_metadata] did not find the Leader node;

原因: Nacos 采⽤ raft 算法来计算 Leader, 并且会记录前⼀次启动的集群地址, 当服务器 IP 改变时会导致 raft 记录的集群地址失效, 导致选 Leader 出现问题. (⽹络环境发⽣变化时, IP地址也会发⽣变化)

解决办法: 删除 Nacos 根⽬录下 data ⽂件夹下的 protocol ⽂件夹即可。

同集群优先访问

Nacos把同⼀个机房内的实例, 划分为⼀个集群. 所以同集群优先访问, 在⼀定程度上也可以理解为同房优先访问.微服务架构中, ⼀个服务通常有多个实例共同提供服务, 这些实例可以部署在不同的机器上, 这些机器可以分布在不同的机房, ⽐如product-service:

实例1: 分布在上海机房实例2: 分布在上海机房实例3: 分布在北京机房实例4: 分布在北京机房

微服务访问时, 应尽量访问同机房的实例. 当本机房内实例不可⽤时, 才访问其他机房的实例。

⽐如order-service 在上海机房, product-service 在北京和上海机房都有实例, 那我们希望可以优先访问上海机房, 如果上海机房没有实例, 或者实例不可⽤, 再访问北京机房的实例. 通常情况下, 因为同⼀个机房的机器属于⼀个局域⽹, 局域⽹访问速度更快⼀点.

给实例配置集群名称

1. 配置集群名称

给order-service和端口号为9090的product-service配置 SH 集群名称。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 110.41.51.65:10020
        cluster-name: SH #集群名称: 上海集群

端口号为9091的product-service端口号为9092的product-service配置 BJ 集群名称。

开启Nacos负载均衡策略

同权重配置

spring:
  cloud:
    nacos:
      loadbalancer:
        nacos:
          enabled: true

多次访问“http://127.0.0.1:8080/order/1”

观察结果:

我们前面配置order-service集群为 SH,配置端口号为9090的product-service集群为 SH,配置端口号为9091的product-service集群为 BJ,配置端口号为9092的product-service集群为 BJ。

上面的结果可以看到,请求都发送到了端口号为9090的product-service集群,与预期符合。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,适合java语言的所有平台,与.net等平台的加密解密兼容
    2014-02-02
  • 基于java线程池读取单个SQL数据库表

    基于java线程池读取单个SQL数据库表

    这篇文章主要为大家详细介绍了基于java线程池读取单个SQL数据库表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java接口操作(继承父类并实现多个接口)

    Java接口操作(继承父类并实现多个接口)

    这篇文章主要介绍了Java接口操作(继承父类并实现多个接口),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 基于Spring-cloud-gateway实现全局日志记录的方法

    基于Spring-cloud-gateway实现全局日志记录的方法

    最近项目在线上运行出现了一些难以复现的bug需要定位相应api的日志,通过nginx提供的api请求日志难以实现,于是在gateway通过全局过滤器记录api请求日志,本文给大家介绍基于Spring-cloud-gateway实现全局日志记录,感兴趣的朋友一起看看吧
    2023-11-11
  • Spring中@Configuration和@Component注解的区别及原理

    Spring中@Configuration和@Component注解的区别及原理

    这篇文章主要介绍了Spring中@Configuration和@Component注解的区别及原理,从功能上来讲,这些注解所负责的功能的确不相同,但是从本质上来讲,Spring内部都将其作为配置注解进行处理,需要的朋友可以参考下
    2023-11-11
  • 使用Spring Cloud Feign远程调用的方法示例

    使用Spring Cloud Feign远程调用的方法示例

    这篇文章主要介绍了使用Spring Cloud Feign远程调用的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Java中时间戳和时间的转换方法代码

    Java中时间戳和时间的转换方法代码

    这篇文章主要介绍了Java中时间戳和时间的转换的相关资料,Java8中时间戳与日期时间对象之间的转换是编程中常见的操作,通过时间字符串获取时间对象也是其中的一种方法,需要的朋友可以参考下
    2025-03-03
  • IDEA社区版下载安装流程详解(小白篇)

    IDEA社区版下载安装流程详解(小白篇)

    这篇文章主要介绍了IDEA社区版下载安装流程详解(小白篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤

    SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤

    我们开发 SpringBoot 项目有时我们会需要打包成 war 包,放入外置的 Tomcat 中进行运行,或者使用工具idea直接启动,便于开发调试,本文给大家分享SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤,感兴趣的朋友一起看看吧
    2024-03-03
  • Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码

    Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码

    Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理,Shiro 主要分为两个部分就是认证和授权两部分,这篇文章主要介绍了Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码,需要的朋友可以参考下
    2024-07-07

最新评论