九、Ribbon负载均衡

news2025/4/9 16:12:13

目录

一、Ribbon负载均衡策略(常用7种):

详细介绍:

1、轮询策略: RoundRibbonRule(Ribbon默认策略)

2、重试策略:RetryRule

3、加权响应时间策略:WeightedResponseTimeRule

4、随机策略:RandomRule

5、最空闲策略:BestAvailableRule

6、区域感知轮询策略:ZoneAvoidanceRule

7、可用性过滤策略:AvailabilityFilteringRule

二、Ribbon的使用(不需要引入新的依赖,因为ribbon集成在了eureka client中了)

1、在手动注入RestTemplate时添加注解@LoadBalanced开启ribbon负载均衡

2、在member项目的controller中添加新的接口

3、运行springcloud-eureka、springcloud-order(启动三个服务实例)、springcloud-member启动类

4、多次访问localhost:9081/member/getOrder

三、修改Ribbon的轮询策略

1、全局修改,即所有的服务都是用同一个负载均衡策略

2、局部修改,即不同的服务使用不同的负载均衡策略

2.1  基于注解的方式配置

2.2 基于配置文件的方式配置

四、自定义负载均衡策略


一、Ribbon负载均衡策略(常用7种):

1、轮询策略: RoundRibbonRule(Ribbon默认策略)

2、重试策略:RetryRule

3、权重轮询策略:WeightedResponseTimeRule

4、随机策略:RandomRule

5、最少并发数策略:BestAvailableRule

6、区域感知轮询策略:ZoneAvoidanceRule

7、可用性过滤策略:AvailabilityFilteringRule

详细介绍:

1、轮询策略: RoundRibbonRuleRibbon默认策略

BaseLoadBalancer 负载均衡器默认采用线性负载轮询负载均衡策略。

工作流程:

RoundRibbonRule 类的 choose(ILoadBalancer Ib,Object key) 方法初始化一个计数器。

incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。

chooseServer(Object key) 方法拿着下标去服务列表中获取服务,每次循环计数器都会加1。如果连续10次都没有取到服务,则会报 “No available alive servers after 10 tries from loadbalancer.” 警告。

2、重试策略:RetryRule

重试策略在使用 RetryRule 类中定义的 choose(ILoadBalance Ib,Object key) 方法来选择一个服务实例。

choose() 方法也是采用 RoundRibbonRule 中的 choose() 方法来选择一个服务实例的。

工作流程

如果选择到的服务实例正常,则返回数据。

如果选择到的服务实例为 null 或 失效,则 choose() 方法会在失效时间前不断地进行重试。

如果超过了失效时间还是没有取到,则返回一个 null。

3、加权响应时间策略:WeightedResponseTimeRule

WeightedResponseTimeRule 类是 RoundRibbonRule 的一个子类,它对 RoundRibbonRule 的功能进行了扩展。它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。

工作流程

每 30S 计算一次各服务实例的响应时间,以响应时间来计算权重。平均响应时间越短则权重越高,权重越高则被选中的的概率越高,反之则被选中的概率较低。

WeightedResponseTimeRule 中有一个名叫 DynamicServerWeightTask 的定时任务。它是一个后台线程,定期从 status 里面读取响应时间,用来计算每个服务实例权重。

4、随机策略:RandomRule

随机选择一个可用的服务实例。

工作流程

负载均衡通过 upList() 和 allList() 方法获得可用服务实例列表,然后初始化了一个 Randow 对象以生成一个不大于服务实例总的随机数。

choose() 方法将该随机数作为下标获取一个服务实例。轮询 “index” 选择 “index” 对应的服务实例。

5、最空闲策略:BestAvailableRule

该服务是逐个考察各服务实例,然后选择一个最小的并发请求的服务实例来提供实例。BestAvailableRule 继承自 ClientConfigEnabledRoundRobbinRule 类。

工作流程

根据在 loadBalancerStats() 方法中保存的服务实例的状态信息来过滤失效的服务实例。

判断 loadBalancerStats 是否为空。

如果 loadBalancerStats 不为空,则找出并发请求最小的服务实例来使用。

如果 loadBalancerStats 为空,则 BestAvailableRule 类将采用它的父类。即 ClientConfigEnabledRoundRobbinRule 的服务选取策略 (线性策略)。

6、区域感知轮询策略:ZoneAvoidanceRule

该策略以区域、可用的服务器为基础,选择服务实例并对服务实例进行分类。ZoneAvoidanceRule 类是 PredicateBasedRule 类的一个实现类,它有一个组合过滤条件 (CompositePredicate)。ZoneAvoidanceRule 类中的过滤条件是 “以 ZoneAvoidancePredicate() 方法为主过滤条件” 和 “以AvailabilityPredicate() 方法为次过滤条件” 组成的。在过滤成功后,继续采用线性轮询的方式从过滤结果中选择出一个服务实例。

7、可用性过滤策略:AvailabilityFilteringRule

该策略根据服务状态 (宕机和繁忙) 来分配权重,过滤掉那些因为一直连接失败或高并发的服务实例。它使用一个 AvailabilityPredicate() 方法来包含过滤逻辑。

8、过滤性线性轮询策略:PredicateBasedRule

PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。

9、客户端配置启动线性轮询策略:ClientConfigEnabledRoundRobbinRule

继承该策略默认的 choose() 方法就能实现线性轮询机制。

二、Ribbon的使用(不需要引入新的依赖,因为ribbon集成在了eureka client中了)

1、在手动注入RestTemplate时添加注解@LoadBalanced开启ribbon负载均衡

// 手动注入RestTemplate实例
@Bean
//Ribbon负载均衡集成在了Eureka中
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

2、在member项目的controller中添加新的接口

@RestController
@RequestMapping("/member")
public class MemberController {
    @GetMapping("/getOrder")
    public String getOrder() {
        //URL的host使用服务名称(服务id)即可,不需要指定端口号,由loadBalance根据负载均衡策略决定具体的服务调用
        return template.getForObject("http://server-order/order/getOrderInfo", String.class);
    }
}

3、运行springcloud-eureka、springcloud-order(启动三个服务实例)、springcloud-member启动类

 

4、多次访问localhost:9081/member/getOrder

 

 此时,使用ribbon默认的负载均衡策略轮询的方式访问远程接口

三、修改Ribbon的轮询策略

1、全局修改,即所有的服务都是用同一个负载均衡策略

在member项目的启动类中添加Bean(IRule),然后重启该服务即可

// 设置负载均衡策略为随机,默认为轮询(全局设置)
@Bean
public IRule rule(){
    return new RandomRule();
}

再次访问localhost:9081/member/getOrder,可以看到端口号从9071、9072、9073三个服务中随机选择访问

2、局部修改,即不同的服务使用不同的负载均衡策略

2.1  基于注解的方式配置

第一步:新建两个class类,OrderConfig PayConfig

//单独设置服务的负载均衡策略(代码方式)
public class OrderConfig {
    //设置order服务负载均衡策略为随机
    @Bean
    public IRule orderRule() {
        return new RandomRule();
    }
}
//单独设置服务的负载均衡策略(代码方式)
public class PayConfig {
    //设置pay服务负载均衡策略为轮询
    @Bean
    public IRule payRule() {
        return new RoundRobinRule();
    }
}

第二步:在启动类中添加注解@RibbonClients

//单独设置具体服务的负载均衡策略
@RibbonClients({@RibbonClient(name = "server-order",configuration = OrderConfig.class),
        @RibbonClient(name = "server-pay",configuration = PayConfig.class)})

 第三步:重启服务,再次访问接口,即可看到对应的访问效果

2.2 基于配置文件的方式配置

在member项目的application中添加以下配置

#按照服务模块提供不同的负载均衡策略,如果有自定义的策略,只需要配置在NFLoadBalancerRuleClassName即可
server-order:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

server-pay:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

注释掉启动类上的注解@RibbonClients然后重启服务,重新访问即可验证。

如果同一个服务注解和配置文件配置的负载均衡策略不一样,注解配置的会覆盖配置文件配置的策略,即以注解配置的为准

项目中一般使用基于配置文件的形式配置负载均衡策略,一方面各个服务的访问策略一目了然,方便管理以及修改,另一方面使用注解方式的话修改完了需要重新打包部署比较麻烦

四、自定义负载均衡策略

参照com.netflix.loadbalancer.RandomRulecom.netflix.loadbalancer.RoundRobinRule的写法,照葫芦画瓢,继承AbstractLoadBalancerRule类即可,具体实践暂不深究

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【模拟电子技术】常用半导体器件——本征半导体

🍇🍇只有强大的意志,才能成就最艰难的选择。 ——CSDN厉昱辰 目录 🍍🍍一、半导体 🍍🍍二、本征半导体的晶体结构 🍍🍍 三、本征半导体中的两种载流子 &#x1f34d…

数字图像处理基础知识(自救指南)

概念 本部分多来自课件,见水印 数字图像处理的目的 提高图像的视感质量,以达到赏心悦目的目的。提取图像中所包含的某些特征或特殊信息,主要用于计算机分析,经常用作模式识别、计算机视觉的预处理。对图像数据进行变换、编码和压…

炫云为什么要采用让人看不懂的GHZ计费?

很多人看到炫云GHZ计费都表示看不懂,觉得麻烦,没有按核数、按线程或者按分钟计费简单易懂,甚至还被某些同行经常拿来攻击。哪为什么炫云还坚持用GHZ计费呢?哪是因为使用GHZ计费更加公平、透明,且具有硬件无关性。今天就…

10个适合Web开发的最佳CSS生成器工具

在写CSS的时候,我们可以手写CSS,也可以直接使用一些CSS生成器来完成,今天我就跟大家分享10个好用的CSS生成器工具,帮助你提升工作效率。 1.纯CSS条纹生成器 网址:https://stripesgenerator.com 没有 Flash&#xff0…

QT多线程基础

文章目录 前言一、多线程概念介绍二、创建一个线程三、start和terminate函数四、如何不使用terminate函数终止线程总结 前言 本篇文章来讲解一下QT中的多线程使用方法。 其实线程这个概念对于我们来说并不陌生,main函数在多线程中一般就被称为主线程。 在QT中&am…

《计算机网络—自顶向下方法》 第四章Wireshark实验:TCP 协议分析

在因特网协议族(Internet Protocol Suite)中,TCP 层是位于 IP 层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是 IP 层不提供这样的流机制,而是提供不可靠的包交换。…

Ordinal 是什么? BTC NFT 解释

Ordinal NFT 于 2023 年 1 月 20 日由开发者 Casey Rodarmor 在 BTC 主网上推出,它是在 BTC上 创建 NFT 的最新方式。虽然 BTC 上的 NFT 并不是一个新概念,BTC 之上的第 2 层网络(例如 Counterparty 和 Stacks)已经支持基于 BTC 的…

第七届中华梦乡·福清石竹山梦文化节举办

第七届中华梦乡福清石竹山梦文化节现场 5月9日至12日,第七届中华梦乡福清石竹山梦文化节暨海峡两岸(福清)道教论坛在福州福清举办。本届梦文化节以“福佑中华 梦圆石竹”为主题,旨在发挥海峡两岸道教界同根同源、联系密切的独特优…

【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(二)

博主:命运之光 专栏:Java零基础入门 学习目标 1.了解什么是抽象类,什么是接口; 2.掌握抽象类和接口的定义方法; 3.理解接口和抽象类的使用场景; 4.掌握多态的含义和用法; 5.掌握内部类的定义方法…

【HBase】介绍

文章目录 什么时候用Hbase?常见应用场景逻辑结构物理结构数据模型Name Space TableRowColumnTime StampCell 存储设计HLogHFileHfile生成方式 Apache HBase™ 是以 hdfs 为数据存储的,一种分布式、可扩展的 NoSQL 数据库。 Bigtable 是一个稀疏的、分布式…

5项目五:W1R3S-1(思路为主!)

特别注明:本文章只用于学习交流,不可用来从事违法犯罪活动,如使用者用来从事违法犯罪行为,一切与作者无关。 目录 前言 一、信息收集 二、网页信息的收集 三、提权 总结 前言 思路清晰: 1.信息收集,…

《程序员面试金典(第6版)》面试题 16.19. 水域大小(深度优先搜索,类似棋盘类问题,八皇后的简化版本,C++)

题目描述 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到…

【数据结构与算法】图的遍历与拓扑排序

文章目录 一、用数组模拟邻接表二、图的深度优先遍历(dfs)2.1 概念2.2 例题:树的重心 三、图的广度优先遍历(bfs)3.1 概念3.2 例题:图中点的层次 四、拓扑排序4.1 概念4.2 例题:有向图的拓扑序列…

2直接连接的网络与VLAN划分-2.2【实验】【计算机网络】

2直接连接的网络与VLAN划分-2.2-2.3【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网2.2交换机MAC地址表建立与帧转发实验目的实验内容及实验环境实验原理交换机通过逆向学习帧的源地址,构建MAC地址表;交换机中MAC地址的构建…

netty基础(五)

1.基本介绍 1>.异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者; 2>.Netty中的I/O操作是异步的,包括Bind、Write、Connect等操作会简单的返回一个 ChannelFuture; 3>.调用…

二、Eureka注册中心

目录 注册中心主要有三种角色: 1、服务提供者(RPC Server) 2、服务消费者(RPC Client) 3、服务注册中心(Registry) 注册中心实现原理 常用的注册中心: 常用注册中心对比&…

【C/C++每日一练】总目录(更新至2023.5.12)

C/C 2023.05 2023.5.11-2023.5.12 20230512 1. 成绩打印 ※ 2. 按要求补齐数组 🌟🌟🌟 3. 水仙花数 ※ 20230511 1. 最长公共前缀 🌟 2. 打家劫舍 🌟🌟 3. 最接近的三数之和 🌟&am…

修改通过CDH安装的Kafka和Zookeeper等组件的最大文件句柄数

目录 1.查看当前kafka最大文件句柄数 2.修改supervisord.service 服务配置文件 3.加载配置文件 4.重启supervisord.service服务 5.重启kafka等组件 6.查看修改后最大文件句柄数 7.查看kafka当前使用的文件句柄数 参考: 1.查看当前kafka最大文件句柄数 jpsc…

【rust】| 05——语法基础 | 流程控制

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 流程控制1. 条…

双向链表的功能实现

前言:我们已经学习并知道了单链表的实现,链表的实现方式不只是单链表一种,今天我们就来介绍一种新的结构,就是双链表结构,本质上是将节点间进行双向链接,从而使一些操作更加容易实现。 目录 1.双向链表的简…