Ribbon IPing机制源码探秘

🍊 Java学习:社区快速通道

🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想

🍊 绝对不一样的职场干货:大厂最佳实践经验指南


📆 最近更新:2023年7月2日


🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力!


文章目录

  • IPing机制
  • 用时间换空间
  • Ribbon IPing机制源码探秘

IPing机制

Ribbon会主动判断服务节点的当前状态,决定是否可作为目标节点,只有当前可用的节点才会作为负载均衡器的目标节点。IPing有以下几个手段:

  • DummyPing:默认返回true,即认为所有节点都可用,这也是单独使用Ribbon时的默认模式
  • NIWSDiscoveryPing:借助Eureka服务发现机制获取节点状态,假如节点状态是UP则认为是可用状态
  • PingUrl:主动向服务节点发起一次http调用,如果对方有响应则认为节点可用
  • PingConstant:返回设置的常量值
  • NoOpPing:返回true

假如服务节点搭载的服务本身就承载超高并发的情况下,那这种主动出击的IPing策略必然会大大增加服务节点的访问压力。


Ribbon IPing是一个接口,可以通过实现该接口来自定义Ping机制。Ribbon IPing的实现类需要在配置文件或者代码中指定,例如:

#单个服务设置
[service-name]:ribbon:NFLoadBalancerPingClassName: com.netflix.loadbalancer.DummyPing

public class MicroRibbonConfig {@Beanpublic IPing microIPing() {return new DummyPing();}
}@RibbonClient(name = "micro-service", configuration = MicroRibbonConfig.class)
public class RibbonClientConfig {
}

Ribbon IPing的作用是保证负载均衡器只选择可用的服务节点,提高系统的可靠性和性能。Ribbon IPing与Eureka结合使用时,可以实现自动化的服务发现和健康检查。


用时间换空间

在Ribbon这里,时间和空间经常要被换来换去,时间代表着接口响应时间(RT,Response Time),空间表示服务器的可用连接数。

在Ribbon里有两个和时间与空间密切相关的负载均衡策略,BestAvailableRule(简称BA)和WeightedResponseTimeRule。他们都会选择压力较小的服务节点,但这两个策略的方向不同。BA会根据服务节点过去一段时间的请求数,选择并发量最小的机器(选择空间);WRT则是根据响应时间的统计结果,选择响应时间最快的服务(选择时间)。

  • 连接数敏感模型: 对响应时间较短,或RT和业务复杂度是非线性相关关系的接口,采用基于可用连接数的负载均衡策略更加合适。
  • RT敏感模型: 对重量级接口,尤其是根据参数不同会导致系统资源使用率浮动较大的接口(RT与业务复杂度线性相关),建议采用基于响应时间的负载均衡策略。

总结一下就是轻量级接口选空间(BestAvailableRule)、重量级接口选时间(WeightedResponseTimeRule


Ribbon IPing机制源码探秘

IPing接口的定义如下:

public interface IPing {public boolean isAlive(Server server);
}

看一下它的几个实现类:

public class DummyPing extends AbstractLoadBalancerPing {public DummyPing() {}public boolean isAlive(Server server) {return true;}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}
}

什么都没发生,直接返回true


public class NoOpPing implements IPing {@Overridepublic boolean isAlive(Server server) {return true;}
}

也是直接返回true


PingUrl的内容比较丰富,关注一下isAlive方法:

public boolean isAlive(Server server) {String urlStr = "";if (this.isSecure) {urlStr = "https://";} else {urlStr = "http://";}urlStr = urlStr + server.getId();urlStr = urlStr + this.getPingAppendString();boolean isAlive = false;HttpClient httpClient = new DefaultHttpClient();HttpUriRequest getRequest = new HttpGet(urlStr);String content = null;try {HttpResponse response = httpClient.execute(getRequest);content = EntityUtils.toString(response.getEntity());isAlive = response.getStatusLine().getStatusCode() == 200;if (this.getExpectedContent() != null) {LOGGER.debug("content:" + content);if (content == null) {isAlive = false;} else if (content.equals(this.getExpectedContent())) {isAlive = true;} else {isAlive = false;}}} catch (IOException var11) {var11.printStackTrace();} finally {getRequest.abort();}return isAlive;
}

如果是安全协议则使用https,不是安全的则使用http,拼接的时候先加上一个server.getId(),再加上一个this.getPingAppendString()


HttpClient httpClient = new DefaultHttpClient();
HttpUriRequest getRequest = new HttpGet(urlStr);

构造一个http请求来判断是否是up状态


if (this.getExpectedContent() != null)

如果有返回的期望值,则需要实际返回的数据等于期望值才证明是服务节点是up的


NIWSDiscoveryPing实现类:

public boolean isAlive(Server server) {boolean isAlive = true;if (server!=null && server instanceof DiscoveryEnabledServer){DiscoveryEnabledServer dServer = (DiscoveryEnabledServer)server;                InstanceInfo instanceInfo = dServer.getInstanceInfo();if (instanceInfo!=null){                    InstanceStatus status = instanceInfo.getStatus();if (status!=null){isAlive = status.equals(InstanceStatus.UP);}}}return isAlive;
}

只有server的类型是DiscoveryEnabledServer才将其转换成自己需要的类型,然后获得instanceInfo

这里InstanceStatus依靠eureka的服务发现从服务注册中心拉取到的,服务发现并不能即使反映所有服务器的状态变化,因为是客户端发起的,所以有延迟。

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

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

相关文章

为啥离不了 linux

Linux与Windows都是十分常见的电脑操作系统,相信你对它们二者都有所了解!在你的使用过程中,是否有什么事让你觉得在Linux上顺理成章,换到Windows上就令你费解?亦或者关于这二者你有任何想要分享的,都可以在…

DAPP(七)——React与智能合约的架构整合

合并一下react和智能合约,创建react脚手架 create-react-app myapp 将合约中对应的文件 复制到 react脚手架的根目录中 结果如下: 下载合约所要的依赖: npm i openzeppelin-solidity 可以在脚手架终端执行truffle的命令语句,t…

AIGC文生图:使用ControlNet 控制 Stable Diffusion

1 ControlNet介绍 1.1 ControlNet是什么? ControlNet是斯坦福大学研究人员开发的Stable Diffusion的扩展,使创作者能够轻松地控制AI图像和视频中的对象。它将根据边缘检测、草图处理或人体姿势等各种条件来控制图像生成。 论坛地址:Adding…

Unity 编辑器-查找所有未被使用的Prefab

需求 接到一个需求,将Res里所有特效相关的prefab检查一下,没有使用的移除。 分析 先拆解一下需求,如下 #mermaid-svg-YiTzyE1BvQ0ZTgLj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

android editText获取不到数据

问题分析:在onActivityCreated一开始就创建了findViewById,这时获取的是默认值,需要在点击按钮时重新加载才能获取到输入数据。 需要在点击按钮时重新加载数据:

React 中使用高阶函数

React 中使用高阶函数 随着前端技术的快速发展,React 作为一种流行的 JavaScript 库,被广泛应用于 Web 开发中。在 React 中,高阶函数被引入作为一种强大的工具,用于增强组件的复用性和可维护性。本论文将介绍 React 中使用高阶函…

大坝安全监测中需要做好检查监测

大坝安全监测是人们了解大坝运行状态和安全状况的有效手段和方法。它的目的主要是了解大坝安全状况及其发展态势,是一个包括由获取各种环境、水文、结构、安全信息到经过识别、计算、判断等步骤,最终给出一个大坝安全 程度的全过程。 此过程包括&#xf…

初识stm32

1、什么是单片机? 单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处 理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功 能(可能还包括显示驱动电路、…

华为云流水线CodeArts Pipeline怎么样?能实现哪些功能?

华为云流水线服务CodeArts Pipeline,旨在提升编排体验,开放插件平台,并提供标准化的DevOps企业治理模型,将华为公司内的优秀研发实践赋能给伙伴和客户。 灵活编排、高效调度 开放流水线插件 内置企业DevOps研发治理模型 体验通…

【工业机器人】用于轨迹规划和执行器分析的机械手和移动机器人模型(MatlabSimulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C. Strong Password

Problem - C - Codeforces 思路:根据题意我们能够知道就是对于每一位都要再区间范围内,并且不是s的子序列,我们先看第一位,第一位有l[1]-r[1]这几种选择,假如说某一种选择在s中没有那么我们就选择以这个开头的作为答案…

python_股票增加控制人与流通股东等筛选条件

目录 写字前面: 结果展示 获取数据 行业数据 控制人数据 十大流通股东数据 开始合并 1 从行业数据中提取证券股的行业数据 2 合并控制人数据 3 合并十大流通股东 4 把三个结果按列合并 写字前面: 在分析数据的时候,常常需要的字段…

如何实现CAN-SOME/IP通信路由测试

区别于基于UDP的车内通信路由,基于SOME/IP协议的路由增加了服务发现(Service Discovery)和服务发布(Service Publish),那对于测试工程师来说,怎么实现CAN-SOME/IP路由的测试呢? 01 …

爬虫基本原理

一、爬虫的原理 爬虫是什么?把互联网上的数据,抓取下来,存到自己的本地。 以百度为例,爬取一个个的网页,存到自己库中,当我们搜索的时候,去百度的数据库中搜索,显示在前端&#xf…

【K8S系列】深入解析K8S调度

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 Kubernetes (k8s) 是一个容器编…

基于springboot的智慧养老系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

面部识别技术VS其他生物识别技术:哪种更安全、更准确、更可靠?

面部识别技术是一种生物识别技术,通过分析人脸特征,识别和验证个体身份。与其他生物识别技术相比,面部识别技术具有一些独特的优点和局限性。下面将从技术原理、应用场景、准确性、安全性、可用性等方面,对面部识别技术与其他生物…

【云原生】Init 容器

Init 容器 v ljx97609760 一起沟通学习 Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本 理解 Init 容器 每个 Pod 中可以包含多个容器, 应用运行在这些容器里面,…

centos磁盘挂载

通常情况下,云平台开出来的服务器只有默认的系统盘,而数据盘需要运维人员自己挂载在数据目录,此篇记录centos磁盘挂载的过程,以便今后遇到类似情况便于查看。 系统版本:centos7.9 1、查看磁盘情况: [root…

数学建模学习之简单设备分配问题

简单的设备分配问题 某公司新购置了某种设备 6台,欲分配给下属的4 个企业,已知各企业获得这种设备后年创利润如表 1.1 所示,单位为千万元。问应如何分配这些设备能使年创总利润最大,最大利润是多少? 表1.1的数据为: 对…