【架构-29】RPC

news/2024/9/17 7:10:55/ 标签: 架构, rpc, 网络协议

RPC(Remote Procedure Call,远程过程调用)框架是一种用于实现分布式系统中不同节点之间通信和调用的技术框架。

一、为什么需要 RPC?

  1. 实现分布式系统
  • 在现代的软件应用中,尤其是大规模的企业级应用和互联网服务,往往需要构建分布式系统来满足高并发、高可用和可扩展性的要求。RPC 使得不同的服务模块可以部署在不同的服务器上,通过网络进行通信和协作,从而实现分布式系统的架构
  • 例如,一个电商平台可能由商品服务、订单服务、用户服务等多个模块组成,这些模块分别部署在不同的服务器上。通过 RPC,各个服务可以相互调用对方提供的功能,共同完成复杂的业务流程。
  1. 提高系统性能和可扩展性
  • 将系统拆分为多个独立的服务模块,并通过 RPC 进行通信,可以实现更好的性能优化和可扩展性。不同的服务可以根据其自身的负载情况进行独立的扩展和优化,而不会影响其他服务。
  • 比如,当商品服务的访问量增加时,可以单独为商品服务增加服务器资源,而不会影响到订单服务和用户服务。同时,通过并行处理和分布式计算,可以提高系统的整体性能。
  1. 跨语言通信
  • RPC 框架通常支持多种编程语言,这使得不同语言编写的服务可以进行通信和集成。在实际的软件开发中,可能会使用不同的编程语言来实现不同的模块,RPC 提供了一种跨语言的解决方案,方便不同团队和技术栈之间的协作。
  • 例如,一个公司的前端团队使用 JavaScript,后端服务使用 Java 和 Python,通过 RPC 可以实现不同语言之间的无缝通信。
  1. 简化开发和维护
  • RPC 框架提供了一种标准化的通信方式,使得开发者可以专注于业务逻辑的实现,而无需关心底层的网络通信细节。RPC 框架通常提供了丰富的功能和工具,如负载均衡、服务发现、错误处理等,简化了分布式系统的开发和维护难度。
  • 开发者只需要定义好服务的接口和方法,然后使用 RPC 框架提供的工具进行调用和部署,大大提高了开发效率。

二、假如没有 RPC, 会发生什么?

  1. 开发难度增加
  • 如果没有 RPC,开发者需要自己实现底层的网络通信、序列化和反序列化等功能。这需要对网络编程、数据格式等有深入的了解,增加了开发的难度和复杂性。
  • 例如,开发者需要手动处理 TCP/IP 连接、编写数据传输协议、处理不同数据类型的序列化和反序列化等问题,这将耗费大量的时间和精力。
  1. 系统集成困难
  • 在没有 RPC 的情况下,不同的服务模块之间的通信和集成将变得非常困难。不同的语言和技术栈之间可能无法直接通信,需要进行大量的定制化开发和适配工作。
  • 例如,一个用 C++ 编写的服务和一个用 Python 编写的服务之间的通信将非常复杂,可能需要开发专门的通信接口和数据转换工具。
  1. 性能和可扩展性受限
  • 没有 RPC 框架提供的负载均衡、服务发现等功能,系统的性能和可扩展性将受到很大的限制。开发者需要手动实现这些功能,而且很难做到高效和可靠。
  • 例如,当某个服务的负载过高时,无法自动进行负载均衡,可能导致系统性能下降甚至崩溃。同时,扩展服务也将变得非常困难,需要手动调整网络配置和部署架构
  1. 维护成本高
  • 没有 RPC 框架的标准化和工具支持,系统的维护成本将大大增加。开发者需要自己处理各种通信问题和错误情况,而且很难进行统一的管理和监控。
  • 例如,当出现网络故障或服务故障时,开发者需要手动排查问题,没有统一的错误处理机制和监控工具,增加了维护的难度和成本。

三、工作原理

  1. 客户端发起调用
  • 在分布式系统中,客户端想要调用远程服务器上的某个方法或函数。客户端通过 RPC 框架提供的接口,指定要调用的方法名称、参数等信息。
  • 例如,一个电商系统中,客户端(如网页前端)需要查询商品库存信息,而库存数据存储在远程的数据库服务器上。客户端通过 RPC 调用向库存服务所在的服务器发起请求。
  1. 序列化与传输
  • RPC 框架将客户端的调用请求进行序列化,把方法名称、参数等信息转换为可以在网络上传输的字节流。常见的序列化方式有 JSON、Protobuf 等。
  • 序列化后的请求通过网络传输发送到远程服务器。可以使用 TCP、HTTP 等网络协议进行传输。
  1. 服务器端接收与处理
  • 远程服务器接收到客户端的请求后,RPC 框架对请求进行反序列化,将字节流转换回方法名称、参数等信息。
  • 服务器根据方法名称找到对应的实际方法,并传入参数执行该方法。例如,库存服务接收到查询库存的请求后,执行相应的数据库查询操作。
  1. 结果返回
  • 服务器执行完方法后,将结果进行序列化,并通过网络传输返回给客户端。
  • 客户端的 RPC 框架接收到结果后进行反序列化,将结果提供给客户端程序使用。

四、主要特点

  1. 透明性
  • 对于开发者来说,使用 RPC 框架进行远程调用就像调用本地方法一样简单。开发者不需要关心底层的网络通信细节、序列化和反序列化等操作,RPC 框架将这些复杂的过程隐藏起来,提供了一种透明的远程调用体验。
  1. 高效性
  • RPC 框架通常采用高效的序列化和网络通信技术,以减少数据传输量和通信延迟。例如,使用二进制序列化方式可以比文本序列化方式更节省空间和提高传输速度。
  • 一些 RPC 框架还支持连接池、异步调用等特性,进一步提高系统的性能和响应速度。
  1. 语言独立性
  • 不同的编程语言可以通过 RPC 框架进行通信和调用。只要各个节点都实现了相应的 RPC 协议,就可以实现跨语言的远程过程调用。例如,一个用 Java 编写的服务可以被用 Python 编写的客户端调用。
  1. 可扩展性
  • RPC 框架可以方便地扩展和集成到不同的分布式系统中。可以根据系统的需求添加新的服务节点、调整负载均衡策略等。

五、常见的 RPC 框架

  1. Dubbo
    由阿里巴巴开源的 Java 语言 RPC 框架。提供了高性能、透明化的远程服务调用方案,支持多种服务治理功能,如负载均衡、服务降级、服务监控等。
  2. gRPC
    由 Google 开发的跨语言 RPC 框架。基于 Protocol Buffers 进行序列化,支持多种编程语言,具有高效、可靠的特点。
  3. Thrift
    由 Facebook 开源的跨语言 RPC 框架。支持多种编程语言,提供了丰富的数据类型和服务定义方式。

http://www.ppmy.cn/news/1522012.html

相关文章

设计模式学习-简单的命令模式例子

上一章节介绍过了命令模式,这一篇文章就简单的做一个小案例来巩固学习 搭建场景 简单的搭建一个场景就行 ,随便准备一个物体放在场景中位置Reset一下即可。 代码编写 定义接口(或者抽象类)ICommand 用来规范Command的行为。注意…

Spring及Springboot事件机制详解

程序设计的所有原则和方法论都是追求一件事——简单——功能简单、依赖简单、修改简单、理解简单。因为只有简单才好用,简单才好维护。因此,不应该以评论艺术品的眼光来评价程序设计是否优秀,程序设计的艺术不在于有多复杂多深沉,…

idea配置svn发现安装的svn中的bin目录下没有svn.exe文件

问题描述 使用idea配置svn时,发现安装的svn没有svn.exe文件 解决方法 1、双击svn安装包,找到【modify】 2、默认安装时,没有安装command line client tools,里面是有svn.exe 3、选择will be installed on local hard drive 4、…

x264 编码器 AArch64汇编系列:deblock 去块滤波相关汇编函数

deblock 在x264_deblock_init函数中定义各种 deblock 实现的方法: 以亮度分量垂直方向滤波为例 c 语言实现亮度分量垂直滤波函数:deblock_v_luma_cstatic ALWAYS_INLINE void deblock_edge_luma_c( pixel *pix, intptr_t xstride, int alpha

【个人笔记】VCS工具与命令

Title:VCS工具学习 一 介绍 是什么? VCS (Verilog Compiler Simulator) 是synopsys的verilog 仿真软件,竞品有Mentor公司的Modelsim、Cadence公司的NC-Verilog、Verilog—XL. VCS能够 分析、编译 HDL的design code,同时内置了 仿…

笔记本电脑在跑模型或日常使用中突然白屏的解决办法

文章目录 前言解决方案总结 前言 这段时间我注意到在跑模型或是加载一些大文件的时候,电脑经常会突然白屏,这种问题在日常生活中也时常发生,下面会提供快速有效的解决方法,希望能对大家有所帮助。 解决方案 按快捷键 C t r l A…

WPF MVVM如何在ViewModel直接操作控件对象

早些年在WPF中使用COM组件时,需要在ViewModel中操作COM组件中的控件对象,但是这个控件对象又不支持绑定, 后面的解决办法是在窗口加载时,将控件对象以参数传递到Loaded事件的处理命令中,然后将这个对象记录下来&#…

51单片机-第十二节-LCD1602液晶显示屏

一、LCD1602介绍: LCD1602是一种字符型液晶显示屏,可以显示ASCII码的标准字符和其他的内置特殊字符。 显示容量:16*2个字符,每个字符为5*7点阵。 二、引脚及应用电路: 其中:D0-7这8位数据是接在P0引脚上…

vim 快捷命令

在 Vim 中,进入末行模式的方法如下: 1. 按下 Esc 键,进入命令模式。 2. 输入 :,进入末行模式。 在末行模式下,你可以输入 Vim 命令,例如 q 强制退出 Vim,w 保存文件,r 读取文件等。…

数字人模型像素流送实时渲染网页手机平板用语音交互

随着AI的出圈,数字人结合大语言模型也迎来了春天,市场上涌现了越来越多的数字人服务,深耕于不同的实际使用场景。点量小芹在和一些数字人厂家交流的过程中发现,很多厂家对于数字人如何更好地在网页、手机平板等移动端使用&#xf…

Java中优先队列API

Java中的优先队列(PriorityQueue)是一个基于堆实现的无界队列,优先队列中的元素按照自然顺序或者通过提供的比较器排序。 1. 构造方法 PriorityQueue(): 创建一个默认初始容量为11的空优先队列,并根据其元素的自然顺序对其进行排…

HTML 列表

列表是网页中最常用的一种数据排列方式 在HTML中,列表共分为三种:有序列表、无序列表和定义列表。在有序列表中,列表项之间有先后顺序之分。在无序列表中,列表项之间是没有先后顺序之分的。而定义列表是一组带有特殊含义的列表&a…

PMP--谋定而后动

文章目录 技巧一模二模三模9.资源管理--问题解决--谋定而后动14.敏捷–人员–教练/项目经理–仆人式领导–职责–核心工作–消除障碍;–作用–促进合作(题干关键词 “促进合作、清除障碍、指导团队”。):148、 [单选] 在评估当前冲…

Apache Tomcat 6.0.45 下载、安装和配置教程

文章目录 序言下载安装配置 序言 安装前配置好jdk环境。 下载 百度网盘: 链接:https://pan.baidu.com/s/1ZWyKoNe0K7S748BntE48mw 提取码:6666 安装 1,双击图标,启动程序 2,单击“Next”按钮 3&…

集成电路学习:什么是RTC实时时钟

一、RTC:实时时钟 RTC,即实时时钟(Real-Time Clock),是一种能够在设备中持续运行并准确记录时间的电子组件。它广泛应用于计算机、手机、嵌入式系统、智能家居设备等多种场合,为这些设备提供精确的时间基准…

个股场外期权的行权时间是什么时候?

今天带你了解个股场外期权的行权时间是什么时候?场外个股期权的行权日并没有一个固定的日期,它主要取决于期权合约的具体条款和规定。 个股场外期权 个股场外期权是指在场外交易市场进行的、以单个股票为标的资产的期权合约。这种期权与在交易所交易的…

2024数学建模国赛高教社杯C题:农作物的种植策略 思路代码文章助攻手把手保姆级

发布于18:25有问题后续会修正!! 背景信息 问题分析基于你提供的资料——2024年全国大学生数学建模竞赛C题,其核心内容为优化一个乡村的农作物种植策略。 背景分析 该乡村位于华北山区,气候较冷,土地资源有限,存在四种地块类型&a…

LeetCode560. 和为 K 的子数组(2024秋季每日一题 12)

给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你统计并返回 该数组中和为 k k k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入&…

110001安庆巡检_工艺巡检

安庆巡检_工艺巡检 一. 工艺配置二. 点检计划三. 点检任务四. 复检任务1. 复检列表1.1 页面展示 2. 复检任务下发2.1 操作说明2.2 业务说明2.3 表关联说明ps_recheck_task工艺工序参数_复检详情表 3. 复检详情2.1 获取参数点检详情2.2 获取复检详情列表 4. app端复检任务提交4.…

FastAPI 中间件与依赖注入:打造灵活的 API 架构

在 FastAPI 中,Depends 是一个非常重要的概念,它用于依赖注入。依赖注入是一种设计模式,允许你将组件(如函数、类或服务)之间的依赖关系明确地表达出来,而不是硬编码在组件内部。这使得代码更加模块化、可测…