近期博主在参与一个 Spring Cloud 搭建,版本为 Hoxton.SR12,服务注册发现组件为 Nacos 的老项目时,发现项目负载均衡组件 Ribbon 的负载均衡规则在某些场景下不够完美,比如新版本上线,需要重启服务。因此写了这边文章与大家分享。

在微服务架构中,负载均衡是实现高可用性、高性能和可伸缩性的关键组件,正确地选择和配置负载均衡规则对于整个系统的性能和稳定性都至关重要。Ribbon 是一个常见的负载均衡框架,在 Netflix 的微服务架构中发挥了重要作用。然而,在某些场景下,Ribbon 默认的负载均衡规则并不能满足我们的需求。

前言

默认情况下 Ribbon 是通过定时任务每隔30秒去获取服务注册中心的服务列表,这样就会造成如果某个服务已经下线,但是 Ribbon 没有及时刷新服务列表,依然会去调用这个已经下线的服务,造成用户请求异常。因此,我们需要替换掉这些默认规则,使用更加灵活和强大的负载均衡规则,例如 NacosRule。本文将介绍在服务提供者为 Nacos的环境下,如何将 Ribbon 默认的负载均衡规则替换为 NacosRule 并进行相应的配置。

一、Ribbon 默认负载均衡规则

在微服务架构中,服务提供者通常会有多个实例,且这些实例的性能和运行状态可能会有所不同。为了让请求能够平均地分配给不同的实例,我们需要使用负载均衡算法。Ribbon 默认的负载均衡规则是轮询,即每个请求按顺序分配给不同的服务实例。这种方式对于服务提供者的实例性能和状态均匀分布的情况下适用,但是如果某个实例出现问题,例如响应时间过长或者宕机,仍然会受到一定比例的请求,这显然不是我们期望的结果。

二、NacosRule 负载均衡规则

NacosRule 是由 Nacos 的 spring-cloud-starter-alibaba-nacos-discovery 依赖中针对 Ribbon 提供的更为灵活和高效的负载均衡规则(在高版本已经移除 Ribbon 的相关配置)。官方对它的说明如下。

/**
* Supports preferentially calling the ribbon load balancing rules of the same cluster
* instance.
*
* @author itmuch.com
*/
public class NacosRule extends AbstractLoadBalancerRule {
}

用中文说就是支持优先调用同一集群实例的ribbon负载均衡规则。说人话就是它能够支持同一机房里的服务相互访问,避免跨机房调用。

跨机房访问会因为机房之间的物理距离太远,造成请求延时过高的问题。

NacosRule 的主要特点如下:

  • 根据配置的集群名称,默认访问和自己在同一个集群上的服务
  • 基于 Nacos 的订阅服务,来实现服务上下线及时感知以及高效选取
  • 可以根据服务的权重进行选择,权重高则优先选择,权重设置为0则完全不会被访问

可以看到 NacosRule 在解决跨机房访问的延迟问题上,还解决了我们服务发布时,不能及时感知服务下线的问题。

三、替换Ribbon默认负载均衡规则

我们可以通过在Ribbon客户端的配置中进行相应的设置,将默认的 Ribbon 负载均衡规则替换为 NacosRule。以下是示例代码:

@Configuration
public class RibbonConfiguration { @Bean
public IRule ribbonRule() {
// 将Ribbon默认的轮询规则替换为NacosRule
return new NacosRule();
}
}

在这里,我们通过 @Configuration 注解定义了一个Java配置类,并在其中创建了一个名为 ribbonRule 的 Bean 对象,其类型为 IRule。我们通过返回 NacosRule 来替换 Ribbon 默认的负载均衡规则。这样,在调用服务时,Ribbon 就会使用 NacosRule 中的负载均衡算法来选择服务实例。

四、总结

本文介绍了如何将 Ribbon 默认的负载均衡规则替换为 NacosRule,并进行相应的配置。大家也可以选择升级到 Spring Cloud 的高版本中,使用 spring-cloud-starter-loadbalancer 组件解决这个问题。

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

Ribbon默认负载均衡规则替换为NacosRule的更多相关文章

  1. SpringCloud Ribbon组成和负载均衡规则

    Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...

  2. Spring-Cloud-Ribbon学习笔记(二):自定义负载均衡规则

    Ribbon自定义负载均衡策略有两种方式,一是JavaConfig,一是通过配置文件(yml或properties文件). 需求 假设我有包含A和B服务在内的多个微服务,它们均注册在一个Eureka上 ...

  3. Spring Cloud(Dalston.SR5)--Ribbon 中间层负载均衡

    Spring Cloud 集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,使用 @LoadBalanced 修饰的 RestTemplate 类拥有了负载均衡功能,在 Sprin ...

  4. SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡

      Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡.为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求.Ribbo ...

  5. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  6. 3.Spring Cloud初相识--------Ribbon客户端负载均衡

    前言: 在生产环境中,未避免单点故障,每个微服务都会做高可用部署. 通白的说,就是每一个一模一样的服务会根据需求提供多分在多台机器上. 那么在大并发的情况下,如何分配服务可以快速得到响应,就成为了我们 ...

  7. spring cloud 系列第3篇 —— ribbon 客户端负载均衡 (F版本)

    源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.ribbon 简介 ribbon是Netfix公司开源的负载均衡组件,采用服 ...

  8. Spring Cloud Ribbon客户端负载均衡(四)

    序言 Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种.它在 Spr ...

  9. ③SpringCloud 实战:使用 Ribbon 客户端负载均衡

    这是SpringCloud实战系列中第三篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  10. SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心

    1.Ribbon客户端负载均衡 1.1 依赖 1.2 配置信息 # feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询 # 负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服 ...

随机推荐

  1. 吉特日化MES & SQL Server中的数据类型

    一. 整数数据类型 1.bit bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off.注意:很省空间的一种 ...

  2. 14、Map

    1.Map的定义 map是Go中的内置类型,它将一个值与一个键关联起来.可以使用相应的键检索值.Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引 ...

  3. Scrapy-settings.py常规配置

    # Scrapy settings for scrapy_demo project # # For simplicity, this file contains only settings consi ...

  4. npm 发布流程

    登录npm 查看本地是否登录 # 全局配置源 npm who am i # 官方源 npm who am i --registry https://registry.npmjs.org 注: npm源 ...

  5. MyBatis高频面试题

    1.MyBatis中使用#和$书写占位符有什么区别? 2.Hibernate 与 Mybatis区别(MyBatis与Hibernate有什么不同). 3.持久层设计要考虑的问题有哪些? 4.你用过的 ...

  6. Javac多模块化编译

    转载:原文链接 从SDK9开始,Java支持多模块编译.那么,怎么用javac实现多模块编译呢? 项目介绍 先来看看我们的项目. 首先lib文件夹下是依赖模块,有一个hello模块.hello模块包含 ...

  7. VSCode C++开发环境配置:CMake 调试配置 launch.json

    相关内容 VSCode C++开发环境配置: LLVM clang clangd 安装 cmake sudo apt install cmake 安装 VSCode 插件 CMake CMakeToo ...

  8. nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接

    nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题. 替换成openres ...

  9. CUDA C编程权威指南:1.3-CUDA基础知识点梳理

      主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA数组 解析:CUDA数组 ...

  10. C++篇:第三章_控制结构_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 三.控制结构 for循环的结束判定条件是boolean型 只要适当地修改代码,就 ...