SpringCloud系列:负载均衡组件-Ribbon

news2024/11/23 23:38:54

作者平台:

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文一共4529字,预计阅读12分钟

前言

前面几篇文章介绍了微服务相关的内容,比如什么是微服务,常见的一些服务注册中心组件,以及微服务之间是如何进行服务通信的。

在微服务架构中还有常见的一种场景就是服务的负载均衡。今天就一起学习SpringCloud提供的负载均衡组件-Ribbon。

什么是Ribbon

Spring Cloud Ribbon是一个基于http和tcp的客户端负载均衡工具,是基于netflix ribbon实现的,通过Spring Cloud封装, 可以让我们将面向服务的resttemplate请求自动转换成客户端负载均衡的服务调用。

所以Ribbon是SpringCloud提供一套客户端负载均衡组件,提供一系列的完善的配置,如超时,重试等,它有助于控制HTTP和TCP的客户端的行为。通过Load Balancer获取到服务提供的所有机器实例, Ribbon会自动基于某种规则(默认是轮询机制)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
在这里插入图片描述

标题Ribbon的负载均衡策略

基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略,分别是:

1、RoundRobinRule(轮询策略)

轮询策略是Ribbon的默认策略,是按照顺序,依次对所有的服务实例进行访问。比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3。

2、WeightedResponseTimeRule(权重策略)

权重策略是根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。

3、RetryRule(重试策略)

重试策略指的是按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。

4、RandomRule(随机策略)

随机策略比较简单就是指从服务提供者的列表中随机选择一个服务实例。

5、BestAvailableRule(最小连接数策略)

最小连接数策略,也叫最小并发数策略,它是指遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。

6、ZoneAvoidanceRule(区域敏感策略)

区域敏感策略是根据服务所在区域的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。

7、AvailabilityFilteringRule(可用敏感性策略)

可用敏感性策略是先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。

在ribbon中可以通过下述命令指定负载均衡策略,比如设置RoundRobinRule:

ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

设置其他策略修改具体的策略名即可。

除此之外还可以自定义负载均衡策略。自定义负载均衡策略,则需要继承com.netflix.loadbalancer.AbstractLoadBalancerRule抽象类。

图片

实战

项目导入spring-cloud-starter-consul-discovery依赖后,包含了ribbon依赖,所以不需要额外导入ribbon依赖。项目是在之前项目的基础上, 可以参考:SpringCloud系列:服务注册中心组件—consul文中的项目。
在这里插入图片描述
使用resttemplate+ribbon组件去实现负载均衡,主要有三种方法:

1、使用DiscoveryClient对象

DiscoveryClient是一种服务发现客户端对象,可以用来获取服务注册中心的信息:

@Autowired
private DiscoveryClient discoveryClient;
//创建一个RestTemplate对象
RestTemplate restTemplate = new RestTemplate();
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("orders");
serviceInstances.forEach(serviceInstance -> {
logger.info("服务主机:{};服务地址:{};服务端口:{}",serviceInstance.getHost(),serviceInstance.getUri(),serviceInstance.getPort());
});
String result = restTemplate.getForObject(serviceInstances.get(0).getUri()+"/order/order",String.class);

通过DiscoveryClient的getInstances方法根据服务id去服务注册中心获取对应的服务列表到本地中,但是可以发现这里其实并没有负载均衡,还是需要自己去实现负载均衡,并且服务的访问路径还是需要进行拼接。

2、LoadBalancerClient对象

LoadBalancerClient对象是一种负载均衡客户端对象,也是根据服务id去服务注册中心获取对应的服务列表,并且根据默认的负载均衡策略选择服务列表中的一台机器并返回,所以这里返回的是一个服务,而DiscoveryClient返回的是服务列表:

ServiceInstance serviceInstance = loadBalancerClient.choose("orders");
logger.info("服务主机:{};服务地址:{};服务端口:{}",serviceInstance.getHost(),serviceInstance.getUri(),serviceInstance.getPort());
String result = restTemplate.getForObject(serviceInstance.getUri()+"/order/order",String.class);

可以发现使用LoadBalancerClient时需要每次先根据服务id获取一个负载均衡的机器之后再通过resttemplate调用服务,也较为复杂和繁琐。

3、使用@LoadBalanced注解

@LoadBalanced注解是来自cloud包下的一个注解,这个注解就是让某一个东西拥有负载均衡的能力,该注解主要用在方法上。

比如这里就是让这个RestTemplate在请求时拥有客户端负载均衡的能力。可以这样写在一个配置类中:

@Configuration
public class MyConfig {
    @Bean
    @LoadBalanced //使其具有负载均衡属性
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

然后在需要进行负载均衡的地方,使用服务名+请求路径即可:

String result = restTemplate.getForObject("http://orders/order/order",String.class);

这是如果启动项目,输入:

http://localhost:8083/user/user

并不断刷新,进行请求,则会按照默认的轮询的负载均衡策略依次请求8084和9999端口的请求:
图片
图片
通过上述的代码可以发现,Ribbon是客户端的负载均衡,它实现负载均衡是根据调用服务的服务id去服务注册中心获取对应服务id的服务列表,并将服务列表拉取到本地进行缓存,然后在本地根据负载均衡机制在现有的列表中选择可以可用节点提供服务。

Ribbon是一种客户端的负载均衡,在使用Ribbon的负载均衡中,大致可以分为以下几步:

1、首先拦截请求,并且通过请求中的url地址,截取服务名称 ;

2、通过LoadBalancerClient获取ILoadBalancer;

3、根据服务id在Eureka、consul等服务注册中心中获取服务列表;

4、通过IRule负载均衡策略选择具体服务;

5、ILoadBalancer通过IPing及定时更新机制来维护服务列表;

6、重构该url,并且最终调用HttpURLConnection发起请求。

总结

以上就是springcloud中使用resttemplate+ribbon实现负载均衡的内容。Ribbon是客户端的负载均衡,它实现负载均衡是根据调用服务的服务id去服务注册中心获取对应服务id的服务列表,并将服务列表拉取到本地进行缓存,然后在本地根据负载均衡机制在现有的列表中选择可以可用节点提供服务。

有任何问题或者不正确的地方,欢迎指出,交流讨论!

文章项目源码在:https://github.com/JiangXia-1024/SpringCloudProject。

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

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

相关文章

【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

音频驱动嘴形之CodeTalker

论文发版&#xff1a;CVPR2023 应用&#xff1a; Over the discrete motion space, a temporal autoregressive model is employed to sequentially synthesize facial motions from the input speech signal, which guarantees lip-sync as well as plausible facial expres…

TOWE智能PDU是如何帮助机房安然度夏的?

最近&#xff0c;全国各地纷纷进入高温“火炉”模式&#xff0c;炎炎夏日&#xff0c;数据中心的工作温度不应该超过一定的限度。数据中心机房不仅要确保在高温多雨天气下安全、稳定的运维&#xff0c;还要承受降低企业总体运营成本的压力。这种需求下&#xff0c;相较于传统基…

【C++修炼之路】类和对象(下)—— 完结篇

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

C++笔试常用函数整理

数组 #include <vector> push_back&#xff1a;向量尾部增加一个元素 pop_back&#xff1a;删除向量中最后一个元素 empty&#xff1a;判断向量是否为空&#xff0c;若为空&#xff0c;则向量中无元素 size : 输出队列中数据元素的个数 vector初始化相关&#xff1a…

Java使用poi-tl1.9.1生成Word文档的几个小技巧

目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果 三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧 总结 前言 也许在您的工作当中会碰到如下的一些场景…

python和django中安装mysqlclient失败的解决方案

在Pychram中和pip中安装mysqlclient都不成功&#xff0c;只能直接下载二进制包进行安装了&#xff0c;下载页面中根据python的版本选择对应WHL包下载&#xff0c;下载地址 mysqlclient PyPIhttps://pypi.org/project/mysqlclient/#files 通过pip命令进行安装 pip install d:\…

基于javascript的简单拖拽排序

基于javascript的简单拖拽排序 效果示例图代码示例 效果示例图 代码示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing:…

网工内推 | 数通网工专场,HCNP/CCNP认证优先

01 天津海展会议展览有限公司 招聘岗位&#xff1a;网络工程师&#xff08;数通方向&#xff09; 职责描述&#xff1a; 1、负责企业整体网络架构的设计、优化、部署及网络运维管理体系的的构建&#xff1b; 2、负责企业内网、外网、有线侧、无线侧网络策略的配置及调优&…

虚拟主播动捕设备,满足不同应用领域的3d虚拟主播直播需求

随着移动互联网的普及&#xff0c;直播行业迅速发展&#xff0c;用户规模持续上升&#xff0c;一度成为平台经济领域的中流砥柱&#xff0c;其中虚拟主播成为了直播赛道中一种新的内容形式。 3d虚拟主播是通过计算机生成的数字人&#xff0c;它们可以在直播中通过虚拟主播动捕…

Vue成绩案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能

一、成绩案例 ✅✅✅通过本次案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能。 准备成绩案例模板&#xff0c;我们需要在这些模板上面进行功能操作。 <template><div class"score-case"><div class"table">…

材料学博士生CSC资助德国联陪归来谈体会

作者许潇洒&#xff0c;为西北工业大学材料学院材料学专业博士研究生&#xff0c;受CSC高水平大学公派研究生项目&#xff0c;于2022年至2023年赴德国德累斯顿工业大学开展了为期12个月博士联合培养学习。访学归来&#xff0c;其撰文谈感受&#xff0c;知识人网小编转载如下&am…

润和软件与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;江苏润开鸿数字科技有限公司(以下简称“润开鸿”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于润开鸿的硬件产品及解决方案开…

如何通过smardaten无代码开发平台快速搭建数据中台?

目录 一、数据中台是什么&#xff1f;二、数据中台的特点1、数据中台需要具备哪些特性&#xff1f;2、数据中台需要提供哪些服务&#xff1f; 三、数据中台搭建工具四、如何用无代码快速搭建数据中台1、多源数据接入2、数据流&#xff08;数据集成&#xff09;3、数据资产管理4…

el-table刷新后保持高亮并改变状态字段

一、需求&#xff1a; 1、点击左侧右边显示具体内容 2、点击右边确认 左侧依旧高亮并且改变启动状态颜色 3、点击刷新、重置、高级搜索等不高亮 右边也不显示具体内容 二、效果图&#xff1a; 三、具体实施 1、定义highlight-current-row 是否高亮行 <el-table ref&quo…

opencv -13 掩模

什么是掩膜&#xff1f; 在OpenCV中&#xff0c;掩模&#xff08;mask&#xff09;是一个与图像具有相同大小的二进制图像&#xff0c;用于指定哪些像素需要进行操作或被考虑。掩模通常用于选择特定区域或进行像素级别的过滤操作。 OpenCV 中的很多函数都会指定一个掩模&…

数据结构链表,结点的结构体定义以及增删改查的实现

一、单链表的定义和表示 线性表链式存储结构的特点是&#xff1a;用一组任意的存储单元存储线性表的数据元素&#xff08;这组存储单元可以是连续的&#xff0c;也可以是不连续的&#xff09;。因此&#xff0c;为了表示每个元素与其直接后继数据元素之间的逻辑关系&#xff0…

基于G6的弓字形流程图

需求 现在有个需求是类似于步骤条、流程图&#xff0c;但是节点比较多。 搜了很多类似组件&#xff0c;还是有各种问题。 尝试过的已有组件 一开始用的是element-ui自带的步骤条组件&#xff08;下图所示&#xff09;&#xff0c;但是节点过多&#xff0c;宽度不够的时候&am…

提升按钮效力:七大基本原则全面解析

按钮是交互设计中的基本元素。他们在用户和系统之间扮演重要角色。在本文中&#xff0c;我们将一起思考创建有效按钮所需了解的七个基本原则。 ⬇⬇⬇点击获取更多设计资源 https://js.design/community?categorydesign&sourcecsdn&planbbqcsdn768 让按钮看起来像按…

基于RASC的keil电子时钟制作(瑞萨RA)(1)----安装RASC

基于RASC的keil电子时钟制作_瑞萨RA_1安装RASC 概述硬件准备视频教程RA Smart Configurator软件下载RASC安装Keil下Renesas RA pack包安装 概述 RA Smart Configurator"是一种基于"灵活组合软件"概念的代码生成辅助工具。它可以自动生成微控制器的初始配置程序…