RPC框架整体架构

简介: RPC就是把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务提供方能正确地还原出语义,最终实现像调用本地一样地调用远程的目的。

RPC就是把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务提供方能正确地还原出语义,最终实现像调用本地一样地调用远程的目的。


1 RPC架构


RPC本质是远程调用,就要通过网络来传输数据。考虑到可靠性,一般默认采用TCP协议。为屏蔽网络传输复杂性,要封装一个单独的数据传输模块收发二进制数据,即传输模块。


用户请求是基于方法调用,方法出入参数都是对象数据,要提前转成二进制,即序列化过程。但只是把方法调用参数的二进制数据传输到服务提供方不够,要在方法调用参数的二进制数据后增加“断句”符,分隔出不同的请求,在两个“断句”符号中间放的内容就是请求的二进制数据,即协议封装。


这两个不同过程目的一样,保证数据在网络中正确传输:


数据能够传输

传输后能正确还原出传输前的语义

可把这两个处理过程放在架构中的同一个模块,统称为协议模块。


还可在协议模块加压缩功能,压缩过程也是对传输的二进制数据进行操作。在实际网络传输过程中,请求数据包在数据链路层可能因太大而被拆分成多个数据包进行传输,为减少被拆分次数,导致整个传输过程时间太长,可在RPC调用时:在方法调用参数或者返回值的二进制数据大于某个阈值的情况下,我们可以通过压缩框架进行无损压缩,然后在另外一端也用同样的压缩算法进行解压,保证数据可还原。


传输和协议两模块是RPC最基础功能,它们使对象可正确传输到服务提供方。但距离RPC目标——实现像调用本地一样调用远程,还缺点。要让这两个模块同时工作,要手写一些黏合代码,但这些代码对使用RPC的研发无意义,且属于一个重复工作,导致使用体验不友好。


要在RPC里把这些细节对研发屏蔽,让他们感觉不到本地调用和远程调用区别。假设有用到Spring,希望RPC能让我们把一个RPC接口定义成一个Spring Bean,并且这个Bean也会统一被Spring Bean Factory管理,可在项目中通过Spring依赖注入到方式引用。这是RPC调用的入口,一般叫Bootstrap模块。


点对点(Point to Point)版本的RPC框架就完成了,一般这种模式的RPC框架为单机版,没有集群能力。


集群能力:针对同一接口有多个服务提供者,但这多个服务提供者对调用方透明,所以在RPC里还要给调用方找到所有的服务提供方,并在RPC里维护好接口跟服务提供者地址的关系,调用方在发起请求时,才能快速找到对应接收地址,即“服务发现”。


但服务发现只解决接口和服务提供方地址映射关系查找,是一种“静态数据”,对RPC来说,每次发送请求时都要用TCP连接的,相对服务提供方IP地址,TCP连接状态瞬息万变,所以RPC框架要有连接管理器去维护TCP连接状态。


有了集群,提供方可能就需要管理好这些服务,RPC就要内置一些服务治理功能,如服务提供方权重的设置、调用授权等一些常规治理手段。而服务调用方需要额外做哪些事?每次调用前,都要根据服务提供方设置的规则,从集群中选择可用的连接,以发送请求。


按分层设计原则,将这些功能模块分为:

112.jpeg



2 可扩展架构


RPC框架怎么支持插件化架构?可将每个功能点抽象成一个接口,将这个接口作为插件契约,然后把这个功能的接口与功能实现分离,并提供接口默认实现。


JDK自带SPI可动态为某接口寻找服务实现,要在Classpath下的META-INF/services目录创建一个以服务接口命名的文件,文件内容就是接口具体实现类。


JDK自带SPI的缺陷

不能按需加载,ServiceLoader加载某接口实现类时,会遍历全部获取,即接口的实现类得全部载入并实例化,造成不必要浪费。


扩展如果依赖其它的扩展,就做不到自动注入和装配,很难和其他框架集成,如扩展里面依赖了一个Spring Bean,原生Java SPI就不支持。


加上插件功能,RPC框架就包含了两大核心体系——核心功能体系与插件体系:


111.jpeg


整个架构就成了一个微内核架构,我们将每个功能点抽象成一个接口,将这个接口作为插件的契约,然后把这个功能的接口与功能的实现分离并提供接口的默认实现。


这样的架构可扩展性好,实现开闭原则,用户方便通过插件扩展实现功能,而且不需要修改核心功能本身


保持了核心包的精简,依赖外部包少,有效减少开发人员引入RPC导致的包版本冲突问题。

3 总结


我们都知道软件开发的过程很复杂,不仅是因为业务需求经常变化,更难的是在开发过程中要保证团队成员的目标统一。我们需要用一种可沟通的话语、可“触摸”的愿景达成目标,我认为这就是软件架构设计的意义。


但仅从功能角度设计出的软件架构并不够健壮,系统不仅要能正确地运行,还要以最低的成本进行可持续的维护,因此我们十分有必要关注系统的可扩展性。只有这样,才能满足业务变化的需求,让系统的生命力不断延伸。


4 FAQ


我是个小测试。使用jmeter进行压力测试。jmeter官网中支持进行定制sampler取样器,写好的jar包放在lib\ext下,再启动jmter时就能看到了。插件化是一个概念,有很多种实现方式,这种也算。


spring的spring.factories这一套也是利用的面向接口编程,感觉比jdk自带的spi也好很多,既然有些问题,那为啥jdk的spi不优化一下?jdk我理解更多是标准。


jdk自带spi一般会有一个接口加载很多实现类的情况吗,因为只能用迭代器遍历,导致只能用类型判断才能找到自己想要的类,这样感觉不够优雅吧,所以我感觉应该都是一个接口配置一个实现类这样就是使用者想要的情况了。那样插件的意义就不存在了!


业务为工业设备联网数据采集,设备种类和型号繁多,产品中通过抽象出一套“驱动”的概念,把每类设备当作一个插件开发,整体产品架构不变,感觉有点这个概念。只是产品还不够大,其他插件体系还不够明确。

目录
相关文章
|
27天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
11天前
|
存储 分布式计算 关系型数据库
架构/技术框架调研
本文介绍了微服务间事务处理、调用、大数据处理、分库分表、大文本存储及数据缓存的最优解决方案。重点讨论了Seata、Dubbo、Hadoop生态系统、MyCat、ShardingSphere、对象存储服务和Redis等技术,提供了详细的原理、应用场景和优缺点分析。
|
1月前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
1月前
|
存储 分布式计算 API
大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构
大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构
85 0
|
17天前
|
监控
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
通过引入稀疏化和角色多样性,SMoA为大语言模型多代理系统的发展开辟了新的方向。
29 6
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
|
24天前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
1月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
53 3
|
2月前
|
机器学习/深度学习
ACM MM24:复旦提出首个基于扩散模型的视频非限制性对抗攻击框架,主流CNN和ViT架构都防不住它
【9月更文挑战第23天】复旦大学研究团队提出了ReToMe-VA,一种基于扩散模型的视频非限制性对抗攻击框架,通过时间步长对抗性潜在优化(TALO)与递归令牌合并(ReToMe)策略,实现了高转移性且难以察觉的对抗性视频生成。TALO优化去噪步骤扰动,提升空间难以察觉性及计算效率;ReToMe则确保时间一致性,增强帧间交互。实验表明,ReToMe-VA在攻击转移性上超越现有方法,但面临计算成本高、实时应用受限及隐私安全等挑战。[论文链接](http://arxiv.org/abs/2408.05479)
75 3
|
2月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
75 5
|
1月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
49 0
下一篇
无影云桌面