Ribbon 体系架构解析

前面已经介绍了服务治理相关组件,接下来趁热打铁,快速通关Ribbon!前面我们了解了负载均衡的含义,以及客户端和服务端负载均衡模型,接下来我们就来看下SpringCloud 下的客户端负载均衡组件Ribbon 的特点以及工作模型。

负载均衡工具箱

《圣斗士星矢》
《圣斗士星矢》是一部贯穿我童年的动画片,它讲述了五个怎么也打不死的人,把其他人全部都打死的过程(突然发现童年好无聊)。在这片子中,最厉害的装备叫做黄金圣衣,总共有 12 件,分别对应十二座。这十二件中最传奇,最特殊的当属天秤座黄金圣衣,和其他圣衣相比他有以下几个特点:

  1. 丰富的组件库 整套圣衣由 12 件兵器组成,不管你是煎炸烹炒,都有合适的
    组件供你选择
  2. 给谁都能用 适配性好,跟谁都能搭配,片子里的五小强,谁拿都能用

在 SpringCloud 的世界观中,如果也要打造一件一模一样的天秤座圣衣,那一定是非Ribbon 莫属了,它也有一模一样的特点:

  1. 丰富的组件库 整套负载均衡由 7 个具体策略组成,不管你是什么特殊需求,都有合适的策略供你选择
  2. 给谁都能用 适配性好,跟谁都能搭配,SpringCloud 里的五小强(eureka,feign,gateway,zuul,hystrix),谁拿都能用。
  3. 更牛的是 Ribbon 可以脱离 SpringCloud 应用在一般项目中。

走近 Ribbon

刚才说到 Ribbon 给谁都能用,要不先让带头大哥 Eureka 试试?同学们注意了,红框白底
的是 Ribbon 自己的组件。
在这里插入图片描述
一个 HttpRequest 发过来,先被转发到 Eureka 上。此时 Eureka 仍然通过服务发现获取了
所有服务节点的物理地址,但问题是他不知道该调用哪一个,只好把请求转到了 Ribbon
手里。

  • IPing IPing 是 Ribbon 的一套 healthcheck 机制,故名思议,就是要 Ping一下目标机器看是否还在线,一般情况下 IPing 并不会主动向服务节点发起healthcheck 请求,Ribbon 后台通过静默处理返回 true 默认表示所有服务节点都处于存活状态(和 Eureka 集成的时候会检查服节点 UP 状态)。
  • IRule 这就是 Ribbon 的组件库了,各种负载均衡策略都继承自 IRule 接口。所有经过Ribbon 的请求都会先请示 IRule 一把,找到负载均衡策略选定的目标机器,然后再把请求转发过去。

负载均衡策略-七种策略

RandomRule - 随性而为

从名字就能看出,这是个很随性的策略,随性到什么程度呢?它会从当前可用的服务节点中,随机挑选一个节点访问。这分明是乱拳打死老师傅的路子吗,哪有负载均衡的智慧?别急,这里为了打死老师傅还真用了两个小花招,使用了 yield+自旋的方式做重试,还采用了严格的防御性编程。

RoundRobinRule - 按部就班

这个 ruleRandomRule 的亲兄弟,RandomRule 是随性而为挑选节点,RobinRule 却按部就班从一个节点一步一步地向后选取节点,既不会跳过一个,也不会原地踏步,每一次只向后移动一步。
在这里插入图片描述
小伙伴也许会问了,假如在多线程环境下,两个请求同时访问这个 Rule 是否会读取到相同节点呢?不会,这靠的是 RandomRobinRule 底层的自旋锁+CAS 的同步操作。CAS 的全称是 compare and swap,是一种借助操作系统函数来实现的同步操作。前面我们讲到过Eureka 为了防止服务下线被重复调用,就使用 AtomicBoolean CAS 方法做同步控制,CAS+自旋锁这套组合技是高并发下最廉价的线程安全手段,因为这套操作不需要锁定系统资源。当然了,有优点必然也有缺点,自旋锁如果迟迟不能释放,将会带来 CPU 资源的浪费,因为自旋本身并不会执行任何业务逻辑,而是单纯的使 CPU“ ”空转 。所以通常情况下会对自旋锁的旋转次数做一个限制,比如 JDK 中 synchronize 底层的锁升级策略,就对自旋次数做了动态调整。

// CAS+自旋锁获取系统资源的打开方式,真实应用中还要注意防止无休止自旋:
// 或者 for (;😉 做自旋

while (true) {
	// cas 操作
	if (cas(expected, update)) {
		// 业务逻辑代码
		// break 或退出 return
	}
}

Netflix 真是特别喜欢用自旋 CAS,毕竟作为中间件来说性能还是非常重要的。不过我实在没明白为什么名字里带个 Robin,我猜想写代码的人或者他的宠物可能叫 Robin?就像Oracle 数据库有一个默认账号叫 scott 一样。

RetryRule - 卷土重来

RetryRule 是一个类似装饰器模式的 Rule,我们前面学习服务注册的时候了解过,装饰器相当于一层套一层的俄罗斯娃娃,每一层都会加上一层独特 BUFF,我们这里复习一下装饰器的结构.
在这里插入图片描述
RetryRule 也是同样的道理,他的 BUFF “ ”就是给其他负载均衡策略加上 重试 功能。而在RetryRule 里还藏着一个 subRule,这才是隐藏在下面的真正被执行的负载均衡策略,RetryRule 正是要为它添加重试功能(如果初始化时没指定 subRule,将默认使用RoundRibinRule)。

WeightedResponseTimeRule - 能者多

这个 Rule 继承自 RoundRibbonRule,他会根据服务节点的响应时间计算权重,响应时间越长权重就越低,响应越快则权重越高,权重的高低决定了机器被选中概率的高低。也就是说,响应时间越小的机器,被选中的概率越大。
在这里插入图片描述
由于服务器刚启动的时候,对各个服务节点采样不足,因此会采用轮询策略,当积累到一定的样本时候,会切换到 WeightedResponseTimeRule 模式。关于权重的计算方式,感兴趣的小伙伴可以看看Ribbon的源码实现。

BestAvailableRule - 让最闲的人来

应该说这个 Rule 有点智能的味道了,在过滤掉故障服务以后,它会基于过去 30 分钟的统计结果选取当前并发量最小的服务节点,也就是最 “闲” 的节点作为目标地址。如果统计结果尚未生成,则采用轮询的方式选定节点。

关键字

  • 过滤故障服务
  • 选取并发量最小的节点

AvailabilityFilteringRule - 我是有底线的

这个规则底层依赖 RandomRobinRule 来选取节点,但并非来者不拒,它也是有一些底线的,必须要满足它的最低要求的节点才会被选中。如果节点满足了要求,无论其响应时间或者当前并发量是什么,都会被选中。

每次 AvailabilityFilteringRule(简称 AFR)都会请求 RobinRule 挑选一个节点,然后对这个节点做以下两步检查:

  • 是否处于熔断状态(熔断是 Hystrix 中的知识点,后面章节会讲到,这里大家可以把熔断当做服务不可用)
  • 节点当前的 active 请求连接数超过阈值,超过了则表示节点目前太忙,不适合接客,如果被选中的 server 不幸挂掉了检查,那么 AFR 会自动重试(次数最多 10 次),让RobinRule 重新选择一个服务节点。

ZoneAvoidanceRule - 我的地盘我做主

这个过滤器包含了组合过滤条件,分别是 Zone 级别和可用性级别。
在这里插入图片描述

  • Zone Filter: 在 Eureka 注册中一个服务节点有 Zone, Region 和 URL 三个身
    份信息,其中 Zone 可以理解为机房大区(未指定则由 Eureka 给定默认值),
    而这里会对这个 Zone 的健康情况过滤其下面所有服务节点。
  • 可用性过滤:这里和 AvailabilityFilteringRule 的验证非常像,会过滤掉当
    前并发量较大,或者处于熔断状态的服务节点。

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序-请求二次封装(直接可用)

一、请求封装优点 代码重用性:通过封装请求,你可以在整个项目中重用相同的请求逻辑。这样一来,如果 API 发生变化或者需要进行优化,你只需在一个地方修改代码,而不是在每个使用这个请求的地方都进行修改。 可维护性&a…

P8651 [蓝桥杯 2017 省 B] 日期问题

#include <iostream> #include <string> using namespace std;int first; int second; int third; int day[13]{0,31,0,31,30,31,30,31,31,30,31,30,31};//每月日期bool select (int i,int j,int k){if ((i%100 first) && (j second) && (k thi…

Spring Cloud + Vue前后端分离-第13章 网站开发

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第13章 网站开发 13-1 网站模块的搭建 新建web模板 1.网站开发&#xff0c;增加web模块&#xff0c;使用命令&#xff1a;vue create web vue版本4.2.3 大家拿到一个v…

第七篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像拼接和融合

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 短博文目录一、前言二、OpenCV图像拼接融合介绍三、全景图像拼接示例代码和扩展四、图像融合示例代码和扩展五、归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文系列 短博文目录…

el-table 设置内容超出宽度后省略,并添加tooltip

el-table 设置内容超出宽度后省略&#xff0c;并添加tooltip 只需要在el-table-item 标签中添加属性 :show-overflow-tooltip"true" 例子 <template><div style"width:100%; display: flex; justify-content: center;"><el-table :data&…

零基础学习数学建模——(五)美赛写作指导

本篇博客将详细讲解美赛论文写作。 文章目录 标题摘要目录引言问题背景问题重述前人研究我们的工作 模型假设及符号说明正文问题分析模型建立模型求解结果分析模型检验 模型优缺点及展望模型优缺点模型展望 参考文献及附录参考文献附录 2024年美赛论文新要求 标题 标题要简洁…

探索 SOAP:揭开 Web 服务的神秘面纱(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

vscode配置扩展

1、微软提供的C/C扩展开发包 2、C/C智能提示 3、提供as汇编的语法高亮 4、提供文件夹和文件的显示主题 5、提供链接脚本的语法高亮 6、十六进制编辑器 7、MakeFile工具

Bug: git stash恢复误drop的提交

Bug: git stash恢复误drop的提交 前几天在写ut时突然需要通过本地代码临时出一个包&#xff0c;但是本地ut又不想直接作为一个commit提交&#xff0c;所以为了省事就将ut的代码暂时stash起来。出完包后想apply stash&#xff0c;但是手误操作点成了drop stash&#xff0c;丢失了…

Adobe ColdFusion 反序列化漏洞复现(CVE-2023-38203)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion存在代码问题漏洞,该漏洞源于受到不受信任数据反序列化漏洞的影响,攻击者通过漏洞可以代码执行,可导致服务器失…

五个工业安全物联网解决方案

新一代物联网工具和应用正在帮助改变工业安全现状。传感器、可穿戴设备和位置标签提供实时数据&#xff0c;可以防止发生事故&#xff0c;并在出现故障时极大地缩短响应时间。 工业工作场所需要更加安全。根据国际劳工组织的数据&#xff0c;全球每年有近4亿工人因工受伤。近30…

matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0

matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0 目录 matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0 1. 认识 1.1 kears 1.2 kears常用数据集 2. 波士顿房价数据及可视化 2.1 下载波士顿房价数据集 2.2 展示一个属性对房价的影响 2.3 将是三个属性全部展…

【JavaSE篇】——数组的定义与使用

目录 本章的目标&#xff1a; &#x1f388;数组的基本概念 &#x1f36d;创建数组 &#x1f36d;数组的初始化 &#x1f36d;数组的使用 &#x1f449;数组中元素访问 &#x1f449;遍历数组 &#x1f388;数组是引用类型 &#x1f36d;初始JVM的内存分布 &#x1f…

SU-03T语音控制模块详解

当我们谈到智能家居时&#xff0c;经常会通过语音来控制我们的家电&#xff0c;将「懒」发挥到极致。语音模块结合了语音识别和控制技术&#xff0c;使得我们可以通过简单的口令来轻松操控灯光等设备&#xff0c;实现更智能化的生活体验。 在本文中&#xff0c;我们将探讨如何…

12.Elasticsearch应用(十二)

Elasticsearch应用&#xff08;十二&#xff09; 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;Shard&#xff09;&#xff0c;存储到多个节点单点故障问题&a…

【UE5】如何给人物骨骼绑定Control Rig用来制作动画(控制)

本篇文章暂时只教绑定人物手部的Control Rig&#xff0c;脚的Control Rig举一反三即可 1&#xff0c;右键-创建-控制绑定 2在控制绑定中-右键创建基本IK 3&#xff0c;填入上臂-下臂-手 4【手和下臂】右键-新建-Add Controls For Selected&#xff0c;&#xff08;或者新建-…

关系三元组抽取方案

一、流程概览 先用序列标注模型预测句子中的实体&#xff0c;再对实体&#xff08;加上句子&#xff09;走关系分类模型&#xff0c;预测实体的关系&#xff0c;最后形成有效的三元组。 1、数据标注 2、数据处理 处理原始数据得到ner命名实体识别的训练预测数据和关系抽取训…

激光雷达标定入门(9)ROS驱动velodyne

这里根据雷达的ros驱动来&#xff0c;这里以velodyne为例。 地址&#xff1a;mirrors / ros-drivers / velodyne GitCode # clone到src git clone .......... # back ws catkin_make # donot forget source devel/setup.bash报错&#xff1a;fatal error: pcap.h: No such f…

ensp winpcap无法安装

安装ensp的依赖软件winpcap无法安装 发现提示已有最新版本、找网上都是修改文件后缀名&#xff0c;测试后发现根本不行&#xff0c;有点扯 npcap是wireshark安装带的&#xff0c;通过卸载wireshark安装 ensp安装顺序应该先安装winpcap->wireshark->virtualbox->ens…

浪花 - 后端接口完善

一、队伍已加入用户数量 1. 封装的响应对象 UserTeamVO 新增字段 hasJoinNum 2. 查询队伍 id 列表 3. 分组过滤&#xff0c;将 team_id 相同的 userTeam 分到同一组 4. 获取每一组的 userTeam 数量&#xff0c;即一个 team_id 对应几个userTeam&#xff08;用户数量&#x…