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.mfbz.cn/a/496283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例&#xff0c;演示了如何使用CONCAT函数&#xff1a; -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…

拥抱绿色革命!揭秘CAE仿真技术在风电能源领域的应用

众所周知&#xff0c;风能是清洁能源的代表&#xff0c;而风电更是其核心。伴随着全球电力需求的日益增长以及环保节能意识的逐渐加强&#xff0c;加强生态文明建设&#xff0c;推进绿色低碳发展&#xff0c;已成为当今社会的共识。政府工作报告提到&#xff0c;过去一年可再生…

MySQL高级SQL2

一、表连接 二、视图 三、null值和空值区别 四、存储过程 五、函数 六、字符串函数 七、日期时间函数

Java Swing游戏开发学习19

内容来自RyiSnow视频讲解 这一节讲的是**Entity ArrayList(Render Order Revised)**实体数组列表&#xff08;渲染顺序修改&#xff09;。 前言 由于NPC和player的实体碰撞区域比他们本身的大小要小&#xff0c;所以会造成一个bug&#xff0c;当前的绘制顺序是&#xff0c;NP…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

Web框架开发-Django中间件

一、中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。 Django的中间件的定义: Middleware is a framework of hooks into Dj…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

git reset版本回退后悔药(图文例子)

目录 版本回退前期测试样例准备git reset --soft 不撤销add,撤销commit,保留修改git reset --mixed 或 git reset () 撤销add,撤销commit,保存修改git reset --hard 撤销add,撤销commit,不保存修改git reset --merge 取消合并git reset --keep 不撤销add,撤销commit,根据情况判…

单链表的插入和删除

一、插入操作 按位序插入&#xff08;带头结点&#xff09;&#xff1a; ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;//在第i 个位置插插入元素e (带头结点) bool Li…

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

win11 查看 wifi 密码

** win11 查看 wifi 密码 ** 第一种方法&#xff1a; 1.点击桌面左下角的开始菜单&#xff0c;选择“设置”。 2.在网络和internet中选择“高级网络设置”。 3.在相关设置下方点击“更多网络适配器选项”。 4.右击“WLAN”&#xff0c;在WLAN信息窗口点击“状态”。 5.…

月入10.5k;36岁生物专业转行网优,选择真的比努力更重要!

张雪峰说&#xff1a;普通家庭的孩子选择专业首要要考虑的是能不能就业&#xff1f;能不能拿到高薪&#xff1f;因为除了你的父母&#xff0c;没人会对你的未来负责。 学历和专业哪个更重要&#xff1f;不同的人往往会有不同的解答&#xff0c;今天故事的主人公H先生毕业于武汉…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具&#xff0c;基于此&#xff0c;做一篇学习笔记进行记录。 二、安装 ID…

centos7系统下nginx1.24.0升级

如果没有这些目录&#xff0c;请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件&#xff1a; cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

正弦实时数据库(SinRTDB)使用(3)-用户管理

通过实时数据库管理工具登录后&#xff0c;在头部功能区的用户管理或左侧导航菜单的用户管理都可以打开用户管理功能界面&#xff0c;用户管理功能界面展示在中部主窗口区。 用户管理界面如下所示&#xff1a; 用户管理顶部包含刷新、添加用户、修改角色、修改密码及删除用户等…

【CASS精品教程】CASS添加标准图幅(50×50cm+50×40cm)

大比例尺地形图图幅一般分为正方形和矩形分幅两种,本文讲解CASS中添加标准图幅(5050cm、5040cm)的方法。 文章目录 一、CASS参数配置二、添加标准图幅(5050cm)三、添加标准图幅(5040cm)打开基于CASS自带案例数据study.dat绘制好的地形图study.dwg,如下图所示,下面来演示两种…

近年来,常见5大软件开发项目管理工具

时代进步&#xff0c;技术进步&#xff0c;汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project&#xff08;或MSP&#xff09;是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

2024年给Mac电脑提速小妙招

经常听到小伙伴在抱怨PC电脑很慢&#xff0c;但是其实Mac电脑随着用的时间增长&#xff0c;运行速度也会越来越慢&#xff0c;那么造成Mac运行慢的原因有很多&#xff0c;可能是操作系统过时未更新&#xff0c;也可能是内存&#xff08;RAM&#xff09;不足&#xff0c;以下小编…