SpringCloud之负载均衡Ribbon

news2024/9/27 15:20:50

1.Ribbon是什么?

•Ribbon是 Netflix 提供的一个基于HTTP和TCP的客户端负载均衡工具。

•Ribbon主要有两个功能:

1.简化远程调用

2.提供客户端的软件负载均衡算法

Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件 中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连 接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)

2.负载平衡的意义什么?

负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免 任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和 可用性。

简单来说: 先将集群,集群就是把一个的事情交给多个人去做,假如要做1000个产品给一个人做 要10天,我叫10个人做就是一天,这就是集群,负载均衡的话就是用来控制集群,他把做的最多 的人让他慢慢做休息会,把做的最少的人让他加量让他做多点。

3.Ribbon的使用

3.1 简化RestTemplate调用

在RestTemplate上添加注解@LoadBalanced

@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

在使用restTemplate发起请求时,需要url时,host:port可以替换为服务提供方的应用名称

在这里插入图片描述

4.负载均衡原理

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

在这里插入图片描述那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢?

源码跟踪

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。

显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

我们进行源码跟踪:

4.1LoadBalancerIntercepor

在这里插入图片描述可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

  • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
  • this.loadBalancer.execute():处理服务id,和用户请求。

这里的this.loadBalancerLoadBalancerClient类型,我们继续跟入。

4.2LoadBalancerClient

继续跟入execute方法:
在这里插入图片描述代码是这样的:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

放行后,再次访问并跟踪,发现获取的是8081:

在这里插入图片描述

4.3负载均衡策略IRule

在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:
在这里插入图片描述
我们继续跟入:
在这里插入图片描述
继续跟踪源码chooseServer方法,发现这么一段代码:

在这里插入图片描述我们看看这个rule是谁:
在这里插入图片描述
这里的rule默认值是一个RoundRobinRule,看类的介绍:
在这里插入图片描述
这不就是轮询的意思嘛。

到这里,整个负载均衡的流程我们就清楚了。

4.4总结

SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:
在这里插入图片描述
基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

5. 负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类
在这里插入图片描述
不同规则的含义如下:

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

5.1.自定义负载均衡策略

通过定义IRule实现可以修改负载均衡规则,有两种方式:

  1. 定义一个新的配置类:
@Configuration
public class MyRule {

    @Bean
    public IRule rule(){
        return new RandomRule();
    }
}
  1. 配置文件方式:在消费端的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

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

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

相关文章

ERA5数据不同下载方法

ERA5数据不同下载方法1 ERA5简介2 ERA5下载的三种方法2.1 方法1:GEE下载2.2 方法2:官方网站下载2.3 方法3:通过Python脚本下载(以Linux系统为例)总结参考1 ERA5简介 ERA5是ECMWF对全球气候的第五代大气再分析。再分析…

ArcGIS基础实验操作100例--实验17按条件计算属性字段值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验17 按条件计算属性字段值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

工业远程I/O模块CANopen I/O模块 安装接线说明

1)外观尺寸 DIN35mm Rail标准导轨支架外观与尺寸: 2)面板说明 指示灯说明运行指示灯 绿色预留预留错误指示灯 红色CANopen地址设置开关,CANopen 通讯速率设置开关,当 0表示通信速率为10Kbps 4表示通信速率为250Kbps 1表…

Linux | 内存 | 由内存页不足(page allocation failure)引起程序杀死(OOM Killer)

本文对由于 page allocation failure 而引起 Out of Memory Killer 的背景及工作原理进行不完全总结。 更新:2022 / 12 / 30 文章目录触发条件__alloc_pages_slowpath()__vmalloc_area_node()__vmalloc_node_range工作原理结合实例1.2.GFP_ATOMIC 和 __GFP_COMP&am…

阿里云弹性预测 AHPA:助力厨芯科技降本增效

作者:李鹏(元毅) “使用阿里云弹性预测 AHPA,降低了 K8s 容器成本,同时减轻了运维工作量,加速了业务容器化的进程。”—— 朱晏(厨芯科技VP) 背景 厨芯科技,是全球领先的餐饮设备和服务提供商…

TCP 的报头结构 和 三次握手---详解(看完必会)

TCP 的三次握手: 在搞懂三次握手前,必须要搞明白TCP报头的结构内容 TCP报头结构: 源端口号 : 源计算机上的应用程序的端口号;目的端口号 : 目标计算机的应用程序端口号;序列号:客户端给服务端发送数据时…

React 配置文件(二) 配置环境变量

开发环境一般分为: UAT(测试环境) PRE(预上线环境) PROD(生产环境) 所以本地开发分别搭建相对应环境 2.安装 dotenv 3.在package.json文件中配置环境 "scripts": { "start": "react-app-rewired start", "uat": "dotenv…

【Linux】文件系统与inode

一、文件系统 理解文件系统前首先我们要来先了解一下磁盘结构。 接下来我们看看以水平、垂直角度来看看磁盘结构,并将其区域进行划分。 磁盘的垂直分布 (此图最上面的一面和最下面的一面无磁头,则不存储数据): 磁头数:磁头就是在…

LeetCode303.区域和检索 - 数组不可变

LeetCode刷题记录 文章目录📜题目描述💡解题思路⌨C代码📜题目描述 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中…

Windows nc命令下载使用与使用bash建立反弹shell

今天继续给大家介绍渗透测试相关知识,本文主要内容是Windows nc命令下载使用与使用bash建立反弹shell。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强…

磨金石教育摄影技能干货分享|王汉冰摄影作品欣赏—《沙狐之眼》

一、偏爱新疆风光的摄影师王汉冰 王汉冰是新疆人,身为摄影师的他对新疆的大好风光有着强烈的偏爱。 因此经常驾车游历,期望寻找到好的风景,将它记录下来,让世人都能感受到大美新疆的壮丽。 在今年七月,王汉冰来到巴音郭…

C语言 内存函数 自定义类型 结构体 枚举 联合

perror #include <stdio.h> #include <errno.h> #include <string.h>//strerror //perror与上相关 更加方便直接打印错误信息 上边需要先将错误码转换为错误信息 再用printf打印 // int main() {//打开文件失败的时候&#xff0c;会返回NULLFILE* pf fo…

同为(TOWE)IPS系列工业插头插座、连接器的选型及特点

所谓工业插头插座、连接器&#xff0c;即欧洲标准插头插座&#xff0c;主要用于实现电信号的传输和控制以及电子与电气设备之间的电源连接。它可以通过连接器插头与插座之间的插合和分离&#xff0c;使电路产生接通和断开&#xff0c;适用于对安全、寿命和性能具有高要求的应用…

5款OCR文字识别软件推荐_分享好用的OCR(图片转文字)工具

5款OCR文字识别软件推荐 不知道大家是不是不知道OCR单词识别这个词。 小编认为&#xff0c;经常处理各种办公文件的朋友&#xff0c;对OCR文字识别这个词肯定有一定的了解&#xff0c;因为在处理办公文件的时候&#xff0c;很有可能会遇到对OCR文字识别的需求。 而当我们遇到O…

ubuntu16.04运行YOLOV5并部署

运行环境 环境&#xff1a;ubuntu 16.04 CUDA: 10.2 执行模型推理 1. 下载yoloV5 repo git clone https://github.com/ultralytics/yolov52. 用conda新建python环境 conda create -n yolo python3.83. 安装需求包 pip install -r requirements.txt 4. (requremets中包含…

@Configuration如何保证@Bean单例语义?

1. 前言 Spring允许通过Bean注解方法来向容器中注册Bean&#xff0c;如下所示&#xff1a; Bean public Object bean() {return new Object(); }默认情况下&#xff0c;bean应该是单例的&#xff0c;但是如果我们手动去调用Bean方法&#xff0c;bean会被实例化多次&#xff0…

iServer使用影像服务(二)——影像服务发布为wmts和wms服务的加载

前言 自从SuperMap iServer10.2.0版本开始新增影像服务模块&#xff0c;并支持大规模影像&#xff08;栅格&#xff09;数据快速发布为影像服务&#xff0c;之后推出的版本中都陆陆续续对影像服务模块扩充了新功能、增强了新特性&#xff1b;如在SuperMap iServer10.2.1版本中…

JAVA注解使用

JAVA注解使用简介概念说明自定义注解注解格式元注解注解本质属性注解生成文档案例生成的源代码生成Doc简单的自定义反射演示注解定义调用类定义测试通过注解实现配置类定义枚举类定义注解配置类使用注解测试自动生成数据库生成演示数据库注解定义使用注解创建数据表使用注解创建…

[Java安全]—fastjson漏洞利用

前言 文章会参考很多其他文章的内容&#xff0c;记个笔记。 FASTJSON fastjson 组件是 阿里巴巴开发的序列化与 反序列化组件。 fastjson 组件 在反序列化不可信数据时会导致远程代码执行。 POJO POJO是 Plain OrdinaryJava Object 的缩写 &#xff0c;但是它通指没有使用 …