Spring Cloud Alibaba之负载均衡组件Ribbon

news2024/12/24 4:04:41

一、什么是负载均衡?

(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负载均衡策略:

  1. Round Robin Rule(轮询策略)按顺序循环选择每个服务实例,均衡地分配请求。实现了按照线性轮询的方式依次选择服务的功能。
  2. Weighted Response Time Rule(权重响应时间策略): 根据每个实例的响应时间和权重进行分配,响应时间越快,服务权重越大,被选中的概率越高,获得的请求也会越多。
  3. Availability Filtering Rule(可用性过滤策略): 简单来说就是,过滤掉不可用的或并发请求超过阈值的实例,选择健康的实例。使用Availability Predicate过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阀值的服务,然后对剩余的服务列表进行轮询。
  4. Random Rule(随机策略)该策略实现了从服务清单中随机选择一个服务的功能。
  5. Least Concurrent Connections(最少并发策略)选择当前并发请求最少的实例,减轻高负载实例的压力。

  6. Best Available Rule(最佳可用策略)用于先过滤掉多次访问故障而处于断路跳闸状态的服务,然后选择一个并发量最小的服务。
  7. Client Config Enable Round Robin Rule(客户端配置启用轮询策略):该类是一个抽象类,该类本身没有实现什么特殊的处理逻辑,我们也不会直接使用该策略,但是通过BestAvailableRule和继承该策略默认实现了线性轮询,它的内部定义了一个RoundRobinRule策略,
  8. Zone Avoidance Rule(区域感知策略):它是PredicateBasedRule的具体实现类,其内部通过使用ZoneAvoidancePredicate和AvailabilityPredicate判断是否选择某一个服务,前者用于判断服务所在区域的性能是否可用,后者用于过滤掉连接数过多的服务。
  9. 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
    @Bean
    public 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 {

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping("/callFuncByRibbon")
    public String callFuncByRibbon(){
        return restTemplate.getForObject("http://ServiceProvider/callServiceByRibbon", String.class);
     }
}

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

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

相关文章

Kubernetes之 资源管理

系列文章目录 Kubernetes之 资源管理 文章目录 系列文章目录前言一、资源管理介绍二、YAML语言介绍 1.1.YAML语法&#xff1a;2.读入数据总结 一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 1. kub…

SMTP 转发器/中继

设置中继邮件服务器 我将设置一个邮件服务器&#xff0c;该服务器稍后将用作 SMTP 中继服务器。首先&#xff0c;在 Digital Ocean 中创建了一个新的 Ubuntu Droplet&#xff1a; Postfix MTA 安装在droplet上&#xff0c;并带有&#xff1a; apt-get install postfix 在pos…

序列检测器(Moore型)

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请用Moore型状态机实现序列“1101”从左至右的不重叠检测。 电路的接口如下图所示。当检测到“1101”&#xff0c;Y输出一个时钟周期的高电平脉冲。 接口电路图如下&#xff1a; 输入描述&#xff1a…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候&#xff0c;发现相同的概念很多&#xff0c;有必要给这些概念做一下区分&#xff0c;不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论&#xff0c;然后通过一个例子来说明。 【机…

阿里云服务器通过镜像下hunggingface上的模型

参考连接https://blog.csdn.net/lanlinjnc/article/details/136709225 https://www.bilibili.com/video/BV1VT421X7xe/?spm_id_from333.337.search-card.all.click&vd_source1ba257184239f03bd3caf4c6cab427e4 pip install -U huggingface_hub# 建议将上面这一行写入 ~/…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载&#xff0c;或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令&#xff0c;显示GPU情况 出错处理&…

Android开发系列(十一)Jetpack Compose之Dialog

Dialogs是在应用程序中显示一些额外信息或进行用户交互的常见功能。Jetpack Compose中的Dialog可以通过使用AlertDialog组件来创建。 基本用法 下面通过示例来了解Dialog的使用。 OptIn(ExperimentalMaterial3Api::class) Composable fun AlertDialogExample(onDismissReques…

vue3用自定义指令实现按钮权限

1&#xff0c;编写permission.ts文件 在src/utils/permission.ts import type { Directive } from "vue"; export const permission:Directive{// 在绑定元素的父组件被挂载后调用mounted(el,binding){// el&#xff1a;指令所绑定的元素&#xff0c;可以用来直接操…

从文章到视频:如何用ChatGPT打造自媒体全能内容

在当今自媒体时代&#xff0c;内容创作的多样性和多元化成为了吸引和保持观众注意力的关键。无论是文章、视频还是音频内容&#xff0c;创作者们都需要灵活运用各种形式来触达不同的受众群体。ChatGPT作为一种先进的AI语言模型&#xff0c;能够为自媒体创作者提供强大的支持&am…

通过代理从ARDUINO IDE直接下载开发板包

使用免费代理 实现ARDUINO IDE2.3.2 下载ESP8266/ESP32包 免费代理 列表 测试代理是否可用的 网站 有时&#xff0c;代理是可用的&#xff0c;但依然有可能找不到开发板管理器的资料包。 可以多换几个代理试试。 代理的配置 文件 -> 首选项 -> 网络 进入后做如下配置…

OpenCV报错已解决:Vector析构异常OpencvAssert CrtlsValidHeapPointer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 在使用OpenCV进行图像处理时&#xff0c;我们可能会遇到Vector析构异常OpencvAssert CrtlsValidHeapPointer的问题。本文将…

电脑开机就一直在开机界面转圈,怎么回事?

前言 前段时间小白去给一位朋友修电脑。她说这个电脑很奇怪&#xff0c;有时候开机很快就进入电脑界面&#xff0c;但有时候开机一直在那转圈&#xff0c;半天也不见进入。 Windows7系统的小伙伴应该也有遇到过类似的问题&#xff0c;就是电脑一直在Windows的logo界面&#xf…

39 - 安全技术与防火墙

39、安全技术和防火墙 一、安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和事后监督。不主动介入&#xff0c;默默看着你&#xff08;监控&#xff09;。 入侵防御系统&#xff1a;透明模式工作&#xff0c;数据包&#xff0c;网络监控…

MySQL8 新特性——公用表表达式用法

MySQL8 新特性——公用表表达式用法_mysql ctes-CSDN博客 1.普通公用表表达式 MySQL8 新特性——公用表表达式用法 在MySQL 8.0及更高版本中&#xff0c;引入了公用表表达式&#xff08;Common Table Expressions&#xff0c;CTEs&#xff09;&#xff0c;它是一种方便且可重…

生信实证系列Vol.15:如何用AlphaFold2,啪,一键预测100+蛋白质结构

"结构就是功能"——蛋白质的工作原理和作用取决于其3D形状。 2020年末&#xff0c;基于深度神经网络的AlphaFold2&#xff0c;一举破解了困扰生物学界长达五十年之久的“蛋白质折叠”难题&#xff0c;改变了科学研究的游戏规则&#xff0c;可以从蛋白质序列直接预测…

AI Agent项目实战(02)-对话情感优化

1 使用prompt设计agent性格与行为 添加系统 prompt&#xff1a; self.SYSTEMPL """你是一个非常厉害的算命先生&#xff0c;你叫JavaEdge人称Edge大师。以下是你的个人设定:1. 你精通阴阳五行&#xff0c;能够算命、紫薇斗数、姓名测算、占卜凶吉&#xff0c…

高中数学:不等式-常见题型解题技巧

一、“1”的代换 练习 例题1 例题2 解 二、基本不等式中的“变形” 就是&#xff0c;一般情况下&#xff0c;我们在题目中&#xff0c;是不能够直接使用基本不等式进行求解的。 而是要对条件等式进行变形&#xff0c;满足基本不等式的使用条件 练习 例题1 解析 两边同…

13 Redis-- MySQL 和 Redis 的数据一致性

Redis-- MySQL 和 Redis 的数据一致性 先抛一下结论&#xff1a;在满足实时性的条件下&#xff0c;不存在两者完全保存一致的方案&#xff0c;只有最终一致性方案。 不好的方案&#xff1a;先写 MS&#xff0c;再写 Redis 例如 &#xff1a;A请求更新数据为10&#xff0c;B…

RK3588编译环境配置

安装Ubuntu18.04 安装Ubuntu请参考其他教程 安装vmware-tools 如果vmware版本过低&#xff0c;vmware-tools安装可能会出现各种问题。 建议直接用apt-get install安装vmware-tools sudo apt-get update sudo apt-get install open-vm-tools open-vm-tools-desktop vmware-…

酒店民宿预订小程序:高效管理,便捷入住

目前&#xff0c;我国旅游业发展非常旺盛&#xff0c;同时也带动了酒店民宿的快速发展。随着互联网科技的快速发展&#xff0c;酒店民宿小程序层出不穷。一个高效的小程序目前已经成为了各大服务业中必不可少的环节&#xff0c;对于酒店民宿商家来说&#xff0c;线上小程序不仅…