Ribbon简介

目录

一 、概念介绍

1、Ribbon是什么 

2、认识负载均衡

2.1 服务器端的负载均衡

2.2 客户端的负载均衡

3、Ribbon工作原理

4、Ribbon的主要组件

IClientConfig

ServerList

ServerListFilter

IRule

Iping

ILoadBalancer

ServerListUpdater        

5、Ribbon支持的9大负载均衡策略

1、 RoundRobinRule 线性轮询策略

2、RetryRule 重试策略

3、WeightedResponseTimeRule 加权响应时间策略

4、RandomRule 随机策略

5、ClientConfigEnabledRoundRobinRule 客户端配置启用线性轮询策略

6、BestAvailableRule 最空闲策略

7、PredicateBasedRule 过滤线性轮询策略

8、ZoneAvoidanceRule 区域感知轮询策略

9、AvailabityFilteringRule 可用性过滤策略

二、Ribbon使用案例

1、配置类方式进行配置

2、配置文件方式进行配置(更简单清晰)


如果要看使用,可直接跳过前面概念看案例 

一 、概念介绍

1、Ribbon是什么 

——ribbon是客户端负载均衡组件

ribbon是Netflix公司的开源项目,是一款基于HTTP和TCP的客户端负载均衡组件,它是不是可以独立部署的。Spring Cloud Ribbon基于Ribbon实现,基于轮询、随机等规则自动调用服务,也可以根据需要自定义负载均衡算法。

2、认识负载均衡

在我们生活中,负载均衡也随处可见。

例子:

        1)超市收银窗口可以看成是负载均衡,当超市人流过多,增设窗口降低排队,是一种负载均衡提升买单效率减少排队的策略

        2)理发店理发也可以看成是负载均衡,客户进店理发分配给理发师理发或者客户自己选择某个理发师理发也是一种负载均衡策略

        3)餐馆后厨也看一看成是一个负载均衡,客户点菜,分配厨师炒菜,怎么分配厨师,其内部也有其策略。

        在我们程序中,负载均衡通常指的是服务器端的负载均衡,比如增设多个服务器来响应用户请求,多个服务器通过一定的管理规则来处理请求的转发。也有客户端的负载均衡。下面来介绍下

2.1 服务器端的负载均衡

        服务器端负载均衡,主要通过在客户端和服务端之间增加负载均衡器来实现。而负载均衡器又分为硬件负载均衡和软件负载均衡:

  • 硬件负载均衡:主要采用F5、Radware、Array、A10等硬件设备。
  • 软件负载均衡:在普通的服务器(硬件)上安装具有负载均衡功能的软件,以完成请求分发进而实现负载均衡。常见的负载均衡软件有Nginx、LVS、Haproxy

原理:负载均衡器维护着一个正常服务清单,通过心跳机制来删除“出现故障的服务节点”或者追加“恢复服务的节点”,以保证清单的有效性。

客户端的请求达到服务端的负载均衡器时,负载均衡将按照某种配置好的规则从可用服务清单中选出一台服务器去处理客户端的请求。这就是服务器端负载均衡。

例子:

餐馆案例:客人(客户端)去餐馆点菜,餐馆管理人员(负载均衡器)根据客人所点菜,分配给后台某个相对闲一点能做该菜系的厨师(服务器)烹饪。

2.2 客户端的负载均衡

        客户端负载均衡的实现原理和服务器端负载均衡的实现原理差不多,它们的区别是:客户端本身拥有“服务提供者”清单,而服务器端负载均衡的“服务提供者清单”存储在负载均衡器中。

        在客户端负载均衡中,所有客户端节点都管理着一份自己要访问的服务提供者清单,这些清单都是从“服务中心”(Eureka、Consul等)获取的。

例子:

理发店案例:客人(客户端)去理发店理发,里边指定要求某个理发师(服务端)理发。

3、Ribbon工作原理

4、Ribbon的主要组件

  • IClientConfig

        用于读取配置,默认值是DefaultConfigImpl。查看源码可以看到一些默认配置,其中配置了ZoneAwareLoadBalancer和AvailibityFilteringRule,一下是部分源码配置

public class DefaultClientConfigImpl implements IClientConfig {public static final Boolean DEFAULT_PRIORITIZE_VIP_ADDRESS_BASED_SERVERS = Boolean.TRUE;public static final String DEFAULT_NFLOADBALANCER_PING_CLASSNAME = "com.netflix.loadbalancer.DummyPing"; // DummyPing.class.getName();public static final String DEFAULT_NFLOADBALANCER_RULE_CLASSNAME = "com.netflix.loadbalancer.AvailabilityFilteringRule";public static final String DEFAULT_NFLOADBALANCER_CLASSNAME = "com.netflix.loadbalancer.ZoneAwareLoadBalancer";public static final boolean DEFAULT_USEIPADDRESS_FOR_SERVER = Boolean.FALSE;public static final String DEFAULT_CLIENT_CLASSNAME = "com.netflix.niws.client.http.RestClient";public static final String DEFAULT_VIPADDRESS_RESOLVER_CLASSNAME = "com.netflix.client.SimpleVipAddressResolver";public static final String DEFAULT_PRIME_CONNECTIONS_URI = "/";public static final int DEFAULT_MAX_TOTAL_TIME_TO_PRIME_CONNECTIONS = 30000;public static final int DEFAULT_MAX_RETRIES_PER_SERVER_PRIME_CONNECTION = 9;public static final Boolean DEFAULT_ENABLE_PRIME_CONNECTIONS = Boolean.FALSE;public static final int DEFAULT_MAX_REQUESTS_ALLOWED_PER_WINDOW = Integer.MAX_VALUE;public static final int DEFAULT_REQUEST_THROTTLING_WINDOW_IN_MILLIS = 60000;
  • ServerList

        用户获取“服务提供者”地址列表。它即可以是一组固定的地址,也可以是从“注册中心”中定期查询出的“服务提供者”地址列表。

源码分析:

这里简单看下如何从配置文件中读取,追踪ConfigurationBasedServerList

追踪源码可以看到其配置规则ServiceName.ribbon.listOfServers: xxxxx1,xxxx2,xxxx3

  • ServerListFilter

        用于在原始的“服务提供者”地址列表中使用一定策略过滤一部分不符合条件的地址(仅当使用动态ServerList时使用)

  • IRule

        负责处理负载均衡的规则,默认通过ZoneAvoidanceRule选择实例。Ribbon的工作流程如下:

        (1)通过ServerList获取所有可用的“服务提供者”地址列表

        (2)通过ServerListFilter过滤一部分“服务提供者”地址

        (3)在剩下的地址中通过IRule选出一台服务器

  • Iping

        用来筛掉Ping不通的实例

  • ILoadBalancer

        Ribbon的入口

  • ServerListUpdater        

        更新ServerList。当“服务中心”上“服务提供者”实例的个数发生变化时,Ribbon里的ServerList会根据默认值PollingServerListerUpdate定时更新“服务提供者”地址列表。

5、Ribbon支持的9大负载均衡策略

        核心方法都是通过choose()方法来选择一个实例

1、 RoundRobinRule 线性轮询策略

        按顺序挨个请求

2、RetryRule 重试策略

        在方法失效时间内不停尝试,如果失效choose()方法会返回null

3、WeightedResponseTimeRule 加权响应时间策略

4、RandomRule 随机策略

        随机选取一个

5、ClientConfigEnabledRoundRobinRule 客户端配置启用线性轮询策略

6、BestAvailableRule 最空闲策略

7、PredicateBasedRule 过滤线性轮询策略

8、ZoneAvoidanceRule 区域感知轮询策略

        以区域、可用服务器为基础

9、AvailabityFilteringRule 可用性过滤策略

二、Ribbon使用案例

1、配置类方式进行配置

项目结构,ribbon配置规则类不能放到@CommponentScan能扫描到的地方

pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- Generated by https://start.springboot.io --><!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn --><groupId>com.dolphin</groupId><artifactId>RibbonRule</artifactId><version>0.0.1-SNAPSHOT</version><name>RibbonRule</name><description>RibbonRule</description><properties><java.version>21</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

创建IRule的配置类

启动类中添加注解和开启负载均衡支持

@RibbonClients(value = {@RibbonClient(name = "order-service",configuration = RibbonRandomRuleConfig.class),@RibbonClient(name = "stock-service",configuration = RibbonRoundRobinRuleConfig.class)
})

yaml添加服务器配置

编写测试类

运行项目测试

2、配置文件方式进行配置(更简单清晰)

项目结构

pom文件和上边一致

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!-- Generated by https://start.springboot.io --><!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn --><groupId>com.dolphin</groupId><artifactId>RibbonRule</artifactId><version>0.0.1-SNAPSHOT</version><name>RibbonRule</name><description>RibbonRule</description><properties><java.version>21</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

开启负载均衡支持

负载IRule规则均衡配置

测试类

启动项目访问测试结果与上边案例一致,这种相对简单些

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

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

相关文章

BGP实训

BGP基础配置实训 实验拓扑 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为2的设备&#xff0c;以此类推&#xff1b;另外&#xff0c;同一网段中&#xff0c;IP 地址的主…

vs右键在浏览器中查看报错

vs右键在浏览器中查看报错Visual studio 右键在浏览器中查看报错HTTP错误500.30——ANCM进程内启动失败——.NET Core HTTP Error 500.30 - ANCM In-Process Start Failure - .NET Core HTTP Error 500.30 - ANCM In-Process Start Failure Common solutions to this issue: …

海量电动汽车数据无法解决?不放试试基于MonteCarlo方法的大规模电动汽车充放电模型程序代码!

前言 电动汽车大规模入网充电时会导致系统内负载峰值拔高的问题&#xff0c;和分布式电源一样&#xff0c;都会对电网的安全稳定运行造成冲击&#xff0c;需要在满足系统运行经济效益最优的同时&#xff0c;尽量降低大量电动汽车入网无序充电对系统造成的不良影响。通过分析电…

【WEEK5】 【DAY4】数据库操作【中文版】

2024.3.28 Thursday 目录 2.数据库操作2.1.数据库2.1.1.新建数据库&#xff08;右键的方法&#xff09;2.1.2.查询&#xff1a;点击“查询”->“新建查询表”即可输入所需要的语句&#xff0c;点击“运行”&#xff0c;如&#xff1a; 2.2.结构化查询语句分类2.3.数据库操作…

帝国cms自适应html5古诗词历史名句书籍文章资讯网站源码整站模板sinfo插件带采集会员中心

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 帝国cms自适应html5古诗词名句书籍文…

<TensorFlow学习使用P1>——《TensorFlow教程》

一、TensorFlow概述 前言&#xff1a; 本文中一些TensorFlow综合案例的代码逻辑一般正常&#xff0c;在本地均可运行。如有代码复现运行失败&#xff0c;原因如下&#xff1a; &#xff08;1&#xff09;运行环境配置可能有误。 &#xff08;2&#xff09;由于一些数据集存储空…

电脑ip地址如何改?这些修改方法请收好!

在数字化日益深入的今天&#xff0c;电脑作为我们日常工作和生活中的重要工具&#xff0c;其网络功能显得尤为关键。而在网络世界中&#xff0c;IP地址则是电脑连接互联网的身份证&#xff0c;它标识着电脑在网络中的位置与身份。然而&#xff0c;在某些特定情境下&#xff0c;…

头歌 实验一 关系数据库标准语言SQL湖北汽车工业学院 )

头歌 实验一 关系数据库标准语言SQL 制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01; 目录 头歌 实验一 关系数据库标准语言SQL**制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01;** 第一关&#xff1a;创建数据库第…

C语言: 指针讲解

为什么需要指针? &#xff08;1&#xff09;指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果&#xff0c;但是这样往往效率不太好&#xff0c;因为诸如结构体等大型数据&#xff0c;占用的字节数多&#xff0c;复制很消耗性能…

LTE 信道的分配

**部分笔记** 逻辑信道 数据在下行的经过RLC层处理后&#xff0c;会根据数据的类型进行不同的逻辑信道&#xff08;数据类型的不听&#xff0c;用户的不同&#xff09; 传输信道 在逻辑信道达到MAC层后&#xff0c;会被分配到 物理信道 逻辑信道 按照内容的属性以及UE的不…

【Java常用的API】JDK8相关时间类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

第十三届蓝桥杯JavaA组省赛真题 - 裁纸刀

解题思路&#xff1a; 一道简单的数学题 先看例子&#xff0c;边缘必须裁四次&#xff0c;然后得到两行三列共六张二维码。 横线5裁一次&#xff0c;竖线6 7 8 9各裁一次&#xff0c;加上裁边缘的四次&#xff0c;共九次。 也就是说&#xff0c;横向裁剪次数为【行数 - 1】…

数独——拥有一定难度的回溯练习题,值得一看

数独相信大家都玩过&#xff0c;也都拥有不同的策略&#xff0c;那么放到C中又是怎样的呢&#xff1f;其实它就是回溯算法。话不多说&#xff0c;直接用例题来讲解&#xff1a; Description 数独是根据99盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并…

52 vue 中 image 资源直接使用 路径 和 使用require 的差异

前言 这也是 最近碰到的一个比较有趣的问题 是在 http 请求较多的场景下触发的情况 一般 我们的 Vue 中使用图片的地方, 一般会使用 require(“$imgPath”) 或者 “/$imgPath” 来配置图片的资源 然后 这个在目标页面 http 请求比较多的情况下, 两者 会有一些 差异, 我们…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏&#xff08;TouchScreen&#xff09;和滚动球&#xff08;TrackBall&#xff09;是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球&#xff0c;主要可以通过使用运动事…

沃尔玛百货有限公司 企业网页设计制作 企业html网页成品 跨国公司网页设计开发 web前端开发,html+css网页设计素材,静态html学生网页成品源码

沃尔玛百货有限公司 WalMart 7页面 企业主题 带jquery图片轮播特效 滚动文字 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.or…

如何保证redis里的数据都是热点数据

MySQL 里有 2000w 数据&#xff0c;Redis 中只存 20w 的数据&#xff0c;如何保证 redis 中的数据都是热点数据&#xff1f; 1.Redis 过期删除策略 1&#xff09;惰性删除:放任键过期不管&#xff0c;但是每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c…

华为 Pocket 2 防晒指南:用好这三个功能,再也不用担心被晒伤了!

防晒现在已经是外出护肤的日常操作&#xff0c;但为什么明明涂了防晒霜还是会被晒伤&#xff1f;华为 Pocket 2的出现&#xff0c;为我们带来了全新的防晒解决思路&#xff0c;可以在防晒霜涂抹、晒斑检测、紫外线强度检测三方面帮到我们。 紫外线看不见也摸不着&#xff0c;我…

【跟着CHATGPT学习硬件外设 | 04】ADC

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 1.1 快速入门 模数转换器&#xff08;ADC&#xff0c;Analog-to-Digital Converter&#xff09;是一种将模拟信号转换为数字信号的电子设备。模拟信号通常表示物理测量的连…

【CKA模拟题】案例演示如何创建PVC

Useful Resources: Persistent Volumes Claim 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesA persistent volume named red-pv-cka is available. Your task is to create a Persi…