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://xiahunao.cn/news/2905303.html

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

相关文章

I.MX6ULL_Linux_系统篇(25) buildroot文件系统构建

前面我们学习了如何使用 busybox 来构建根文件系统&#xff0c;但是 busybox 构建的根文件系统不齐全&#xff0c;很多东西需要我们自行添加&#xff0c;比如 lib 库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植&#xff0c;这些第三方软件有很多又依赖其他…

CorelDRAW25.0.0.230中文最新开心和谐版本

CorelDRAW是一款非常流行的矢量图形设计软件&#xff0c;其25.0.0.230版本带来了许多新特性和更新内容。以下是我所能提供的相关信息&#xff1a; 首先&#xff0c;关于特性方面&#xff0c;CorelDRAW 25.0.0.230版本具有强大的矢量编辑功能&#xff0c;用户可以轻松创建和编辑…

MoneyPrinterTurbo搭建详细流程(Linux)及常见问题

先附上链接: MoneyPrinterTurbohttps://github.com/harry0703/MoneyPrinterTurboMoneyPrinterTurbo是一款合成视频的软件。 你只需要提供一个主题或者关键字,就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐,然后合成一个高清的短视频。 接下来讲解详细的搭…

动态规划刷题(算法竞赛、蓝桥杯)--导弹拦截(线性DP)

1、题目链接&#xff1a;[NOIP1999 提高组] 导弹拦截 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e55; int a[N],x,n; int b[N],len;int main(){while(cin>>x)a[n]x;//求最长不上升子序列 b[0]2e9;//初始化为无穷大for(int i1;i<n;i){if(…

金属氧化物压敏电阻的冲击破坏机理高能压敏电阻分析

以氧化锌为主的金属氧化物阀片在一定的电压和电流作用下的破坏可分为热破坏和冲击破坏两类。 热破坏是指氧化锌电阻在交流电压持续作用时发生的破坏,即由于阀片在交流作用下的发热超过了其散热能力而导致的热平衡失控的现象。交流引起的热破坏可以分为几种不同情况:一种是由于…

康耐视visionpro-CogFindCircleTool工具详细说明

CogFindCircleTool功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③.预期的圆弧:设置预期圆弧的中心点…

Zookeeper的选主流程

Zookeeper的核心是原子广播&#xff0c;这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式&#xff0c;它们分别是恢复模式&#xff08;选主&#xff09;和广播模式&#xff08;同步&#xff09;。当服务启动或者在领导者崩溃后&#xff…

【RISC-V】如何使用release的risc-v gnu toolchain

riscv64-elf-ubuntu-22.04-gcc-nightly-2024.03.01-nightly.tar.gz 首先去release页面中获取相应的压缩包 将压缩包解压到想解压的位置&#xff0c;这里我选择了 mv Downloads/riscv64-elf-ubuntu-22.04-gcc-nightly-2024.03.01-nightly.tar.gz riscv64-tool-chain/然后解压…

稀碎从零算法笔记Day26-LeetCode:跳跃游戏

断更多天&#xff0c;懒狗ex 题型&#xff1a;数组、模拟、类似双指针&#xff1f; 链接&#xff1a;55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组…

【实现报告】学生信息管理系统(顺序表)

目录 实验一 线性表的基本操作 一、实验目的 二、实验内容 三、实验提示 四、实验要求 五、实验代码如下&#xff1a; &#xff08;一&#xff09;顺序表的构建及初始化 &#xff08;二&#xff09;检查顺序表是否需要扩容 &#xff08;三&#xff09;根据指定学生个…

PHP图床程序优化版:图片外链服务、图床API服务、图片CDN加速与破解防盗链

图片免费上传 支持本地储存、FTP储存、第三方云储存&#xff08;阿里云 OSS、腾讯云 COS、七牛云等&#xff09;。 图片外链加速 一键转换第三方网站的图片外链地址为图床可分享的图片地址&#xff08;支持CDN&#xff09;。 图片解析服务 直接将第三方外链图片地址显示为…

【spring】AbstractApplicationContext 的refresh() 方法学习

上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习 AbstractApplicationContext 的refresh() 方法介绍 AbstractApplicationContext的refresh()方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。 refresh(…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

[RoarCTF 2019]Online Proxy --不会编程的崽

这几天也是ctf做得有点头疼了。好些序列化的题没碰&#xff0c;一直做些sql注入类的题目。闲来无事&#xff0c;在更一次sql注入吧。 整个页面就这点信息。首先想想为什么他能获取你的ip。猜测是数据包X-Forwarded-For。 它还输出上次访问页面客户端的ip。很明显了&#xff0c…

可视化图表:饼图,展示数据的比例关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的饼图设计&#xff0c;欢迎老铁持续关注我们。 可视化饼图是一种常用的数据展示方式&#xff0c;它以圆形图表的形式展示数据的比例关系。饼图通过将数据按照比例划分成不同的扇区&#xff0c;每个…

自动发卡平台源码优化版配套免签个人支付宝微信插件

这款免签个人支付宝微信插件&#xff0c;配套的是 自动发卡平台源码优化版&#xff0c;支持个人免签支付 其他系统的不支持&#xff01;

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【计算机网络】第 11、12 问:流量控制和可靠传输机制有哪些?

目录 正文流量控制的基本方法停止-等待流量控制基本原理滑动窗口流量控制基本原理 可靠传输机制1. 停止-等待协议2. 后退 N 帧协议&#xff08;GBN&#xff09;3. 选择重传协议&#xff08;SR&#xff09; 正文 流量控制涉及对链路上的帧的发送速率的控制&#xff0c;以使接收…

MTransE阅读笔记

Multilingual Knowledge Graph Embeddings for Cross-lingual Knowledge Alignment 用于交叉知识对齐的多语言知识图谱嵌入(MTransE) Abstract 最近的许多工作已经证明了知识图谱嵌入在完成单语知识图谱方面的好处。由于相关的知识库是用几种不同的语言构建的&#xff0c;因…

Day25:统一处理异常、AOP编程、统一记录日志

表现层在最外面&#xff0c;异常在这层处理。 SpringBoot处理异常的简单实现 把error文件夹放在templates文件夹下&#xff0c;html命名为状态吗&#xff1a; 修改404.html和500.html为模版&#xff08;注意图片路径修改为动态&#xff09; 更细粒度的处理异常的方式 Control…