Spring Cloud Alibaba之负载均衡组件Ribbon
一、什么是负载均衡?
(1)概念:
在基于微服务架构开发的系统里,为了能够提升系统应对高并发的能力,开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中,并把访问业务功能的请求均摊到这些服务器上,这种将请求均摊的做法便叫做负载均衡。
(2)负载均衡分为硬件负载均衡和软件负载均衡两种:
- 硬件负载均衡的解决方案就是直接在服务器和外部网络间安装负载均衡设备,通常这种设备称为负载均衡器。由专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量统计,可达到最佳的负载均衡效果。
- 软件负载均衡的解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。
那么如何才能实现把访问业务功能的请求均摊到这些服务器上呢?这里就要用到Ribbon组件了。
二、什么是Ribbon组件?
简单来说,Ribbon是一个客户端负载均衡器,提供多种负载均衡策略,以便在客户端选择最佳的服务实例。同时也是Spring Cloud Alibaba 体系中负责负载均衡的组件,是一组类库的集合。
它在Spring Cloud体系中扮演着以下几个角色:
(1)客户端负载均衡:
Ribbon在客户端进行负载均衡,而不是依赖服务器端的负载均衡器。
(2)服务调用:
与Eureka等服务发现组件集成,通过服务名称来调用不同的服务实例。可以保留服务结点访问的相关统计信息,这样可以避免向高延迟或低高故障的节点发送请求。
(3)定制策略:
允许用户定制负载均衡策略,如随机策略、轮询策略等。系统便会根据指定的负载均衡算法,从多个服务节点中选取一个结点出来发送请求得到对应的服务。
三、Ribbon的工作原理:
使用Ribbon实现负载均衡时,基本用法是注入一个RestTemplate,并使用@LoadBalanced注解标注RestTemplate,从而使RestTemplate具备负载均衡的能力。
- 当Spring容器启动时,使用@LoadBalanced注解修饰的RestTemplate会被添加拦截器,拦截器中使用了LoadBalancerClient处理请求,从而达到负载均衡的目的。
- LoadBalancerClient是Spring Cloud提供的一个非常重要的接口,它继承ServiceInstanceChooser接口,该接口的实现类是RibbonLoadBalanceClient,它们之间的关系如下图所示。

- LoadBalancerClient提供的两个execute()方法用于执行请求, reconstructURI()方法用于重构URL。
- RibbonLoadBalanceClient是LoadBalancerClient的实现类,它用来执行最终的负载均衡请求。其中,RibbonLoadBalanceClient的一个choose()方法用于选择具体的服务实例,其内部是通过getServer()方法交给ILoadBalancer完成的。
- ILoadBalancer是一个接口,该接口定义了一系列实现负载均衡的方法。ILoadBalancer接口的实现类结果如下图所示。

默认情况下,Ribbon使用的负载均衡策略是轮询,实际上,Ribbon提供了很多负载均衡算法,其中IRule接口就是所有负载均衡算法的父接口。
四、Ribbon在处理负载均衡时的核心组件:
(1)IRule:定义负载均衡规则的接口,不同的实现类提供不同的负载均衡策略。
(2)IPing:用于定期检查服务实例的健康状况,确保请求不会发送到不可用的实例。
(3)ServerList:维护可用服务实例的列表,可以从服务注册中心(如Eureka)动态获取。
(4)ServerListFilter:用于过滤服务实例列表,确保负载均衡器仅考虑健康和可用的实例。
(5)ILoadBalancer:管理服务实例列表,并根据负载均衡规则选择一个实例来处理请求。
五、Ribbon负载均衡策略:
- Round Robin Rule(轮询策略):按顺序循环选择每个服务实例,均衡地分配请求。实现了按照线性轮询的方式依次选择服务的功能。
- Weighted Response Time Rule(权重响应时间策略): 根据每个实例的响应时间和权重进行分配,响应时间越快,服务权重越大,被选中的概率越高,获得的请求也会越多。
- Availability Filtering Rule(可用性过滤策略): 简单来说就是,过滤掉不可用的或并发请求超过阈值的实例,选择健康的实例。使用Availability Predicate过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阀值的服务,然后对剩余的服务列表进行轮询。
- Random Rule(随机策略):该策略实现了从服务清单中随机选择一个服务的功能。
-
Least Concurrent Connections(最少并发策略):选择当前并发请求最少的实例,减轻高负载实例的压力。
- Best Available Rule(最佳可用策略):用于先过滤掉多次访问故障而处于断路跳闸状态的服务,然后选择一个并发量最小的服务。
- Client Config Enable Round Robin Rule(客户端配置启用轮询策略):该类是一个抽象类,该类本身没有实现什么特殊的处理逻辑,我们也不会直接使用该策略,但是通过BestAvailableRule和继承该策略默认实现了线性轮询,它的内部定义了一个RoundRobinRule策略,
- Zone Avoidance Rule(区域感知策略):它是PredicateBasedRule的具体实现类,其内部通过使用ZoneAvoidancePredicate和AvailabilityPredicate判断是否选择某一个服务,前者用于判断服务所在区域的性能是否可用,后者用于过滤掉连接数过多的服务。
- Predicate Based Rule:继承了ClientConfigEnableRoundRobinRule,其内部会先通过chooseRoundRobinAfterFiltering()方法筛选服务清单,然后以线性轮询的方式从过滤后的服务清单中选择一个服务。
六、实练操作:
Ribbon实现负载均衡:
(1)创建名为ServiceProvider1的服务项目:
-
添加依赖到pom文件.
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> </dependencies>
-
在resources目录编写application.properties配置文件.
nacos.discovery.server-addr=127.0.0.1:8848 spring.application.name=ServiceProvider server.port=1111
-
编写启动类,加入注解,说明本项目所包含的服务方法是需要注册到Nacos注册中心.
@EnableDiscoveryClient @SpringBootApplication public class SpringBootApp {public static void main(String[] args) {SpringApplication.run(SpringBootApp.class, args);} }
-
编写Controller.java控制类,编写对外提供服务方法.
@RestController public class Controller {@RequestMapping("/callServiceByRibbon")public String callServiceByRibbon(){return "return in Service1.";} }
(2)创建名为ServiceProvider2的服务项目:
-
修改pom文件.
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> </dependencies>
-
修改application.properties配置文件.
nacos.discovery.server-addr=127.0.0.1:8848 spring.application.name=ServiceProvider server.port=2222
-
修改控制类的方法.
@RestController public class Controller {@RequestMapping("/callServiceByRibbon")public String callServiceByRibbon(){return "return in Service2.";} }
(3)创建名为ServiceWithRibbon的maven项目:
-
添加依赖到pom文件.
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency> </dependencies>
-
在启动类添加注解.
@EnableDiscoveryClient @SpringBootApplication public class SpringBootApp {public static void main(String[] args) {SpringApplication.run(SpringBootApp.class, args);}@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}
-
修改配置文件.
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 server.port=8080 spring.application.name=ServiceWithRibbon ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRibbonRule
-
编写controller控制类.
@RestController public class Controller {@Resourceprivate RestTemplate restTemplate;@RequestMapping("/callFuncByRibbon")public String callFuncByRibbon(){return restTemplate.getForObject("http://ServiceProvider/callServiceByRibbon", String.class);} }
相关文章:
Spring Cloud Alibaba之负载均衡组件Ribbon
一、什么是负载均衡? (1)概念: 在基于微服务架构开发的系统里,为了能够提升系统应对高并发的能力,开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中,并把访问业务功能的请求均…...
tkinter显示图片
tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…...
000.二分查找算法题解目录
000.二分查找算法题解目录 69. x 的平方根(简单)34. 在排序数组中查找元素的第一个和最后一个位置(中等)...
数据资产赋能企业决策:通过精准的数据分析和洞察,构建高效的数据资产解决方案,为企业提供决策支持,助力企业实现精准营销、风险管理、产品创新等目标,提升企业竞争力
一、引言 在信息化和数字化飞速发展的今天,数据已成为企业最宝贵的资产之一。数据资产不仅包含了企业的基本信息,还蕴含了丰富的市场趋势、消费者行为和潜在商机。如何通过精准的数据分析和洞察,构建高效的数据资产解决方案,为企…...
【java开发环境】多版本jdk 自由切换window和linux
win10 一、准备 各种版本的jdk,按自己的需要下载。 我这里是需要jdk17和jdk8。 1、jdk17 下载:Java Downloads | Oracle,选择exe后缀文件 2、jdk8下 载:Java Downloads | Oracle,选择exe后缀文件 二、详细步骤 1、…...
MySQL实训项目——餐饮点餐系统
项目简介:餐饮点餐系统是一款为餐厅和顾客提供便捷点餐服务的在线平台。通过该系统,餐厅能够展示其菜单,顾客可以浏览菜品,并将其加入购物车或直接下单。系统还提供了订单管理功能,方便餐厅跟踪和处理顾客的订单。 1. …...
昇思MindSpore学习总结七——模型训练
1、模型训练 模型训练一般分为四个步骤: 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后,可以进行模型的训练与评估。 2、构建数据集 首先从数据集 Dataset加载代码࿰…...
AI时代创新潮涌,从探路到引路,萤石云引领千行百业创新
步入AI新时代,AI、云计算、大数据等技术迅速迭代,并日益融入经济社会发展各领域全过程,数字经济成为推动千行百业转型升级的重要驱动力量。 今年的政府工作报告提出,深入推进数字经济创新发展。积极推进数字产业化、产业数字化&a…...
计算机毕业设计Python深度学习美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
Python美食推荐系统开题报告 一、项目背景与意义 随着互联网和移动技术的飞速发展,人们的生活方式发生了巨大变化,尤其是餐饮行业。在线美食平台如雨后春笋般涌现,为用户提供了丰富的美食选择。然而,如何在海量的餐饮信息中快速…...
【鸿蒙学习笔记】鸿蒙ArkTS学习笔记
应用开发导读:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-dev-guide-V5 这里写目录标题 基础组件通用属性容器组件Button 迭代完备 【鸿蒙培训】第1天・环境安装 【鸿蒙培训】第2天・装饰器・组件和页面…...
广东行政职业学院数据智能订单班开班暨上进双创工作室签约仪式圆满结束
为响应教育领域数字化与智能化浪潮这一变革,给学生提供更好的教育资源和实践机会,6月27日,“泰迪广东行政职业学院数据智能订单班开班仪式暨上进双创工作室签约授牌”在广东行政职业学院举行。广东行政职业学院智慧政务学院(电子信…...
python与matlab微分切片的区别
python python使用np中的linespace生成等间隔数值, import numpy as np numpy.linspace(start, stop, num50, endpointTrue, retstepFalse, dtypeNone, axis0)start:序列的起始值。stop:序列的结束值。如果 endpoint 为 True,该…...
MSPG3507——蓝牙接收数据显示在OLED,滴答定时器延时500MS
#include "ti_msp_dl_config.h" #include "OLED.h" #include "stdio.h"volatile unsigned int delay_times 0;//搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } int a0; …...
Linux 安装 Redis 教程
优质博文:IT-BLOG-CN 一、准备工作 配置gcc:安装Redis前需要配置gcc: yum install gcc如果配置gcc出现依赖包问题,在安装时提示需要的依赖包版本和本地版本不一致,本地版本过高,出现如下问题:…...
【高考志愿】建筑学
目录 一、专业介绍 1.1 专业定义 1.2 专业培养目标 1.3 核心课程 二、就业方向和前景 2.1 就业方向 2.2 专业前景 三、报考注意 四、行业趋势与未来展望 五、建筑学专业排名 一、专业介绍 1.1 专业定义 建筑学,这一充满艺术与科技魅力的学科,…...
Kubernetes的发展历程:从Google内部项目到云原生计算的基石
目录 一、起源与背景 1.1 Google的内部项目 1.2 Omega的出现 二、Kubernetes的诞生 2.1 开源的决策 2.2 初期发布 三、Kubernetes的发展历程 3.1 社区的成长 3.2 生态系统的壮大 3.3 重大版本和功能 3.4 多云和混合云的支持 四、Kubernetes的核心概念 4.1 Pod 4.…...
/proc/config.gz
前言 有时候,我们想知道一个运行着的内核都打开了哪些编译选项,当然,查看编译环境的 .config 文件是一个不错的选择,除此之外,还有没有别的办法呢?当然有,那就是 /proc/config.gz。 一睹风采 …...
论坛万能粘贴手(可将任意文件转为文本)
该软件可将任意文件转为文本。 还原为原文件的方法:将得到的文本粘贴到记事本,另存为UUE格式,再用压缩软件如winrar解压即可得到原文件。建议用于小软件。 下载地址:https://download.csdn.net/download/wgxds/89505015 使用演示…...
学习笔记——动态路由——OSPF(OSPF协议的工作原理)
八、OSPF协议的工作原理 1、原理概要 (1)相邻路由器之间周期性发送HELLO报文,以便建立和维护邻居关系 (2)建立邻居关系后,给邻居路由器发送数据库描述报文(DBD),也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器…...
Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)
目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
