Ribbon 体系架构解析

news2024/11/24 12:50:16

前面已经介绍了服务治理相关组件,接下来趁热打铁,快速通关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学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

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

相关文章

day04 两两交换链表中的节点、删除链表倒数第N个节点、链表相交、环形链表II

题目链接:leetcode24-两两交换链表中的节点, leetcode19-删除链表倒数第N个节点, leetcode160-链表相交, leetcode142-环形链表II 两两交换链表中的节点 基础题没有什么技巧 解题思路见代码注释 时间复杂度: O(n) 空间复杂度: O(1) Go func swapPairs(head *Li…

Android Handler完全解读

一,概述 Handler在Android中比较基础,本文笔者将对此机制做一个完全解读。读者可简单参考上述类图与时序图,便于后续理解。 二,源码解读 1,主线程伊始 众所周知,通过Zygote的fork方式,新创建…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏,在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活,也…

网页转文件下载工具

为了更快捷copy博客 做了个 网页转文件下载工具 1.0.1 更新如下: javaphpjava提供页面转换文件的微服务APIphp调用接口,输出文件下载支持网页转md 1.0.2 更新如下: 样式表切换,白天or黑夜,cookie七天保质期 未…

全国首条智慧高速开通,“车牌付” 会取代传统 ETC 收费吗?

2024年1月19日,全国首条智慧高速--杭绍甬高速杭绍段正式建成通车!项目全长约52.8公里,设计速度120公里/小时,是长三角智慧交通示范项目。 01 杭绍甬 “慧眼”感知系统 全国首条智慧高速公路--杭绍甬高速在视频AI算法、IoT物联网、…

SpringBoot系列之MybatisPlus实现分组查询

SpringBoot系列之MybatisPlus实现分组查询 我之前博主曾记写过一篇介绍SpringBoot2.0项目怎么集成MybatisPlus的教程,不过之前的博客只是介绍了怎么集成,并没有做详细的描述各种业务场景,本篇博客是对之前博客的补充,介绍在mybat…

mac裁剪图片

今天第一次用mac裁剪图片,记录一下过程,差点我还以为我要下载photoshop了, 首先准备好图片 裁剪的目的是把图片的标题给去掉,但是不能降低分辨率,否则直接截图就可以了 解决办法 打开原始图片(不要使用预览&#xf…

【机器学习笔记】0 基础知识之python基础

注:本文内容仅为个人学习笔记,教程为黄海广老师主讲的机器学习入门系列, 课程链接(中国大学慕课,有习题和证书) 课程资源(pdf版本课件和代码)公布在Github链接 课程视频也可以在b站观…

python10-Python的字符串之拼接字符串

如果直接将两个字符串紧挨着写在一起,Python就会自动拼接它们,例如如下代码。 s1 "软件测试划水老师傅,"软件测试老痞print(s1) 上面代码将会输出: 软件测试划水老师傅,软件测试老痞 上面这种写法只是书写字符串的一…

数学知识第三期 欧拉函数

前言 相信大家在高中的时候接触过欧拉函数,希望大家通过本篇文章能够进一步理解欧拉函数!!! 一、什么是欧拉函数? 欧拉函数是一个在数论中用于描述特定正整数的互质数的概念。具体来说,对于一个正整数n&…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(7)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

电商API接口|爬虫案例|采集某东商品评论信息

前言: 平常大家都有网上购物的习惯,在商品下面卖的好的产品基本都会有评论,当然也不排除有刷评论的情况,因为评论会影响我们的购物决策。今天主要分享用pythonre正则表达式获取京东商品评论。API接口获取京东平台商品详情SKU数据…

API网关-Apinto压缩包方式自动化安装配置教程

文章目录 前言一、Apinto安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. Apinto命令4.1 启动Apinto4.2 停止Apinto4.3 重启Apinto4.4 查看Apinto版本信息4.5 加入Apinto集群4.6 离开Apinto集群4.7 查看Apinto节点信息 5. 卸载Apinto 二、Apserver(Apinto Dashboard V3)安装教…

powermock: 一个支持 gRPC 的 Mock Server

文章目录 背景选型架构安装配置使用教程快速开始接口定义配置启动 Mock 规则redis 插件HTTP Mock高级配置前置准备场景一 特定 ID 返回特定用户信息场景二 通过脚本返回用户数据 总结参考资料 本文介绍的是如何基于 bilibili 的开源方案 powermock 搭建一套通用的适用于自己公司…

11. 双目视觉之立体视觉基础

目录 1. 深度恢复1.1 单目相机缺少深度信息1.2 如何恢复场景深度?1.3 深度恢复的思路 2. 对极几何约束2.1 直观感受2.2 数学上的描述 1. 深度恢复 1.1 单目相机缺少深度信息 之前学习过相机模型,最经典的就是小孔成像模型。我们知道相机通过小孔成像模…

uniapp scroll-view用法[下拉刷新,触底事件等等...](4)

前言:可滚动视图区域。用于区域滚动 话不多说 直接上官网属性 官网示例 讲一下常用的几个 scroll 滚动时触发 scrolltoupper 滚动到顶部或左边,会触发 scrolltoupper 事件 scrolltolower 滚动到底部或右边,会触发 scrolltolower 事件 1.纵向滚动…

【揭秘】RecursiveAction全面解析

内容概要 RecursiveAction是Java中一个强大的工具,它允许将复杂任务分解为更小的子任务,这些子任务可以并行执行,从而提高整体性能,其主要优点在于能够有效地利用多核处理器,减少任务执行时间,并简化并行编…

SQL注入:盲注

SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 目录 什么是盲注? 布尔盲注 手工注入 使用python脚本 使用sqlmap 时间盲注 手工注入 使用python脚本 使…

SpringBoot项目配置SSL后,WebSocket连接失败的解决方案

SpringBoot项目配置SSL后,WebSocket连接应使用wss协议,而不是ws协议。在前端配置WebSocket时,URL以wss://开头。

【计算机网络】中小型校园网构建与配置

拓扑图配置文件传送门 Packet Tracer-中小型校园网配置布局文件文件 相关文章 【计算机网络】IP协议及动态路由算法 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 原理 1. Network 广域网,WAN Wide Area Network&#xff…