【Apache ShenYu源码】如何实现负载均衡模块设计

在这里插入图片描述

ShenYu是一个异步的,高性能的,跨语言的,响应式的 API 网关。有关ShenYu的介绍可以戳这。

一、前瞻

今天我们尝试不同的代码阅读方式,按模块来去阅读源码,看看效果如何。
在这里插入图片描述

本次阅读锁定在shenyu-loadbalancer,根据模块名可以了解这个模块主要作用就是负载均衡

我们可以根据这个模块的组织机构,来思考本次的阅读线索

  1. 整个模块为ShenYu提供了什么功能
  2. 我们很好奇,负载均衡的cache缓存有什么作用
  3. spi的作用是什么

二、探索

那开始我们今天的模块阅读。

看起来factory就是这个模块的核心了,作为工厂来生产核心对象,我们就从这个工厂开始阅读。

public final class LoadBalancerFactory {private LoadBalancerFactory() {}/*** Selector upstream.** @param upstreamList the upstream list* @param algorithm    the loadBalance algorithm* @param ip           the ip* @return the upstream*/public static Upstream selector(final List<Upstream> upstreamList, final String algorithm, final String ip) {LoadBalancer loadBalance = ExtensionLoader.getExtensionLoader(LoadBalancer.class).getJoin(algorithm);return loadBalance.select(upstreamList, ip);}
}

很明显LoadBalancerFactory是作为外部的调用中心,那LoadBalancerFactory又是调用了内部的什么模块去返回?我们接着往下看。

@SPI
public interface LoadBalancer {/*** this is select one for upstream list.** @param upstreamList upstream list* @param ip ip* @return upstream*/Upstream select(List<Upstream> upstreamList, String ip);
}

可以看到通过select方法进行调用内部方法。

我们可以看下这个接口类的类图,看下调用的最终实现者是什么对象。

在这里插入图片描述

类图很清晰地告诉我们,最终实现者共有6个子类对象,也就是说每个子类对象都是不同的负载均衡算法实现

大家有没看到类图最上面的底层接口SPI,和模块里的spi文件夹是相对应的,spi的作用就是存储各种负载均衡算法的实现。那我们就解决了我们的阅读线索3。

spi的作用是什么

我们继续探索,看看阅读线索2的答案:

负载均衡的cache缓存有什么作用

在这里插入图片描述

查询代码发现缓存对象是UPSTREAM_MAP,但很奇怪这个核心的缓存对象只有删除、设置的引用,却没有使用的逻辑。

通过Git的历史查询,发现这个缓存对象被废弃了,最新版本的核心缓存对象应该是下面这两个

    private final Map<String, List<Upstream>> healthyUpstream = Maps.newConcurrentMap();private final Map<String, List<Upstream>> unhealthyUpstream = Maps.newConcurrentMap();

找到了核心缓存对象,我们就来看看这个cache对象的作用究竟是什么。

我们看看调用缓存的对应方法。

在这里插入图片描述

Upstream流从shenyu-loadbalancer取出,需要负载均衡时把该缓存传入。也就是说这个模块的cache充当了存储所有Upstream流的作用。

到这我们就解决了阅读线索2的问题了。

三、总结

而阅读线索3也显而易见:整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。

public final class LoadBalancerFactory {private LoadBalancerFactory() {}/*** Selector upstream.** @param upstreamList the upstream list* @param algorithm    the loadBalance algorithm* @param ip           the ip* @return the upstream*/public static Upstream selector(final List<Upstream> upstreamList, final String algorithm, final String ip) {LoadBalancer loadBalance = ExtensionLoader.getExtensionLoader(LoadBalancer.class).getJoin(algorithm);return loadBalance.select(upstreamList, ip);}
}

核心方法很清晰,我们传入Upsteam列表,通过这个模块的负载均衡算法,负载均衡地返回其中一个对象。

这也就是这个模块提供的功能。

未完待续。。。

好了,今天的分享就到这🤔。大家能否感受到通过按模块这种方式来阅读源码的乐趣呢

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

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

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

相关文章

比较基因组——还是看我的教程吧!

一、运行orthofinder 首先 orthofinder使用的版本为2.5.* 不要使用2.2的&#xff0c;2.2默认比对是blast&#xff0c;速度非常慢&#xff0c;结果文件呈现形式也不让人满意。2.5默认用的diamond 速度非常快 第一步代码&#xff1a; nohup orthofinder -t 40 -f data/ & # …

android 的 hal-jni

目标是写一个APP调用HAL的一个函数,在AOSP源码环境下进行开发,大概流程是: APP---->Framework service---->native----->HAL 1.什么是HAL HAL全称Hardware Abstract Layer,硬件抽象层,它向下屏蔽了硬件的实现细节,向上提供了抽象接口,HAL是底层硬件和上层框架…

【网页实战项目设计】基于SSM的医院预约挂号系统

基于SSM的医院预约挂号系统 项目截图 开发环境与技术框架 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&a…

实战whisper第二天:直播语音转字幕(全部代码和详细部署步骤)

直播语音实时转字幕&#xff1a; 基于Whisper的实时直播语音转录或翻译是一项使用OpenAI的Whisper模型实现的技术&#xff0c;它能够实时将直播中的语音内容转录成文本&#xff0c;甚至翻译成另一种语言。这一过程大致分为三个步骤&#xff1a;捕获直播音频流、语音识别&#x…

面试算法-70-合并 K 个升序链表

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下…

深入了解RSA算法:公钥密码学的基石

RSA算法是一种非对称加密算法&#xff0c;由Ron Rivest、Adi Shamir和Leonard Adleman于1978年提出。它基于大数分解的困难性&#xff0c;使用一对公钥和私钥进行加密和解密。本文将详细介绍RSA算法的原理、实现以及应用场景。 一、RSA算法原理 大数分解问题 RSA算法的基础是…

在线教育话术(1W字精选)

产品结构图 Nginx实现代理 问&#xff1a;我们在本机的host文件中配置了域名映射&#xff0c;都是同一个服务器。我们只需要输入对应的域名就可以到对应的界面&#xff0c;这是怎么实现的&#xff1f; 答&#xff1a;主要就是通过Nginx反向代理来实现的&#xff0c;Nginx会先…

低代码开发与物联网应用:重塑未来技术生态

随着科技的飞速发展&#xff0c;物联网(IoT)正逐渐成为我们日常生活的重要组成部分。在这个大背景下&#xff0c;低代码开发平台的出现为物联网应用的开发带来了革命性的变化。本文旨在探讨低代码开发与物联网应用之间的关系&#xff0c;分析低代码开发如何推动物联网应用的快速…

Java学习笔记之Java基础语法02-运算符

1.运算符和表达式 1.1 运算符&#xff1a; 定义&#xff1a;就是对常量&#xff08;字面量&#xff09;或者变量进行操作的符号。 比如&#xff1a; - * / 1.2 表达式&#xff1a; 定义&#xff1a;用运算符把常量或者变量连接起来的&#xff0c;符合Java语法的式子就是表达…

2024-03-20 作业

作业要求&#xff1a; 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#x…

电影aac是什么意思?如何播放、转换、编辑aac?

"电影AAC"这个术语可能是指电影中的音频编码格式。AAC&#xff08;Advanced Audio Coding&#xff09;是一种常见的音频编码格式&#xff0c;通常用于压缩音频文件&#xff0c;以在保持高质量的同时减小文件大小。在电影中&#xff0c;AAC格式的音频通常用于提供高质…

Java学习笔记NO.25

T2.编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。要求&#xff1a; (1)定义乐器类Instrument&#xff0c;包括方法makeSound() (2)定义乐器类的子类&#xff1a;二胡Erhu、钢琴Piano和小提琴Violin (3)定义乐手类…

H12-811题库(带解析,亲测高分可以通过)

大家可以直接点赞关注后&#xff0c;加作者微信&#xff08;备注“CSDN”&#xff09;就可以获取&#xff0c;微信在文章最后&#xff01; 808、[单选题]某公司网管要进行网络规划的时候&#xff0c;能够要让PC1访问PC2的数据包从G0/0/0口走(图上G0/0/2)。PC2访问PC1的数据包从…

抗辐射相机行业深度分析及投资机会探讨

一、市场趋势 抗辐射相机作为特种设备&#xff0c;主要用于军事侦察、核工业检测、太空探索等高辐射环境下的成像需求。随着全球核能和太空探索活动的增加&#xff0c;对高性能抗辐射相机的需求呈现上升趋势。此外&#xff0c;国家安全防护级别的提升也为该行业带来了新的增长…

浅谈RPC的理解

浅谈RPC的理解 前言RPC体系Dubbo架构最后 前言 本文中部分知识涉及Dubbo&#xff0c;需要对Dubbo有一定的理解&#xff0c;且对源码有一定了解 如果不了解&#xff0c;可以参考学习我之前的文章&#xff1a; 浅谈Spring整合Dubbo源码&#xff08;Service和Reference注解部分&am…

网络世界的城关——网卡

网络世界的城关——网卡 网卡到底是什么&#xff1f;网卡的功能网卡的真面目网卡的组成网卡的种类1.基于网络连接方式分类2.基于总线接口类型分类3.基于接口类型的分类4.基于传输速度的分类5.基于应用领域的分类 网卡到底是什么&#xff1f; 网卡我们可以这样通俗地理解&#x…

vue 若依 新开tab 不关闭旧的tab

注意 这里不是新开窗口&#xff08;_blank不符合我的需求&#xff09;&#xff0c;是新开一个tab若依对于统一组件打开的tab只能存在一个&#xff0c;因为路径相同 思路 路径不一致不就行了&#xff0c;动态生成的法子肯定是用不了了在router.js中配置路径&#xff1a;路径后面…

游戏平台出海运营有难度吗?

随着全球互联网的飞速发展&#xff0c;游戏产业已经成为了文化娱乐领域的重要支柱。在这个背景下&#xff0c;越来越多的游戏平台开始寻求出海运营&#xff0c;以拓展海外市场&#xff0c;实现更大的商业价值。然而&#xff0c;游戏平台出海运营并非易事&#xff0c;其中涉及到…

‍Java OCR技术全面解析:六大解决方案比较

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

个人可以做知识付费网站吗

个人可以做知识付费网站吗 个人能够做学问付费网站吗&#xff1f;答案是肯定的&#xff01;如今个人做学问付费网站并不需求太多的资金和技术支持&#xff0c;我们只需求购置一台效劳器或虚拟主机&#xff0c;然后在该主机空间上搭建一个WordPress网站&#xff0c;最后运用带有…