近期博主在参与一个 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. Selenium-[实例]猫眼电影爬取

    import random import time from selenium import webdriver from selenium.webdriver import ActionChains ...

  2. C++ Qt开发:Charts折线图绘制详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts ...

  3. 如何使用libgdx做游戏01---libgdx的安装

    一般来说使用这个工具做游戏的都是java开发者,这种技术在国外勉强算是必学的,而在国内却很少有这方面的知识. 接下来,我将讲解如何安装libgdx,也算是简单的libgdx入门 工具:idea.jdk ...

  4. 痞子衡嵌入式:Farewell, 我的写博故事2023

    -- 题图:苏州虎丘塔 2023 年的最后一天,照旧写个年终总结.昨晚和同门师兄弟一起吃饭,有个师弟告诉痞子衡,微博上一个拥有 22.3W 粉丝的嵌入式同行今年 4 月发过一个吐槽微博,说恩智浦 MC ...

  5. 深度解析 PyTorch Autograd:从原理到实践

    本文深入探讨了 PyTorch 中 Autograd 的核心原理和功能.从基本概念.Tensor 与 Autograd 的交互,到计算图的构建和管理,再到反向传播和梯度计算的细节,最后涵盖了 Auto ...

  6. CentOS 7 部署 Seafile 服务器(使用 MySQL/MariaDB)

    本文档用来说明通过预编译好的安装包来安装并运行基于 MySQL/MariaDB 的 Seafile 服务器.(MariaDB 是 MySQL 的分支) 提示:如果您是初次部署 Seafile 服务,我 ...

  7. Vue.js 原理分析

    本文内容提炼于<Vue.js设计与实现>,全书共 501 页,对 Vue.js 的设计原理从 0 到 1,循序渐进的讲解. 篇幅比较长,需要花些时间慢慢阅读,在合适的位置会给出在线示例以供 ...

  8. [ACTF2020 新生赛]Exec 1

    [ACTF2020 新生赛]Exec 1 审题 发现题目有ping功能,猜测是命令执行漏洞. 知识点 linux系统命令 解题 先ping127.0.0.1,观察是否正常执行. 发现正常后执行ls / ...

  9. 根据图片URL地址下载图片

    /// <summary> /// 下载图片 /// </summary> /// <param name="picUrl">图片Http地址& ...

  10. Mybatis之TypeHandler使用教程

    引言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...