Ribbon默认负载均衡规则替换为NacosRule
近期博主在参与一个 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的更多相关文章
- SpringCloud Ribbon组成和负载均衡规则
Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...
- Spring-Cloud-Ribbon学习笔记(二):自定义负载均衡规则
Ribbon自定义负载均衡策略有两种方式,一是JavaConfig,一是通过配置文件(yml或properties文件). 需求 假设我有包含A和B服务在内的多个微服务,它们均注册在一个Eureka上 ...
- Spring Cloud(Dalston.SR5)--Ribbon 中间层负载均衡
Spring Cloud 集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,使用 @LoadBalanced 修饰的 RestTemplate 类拥有了负载均衡功能,在 Sprin ...
- SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡
Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡.为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求.Ribbo ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
- 3.Spring Cloud初相识--------Ribbon客户端负载均衡
前言: 在生产环境中,未避免单点故障,每个微服务都会做高可用部署. 通白的说,就是每一个一模一样的服务会根据需求提供多分在多台机器上. 那么在大并发的情况下,如何分配服务可以快速得到响应,就成为了我们 ...
- spring cloud 系列第3篇 —— ribbon 客户端负载均衡 (F版本)
源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.ribbon 简介 ribbon是Netfix公司开源的负载均衡组件,采用服 ...
- Spring Cloud Ribbon客户端负载均衡(四)
序言 Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种.它在 Spr ...
- ③SpringCloud 实战:使用 Ribbon 客户端负载均衡
这是SpringCloud实战系列中第三篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...
- SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心
1.Ribbon客户端负载均衡 1.1 依赖 1.2 配置信息 # feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询 # 负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服 ...
随机推荐
- [计蒜客20191103B] 饮料
小 B 出门游玩,他现在走到了 \(n\) 家饮品店前,第 \(i\) 家买饮料的花费为$ cost_i$ ,他只能去花费不超过自己所带钱数额的店,但他现在不确定自己兜里有多少钱,所以现在给出 \(m ...
- Stream API学习笔记
Java8 中Stream API介绍 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象.这种风格将要处理的元素集合看作一种流, ...
- C++ Qt开发:Charts折线图绘制详解
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts ...
- 【UniApp】-uni-app-处理项目输入数据(苹果计算器)
前言 上一篇文章完成了项目的基本布局,这一篇文章我们来处理一下项目的输入数据 项目的输入数据主要是通过按键来输入的,所以我们需要对按键进行处理 那么我们就来看一下 uni-app-处理项目输入数据 步 ...
- 数字孪生与GIS的结合:创新灾害预防管理的未来
近年来,全球频发的自然灾害给人们的生命和财产安全带来了巨大威胁,灾害预防管理成为当务之急.然而,随着数字孪生技术和GIS的迅猛发展,一种全新的解决方案正在崭露头角.数字孪生与GIS的结合,为灾害预防管 ...
- SpringCloud OpenFeign的使用
SpringCloud OpenFeign的使用 是什么: 声明式http客户端. 目的: 使远程调用更简单 作用: 提供了http请求模板,仅需编写简单接口和插入注解,就可以定义好原始http请求的 ...
- Windows Server 2012 R2在桌面上显示我的电脑等图标
从Windows 2012 开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令.方法如下: 按下「Win鍵」+「R」,在运行里输入: rundll32.exe shell3 ...
- C#/.NET/.NET Core面试宝典(基础版)
前言 该知识库主要由自己平时学习实践总结.网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成.欢迎关注我的微信公众号(声明公众号不推广告,纯属个人技术文章分享)回复关键字获取宝库地址 ...
- 一文详解kube-apiserver认证鉴权能力
本文分享自华为云社区<kube-apiserver认证鉴权能力>,作者: 可以交个朋友. HTTPS为什么要进行身份验证 首先不管是kubectl还是API调用都是通过HTTPS访问kub ...
- 云图说|AppCube零代码,开启无码新生活
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 应用魔方 App ...