设计一个灵活的RPC架构

RPC架构

RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模块可以叫做传输模块

网络数据传输是二进制数据,涉及对象的序列化与反序列化。数据拆分协议封装。

网络传输过程中,请求数据包在数据链路层可能会因为太大而被拆分成多个数据包进行传输,为了减少被拆分的次数,从而导致整个传输时间太长,在方法调用参数或者返回值的二进制数据大于某个阈值时,可以通过压缩框架进行无损压缩,然后在另外一端用同样的压缩算法进行解压,保证数据可还原。

当一个接口有着多个服务提供者时,服务对调用方是透明的。RPC需要提供“服务发现”机制,在RPC里面维护好接口跟服务提供者地址的关系,调用方可以快速找到调用地址。

对RPC来说,每次发送请求时都需要用TCP连接,相对服务提供方IP地址,TCP连接状态是瞬息万变的,因此RPC框架里面要有连接管理器维护TCP连接的状态

有了集群之后,提供方需要管理好这些服务。RPC就需要内置一些服务治理的功能,比如服务提供方权重的设置、调用授权等一些常规治理手段。

image-20241030222942238

可扩展架构

RPC框架设计之初不可能面面俱到,如何应对技术迭代呢?

插件化架构

RPC框架中,将每个功能点抽象成一个接口,接口作为插件的契约,功能的接口与功能的实现分离,并提供接口的默认实现。

JDK自带的SPI(Service Provider Interface)服务发现机制,可以动态地为某个接口寻找服务实现。使用SPI机制需要在Classpath下的META-INF/services目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体实现类。如下,文件名和内容都是接口和实现类全包名。

image-20240417220139791

然而,JDK自带的SPI机制使用比较少,不能按需加载,ServiceLoader加载某个接口实现类的时候,会遍历全部获取,接口的实现类全部载入并实例化一遍,会造成不必要的浪费,扩展性比较差。

image-20241030224418544

功能点抽象成一个接口,将接口作为插件的契约,功能的接口与功能的实现分离并提供接口的默认实现。可扩展性很好,用户可以方便地通过插件扩展实现自己的功能。无需修改核心功能本身;保持了核心包的精简,依赖外部包少。

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

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

相关文章

网络安全入门学习路线 怎样科学的进行网络安全学习

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日,“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办,此次活动以“做强数字金融 服务实体经济”为主题,由中信金控指导,中信银行主办,中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

‌Linux tac命令‌

‌Linux tac命令‌是一个用于逆序显示文件内容的工具,其名称来源于“cat”的反向拼写。tac命令的基本功能是将文件的内容从最后一行开始输出,直到第一行结束,这与cat命令的功能相反,cat命令是从第一行开始输出直到最后一行。 tac…

vite乾坤 vite-plugin-qiankun 报错 ReferenceError: ReadableStream is not defined

今天新接入一个子应用,发现其他子项目都可以运行,改造代码都差不多。我新的项目却报错 ReferenceError: ReadableStream is not defined断点发现是有个库版本不对,上github搜到了问题。 https://github.com/tengmaoqing/vite-plugin-qiankun…

ELK之路第四步——整合!打通任督二脉

ELK之路第四步——整合!打通任督二脉 前言1.架构2.下载资源3.整合开始1.分别启动三个es2.启动kibana3.新建filebeat_logstash.yml配置文件4.修改logstash的启动配置文件5.启动logstash6.启动filebeat7.Kibana查看 4.结语 前言 在开始本篇之前,你需要用到…

[JAVAEE] 多线程的案例(四) - 定时器

目录 一. 什么是定时器? 二. java中的定时器类 三. 定时器的简单使用. 四. 模拟实现定时器 4.1 实现 MyTimerTask 4.2 实现 MyTimer 一. 什么是定时器? 定时器相当于闹钟, 时间到了就执行一些逻辑. 二. java中的定时器类 使用Timer类实例化一个定时器对象. Timer类中的…

C++调试经验:Ubuntu下Qt工程链接常见库的方式(持续更新)

目录 1. Qt工程链接OpenCV库 2. Qt工程链接tinyxml库 3. Qt工程链接pugixml库 4. Qt工程链接geographiclib地理信息转换库 5. Qt工程链接gstreamer音视频流媒体处理库 6. Qt工程链接VTK三维可视化库 7. Qt工程链接PCL点云处理库 8. Qt工程链接json-cpp库 9. Qt工程链…

Vue学习笔记(十一)

一. Promise 1. 异步 异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺…

江协科技STM32学习- P21 ADC模数转换器

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

OpenAI放弃自制AI芯片!伦敦场开发者日Hugging Face工程师现场“拷问”Sam Altman

OpenAI 2024年开发者大会第二场(伦敦场)刚结束。 10月初在旧金山举办了第一场 OpenAI 开发者大会,但这次没有像上一场放出很多花活,这次开始走剧透局了! 现场的OpenAI 产品主管 曝光了 GPT o1即将更新的功能&#xf…

浅谈网络安全

​ 大家好,我是程序员小羊! 前言: 网络安全是确保信息系统、网络及数据免受未授权访问、使用、披露、篡改或破坏的重要领域。随着数字化进程的加速和互联网的普及,网络安全的重要性显著提升。今天,网络威胁呈现出多样化…

在面试了些外包以后,我有了些自己的思考

大家好,我是洋子,最近公司在降本增效,需要把外包从北京迁移到陕西的某新一线城市,其实就是变相裁员,减少外包的成本,裁掉现有的员工,重新招聘新人 在整个测试行业,外包测试的比重是…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码,请用go语言。 文心一言: 在图论中,最短路径树(Shortest Path Tree, SPT)是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行👺code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)😊使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…

iQOO手机怎样将屏幕投射到MacBook?可以同步音频吗?

众所周知,苹果品牌的设备自己有AirPlay的投屏功能,iPhone要投屏到MacBook只要连接同一网络,然后开启AirPlay就可以投屏。但其他品牌的手机没有AirPlay,怎么将手机屏幕投射到MacBook呢? 安卓系统的手机可以使用无线投屏…

机器人和智能的进化速度远超预期-ROS-AI-

危机 通常,有危险也有机遇才称之为危机。 从2020年启动转型自救,到2021年发现危险迫在眉睫,直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断,在如今得到了验证。 机器人…

Idea、VS Code 如何安装Fitten Code插件使用

博主主页:【南鸢1.0】 本文专栏:JAVA 目录 ​编辑 简介 所用工具 1、Idea如何安装插件 1.idea下载插件 2.需要从外部下载然后在安装, 2、VS Code如何安装插件 总结 简介 Fitten Code是由非十大模型驱动的AI编程助手,它可以自动生成代…

【Matlab】基础操作汇总

一、函数 1、定积分/不定积分函数:int int(f,[r,[x0,[x1]]]) f:所要积分的表达式; r:积分变量 若为定积分,则x0与x1为积分上下限。 2、求解非刚性微分方程:ode45 [t,y…

Mysql如何保证数据不会丢失,两阶段提交,redo log ,bin log的介绍

一、缓冲池 首先,关系型数据库是基于磁盘的,而非关系型数据库是基于内存的。 mysql就是一个基于磁盘的数据库,那么是如何减少mysql的i/o次数,提高mysql的性能呢。在mysql中是有一个缓冲池的,mysql每次查询时是按页进行…