【spring cloud Netflix】Ribbon组件

1.基本概念

SpringCloud Ribbon是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一 起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文 件中列出 LoadBalancer (简称LB:负载均衡) ,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机 连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法!

Ribbon组件就像是服务提供方和服务消费方之间的一个中间层,将用户的请求合理的分配给服务方。

LB,即负载均衡,在微服务或分布式集群中经常用的一种应用。负载均衡简单的说就是 将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高用)。常见的负载均衡软件有 Nginx、Lvs 等等。Dubbo、SpringCloud 中均给我们提供了负载均衡,SpringCloud 的负载均衡算法可以自定义。 负载均衡简单分类:

集中式LB

即在服务的提供方和消费方之间使用独立的LB设施,如Nginx(反向代理服务器),由该设施负责把访问 请求通过某种策略转发至服务的提供方!

进程式 LB

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一 个合适的服务器。Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获 取到服务提供方的地址!

2.Ribbon组件的使用

第一步:引入依赖

其实ribbon依赖并不需要单独引入,spring-cloud-starter-netflix-eureka-client这个依赖已经集成了ribbon

第二步:在服务消费方开启负载均衡

在RestTemplate组件上,使用@LoadBalanced注解开启负载均衡的调用

@Bean
@LoadBalanced//开启负载均衡的访问
public RestTemplate restTemlate(){return new RestTemplate();
}

第三步:使用服务提供方的名称进行服务调用

 @RestController@RequestMapping("consumer")@SuppressWarnings("all")public class PaymentController {@AutowiredRestTemplate restTemplate;
//通过服务实例名称进行访问
}@RequestMapping("findById/{id}")public Result<Payment> findById(@PathVariable("id") Long id){String url = "http://SERVICE-PROVIDER/provider/findById?id=" + id;Result result = restTemplate.getForObject(url, Result.class);return result;}

3.Ribbon负载均衡的算法策略

Ribbon负载均衡有一个接口:IRule。这个接口定义了负载均衡的相关约束和规范

 public interface IRule {Server choose(Object var1);void setLoadBalancer(ILoadBalancer var1);ILoadBalancer getLoadBalancer();
}

这个接口有很多实现类,不同的实现类就是不同的负载均衡算法策略

下面分别介绍这些策略

(1)轮询策略

轮询策略:RoundRobinRue,按照一定的顺序依次调用服务实例。比如一共有 3 个服务,第一次调用 服务 1,第二次调用服务 2,第三次调用服务3,依次类推。此策略的yml配置设置如下:

service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载均衡

(2)权重策略

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

service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

(3)随机策略

 随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。此策略的配置设置如下:

service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置随机策略的负载均衡

(4)最小连接数策略

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

 service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #设置负载均衡

(5)重试策略

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

ribbon:ConnectTimeout: 2000 # 请求连接的超时时间ReadTimeout: 5000 # 请求处理的超时时间
service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #设置负载均衡

(6)可用敏感性策略

 可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例(指那些处于不正常运行状态,无法正常处理客户端请求的实例),然后再选择连接数较小的服 务实例。此策略的配置设置如下:

 service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName:com.netflix.loadbalancer.AvailabilityFilteringRule

 (7)区域敏感性策略

区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务 实例,在没有区域的环境下,该策略和轮询策略类似。此策略的配置设置如下

service-provider: # 服务提供方的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

下面来讲一下轮询负载均衡算法原理

负载均衡轮询算法: rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务 重启动后rest接口计数从1开始。

如:

List[0] instances = 127.0.0.1:8002

List[1] instances = 127.0.0.1:8001

8001 + 8002 组合成为集群,它们共计2台机器,集群总数为2,按照轮询算法原理:

当总请求数为1时: 1 % 2 = 1对应下标位置为1,则获得服务地址为127.0.0.1:8001

当总请求数位2时: 2 % 2 = 0对应下标位置为0,则获得服务地址为127.0.0.1:8002

当总请求数位3时: 3 % 2 = 1对应下标位置为1,则获得服务地址为127.0.0.1:8001

当总请求数位4时: 4 % 2 = 0对应下标位置为0,则获得服务地址为127.0.0.1:8002

如此类推……

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

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

相关文章

P1036 [NOIP 2002 普及组] 选数(DFS)

题目描述 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个整数分别为 3,7,12,19 时&#xff0c;可得全部的组合与它…

在响应式网页的开发中使用固定布局、流式布局、弹性布局哪种更好

一、首先看下固定布局与流体布局的区别 &#xff08;一&#xff09;固定布局 固定布局的网页有一个固定宽度的容器&#xff0c;内部组件宽度可以是固定像素值或百分比。其容器元素不会移动&#xff0c;无论访客屏幕分辨率如何&#xff0c;看到的网页宽度都相同。现代网页设计…

二分查找与二叉树中序遍历——面试算法

目录 二分查找与分治 循环方式 递归方式 元素中有重复的二分查找 基于二分查找的拓展问题 山脉数组的顶峰索引——局部有序 旋转数字中的最小数字 找缺失数字 优化平方根 中序与搜索树 二叉搜索树中搜索特定值 验证二叉搜索树 有序数组转化为二叉搜索树 寻找两个…

字符串——面试考察高频算法题

目录 转换成小写字母 字符串转化为整数 反转相关的问题 反转字符串 k个一组反转 仅仅反转字母 反转字符串里的单词 验证回文串 判断是否互为字符重排 最长公共前缀 字符串压缩问题 转换成小写字母 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的…

现代复古电影海报品牌徽标设计衬线英文字体安装包 Thick – Retro Vintage Cinematic Font

Thick 是一种大胆的复古字体&#xff0c;专为有影响力的标题和怀旧的视觉效果而设计。其厚实的字体、复古魅力和电影风格使其成为电影海报、产品标签、活动品牌和编辑设计的理想选择。无论您是在引导电影的黄金时代&#xff0c;还是在现代布局中注入复古活力&#xff0c;Thick …

[C++面试] new、delete相关面试点

一、入门 1、说说new与malloc的基本用途 int* p1 (int*)malloc(sizeof(int)); // C风格 int* p2 new int(10); // C风格&#xff0c;初始化为10 new 是 C 中的运算符&#xff0c;用于在堆上动态分配内存并调用对象的构造函数&#xff0c;会自动计算所需内存…

Unity URP管线与HDRP管线对比

1. 渲染架构与底层技术 URP 渲染路径&#xff1a; 前向渲染&#xff08;Forward&#xff09;&#xff1a;默认单Pass前向&#xff0c;支持少量实时光源&#xff08;通常4-8个逐物体&#xff09;。 延迟渲染&#xff08;Deferred&#xff09;&#xff1a;可选但功能简化&#…

JDK8卸载与安装教程(超详细)

JDK8卸载与安装教程&#xff08;超详细&#xff09; 最近学习一个项目&#xff0c;需要使用更高级的JDK&#xff0c;这里记录一下卸载旧版本与安装新版本JDK的过程。 JDK8卸载 以windows10操作系统为例&#xff0c;使用快捷键winR输入cmd&#xff0c;打开控制台窗口&#xf…

python爬虫:DrissionPage实战教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加强自己的基础&#xff1a;爬虫自动化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我们以ChromiumPage为主&#xff0c;写代码工具使用Pycharm&#xff08;python环境3.9-3.10&#xff09; …

07-01-自考数据结构(20331)- 排序-内部排序知识点

内部排序算法是数据结构核心内容,主要包括插入类(直接插入、希尔)、交换类(冒泡、快速)、选择类(简单选择、堆)、归并和基数五大类排序方法。 知识拓扑 知识点介绍 直接插入排序 定义:将每个待排序元素插入到已排序序列的适当位置 算法步骤: 从第二个元素开始遍历…

Go语言-初学者日记(八):构建、部署与 Docker 化

&#x1f9f1; 一、go build&#xff1a;最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁&#xff0c;直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…

教程:如何使用 JSON 合并脚本

目录 1. 介绍 2. 使用方法 3. 注意事项 4. 示例 5.完整代码 1. 介绍 该脚本用于将多个 COCO 格式的 JSON 标注文件合并为一个 JSON 文件。COCO 格式常用于目标检测和图像分割任务&#xff0c;包含以下三个主要部分&#xff1a; "images"&#xff1a;图像信息&a…

Java学习总结-缓冲流性能分析

测试用例&#xff1a; 分别使用原始的字节流&#xff0c;以及字节缓冲流复制一个很大的视频。 测试步骤&#xff1a; 在这个分析性能需要一个记录时间的工具&#xff1a;这个是记录1970-1-1 00&#xff1a;00&#xff1a;00到现在的总毫秒值。 long start System.currentT…

流影---开源网络流量分析平台(五)(成果展示)

目录 前沿 攻击过程 前沿 前四章我们已经成功安装了流影的各个功能&#xff0c;那么接下来我们就看看这个开源工具的实力&#xff0c;本实验将进行多个攻击手段&#xff08;ip扫描&#xff0c;端口扫描&#xff0c;sql注入&#xff09;攻击靶机&#xff0c;来看看流影的态感效…

vs环境中编译osg以及osgQt

1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…

Unity:标签(tags)

为什么需要Tags&#xff1f; 在游戏开发中&#xff0c;游戏对象&#xff08;GameObject&#xff09;数量可能非常多&#xff0c;比如玩家、敌人、子弹等。开发者需要一种简单的方法来区分这些对象&#xff0c;并根据它们的类型执行不同的逻辑。 核心需求&#xff1a; 分类和管…

【C++11】lambda

lambda lambda表达式语法 lambda表达式本质是一个匿名函数对象&#xff0c;跟普通函数不同的是它可以定义在函数内部。lambda表达式语法使用层而言没有类型&#xff0c;所以一般是用auto或者模板参数定义的对象去接收lambda对象。 lambda表达式的格式&#xff1a;[capture-l…

fpga:分秒计时器

任务目标 分秒计数器核心功能&#xff1a;实现从00:00到59:59的循环计数&#xff0c;通过四个七段数码管显示分钟和秒。 复位功能&#xff1a;支持硬件复位&#xff0c;将计数器归零并显示00:00。 启动/暂停控制&#xff1a;通过按键控制计时的启动和暂停。 消抖处理&#…

《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数

《UNIX网络编程卷1&#xff1a;套接字联网API》第6章 I/O复用&#xff1a;select和poll函数 6.1 I/O复用的核心价值与适用场景 I/O复用是高并发网络编程的基石&#xff0c;允许单个进程/线程同时监控多个文件描述符&#xff08;套接字&#xff09;的状态变化&#xff0c;从而高…

SpringBoot+vue前后端分离整合sa-token(无cookie登录态 详细的登录流程)

SpringBootvue前后端分离整合sa-token&#xff08;无cookie登录态 & 详细的登录流程&#xff09; 1.介绍sa-token1.1 框架定位1.2 核心优势 2.如何整合sa-token3.如何进行无cookie模式登录3.1后端3.1.1 VO层3.1.2 Controller层3.1.3 Service层 3.2前端3.2.1 登录按钮自定义…