什么是RPC框架?

news2024/11/14 13:41:06

什么是RPC?

In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system.

RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。RPC调用的是一个远端对象,调用者和被调用者是处于不同的地址空间,要想完成调用,必须实现以下几个能力:

服务发现
由于调用的是远端对象,因此需要可以定位到调用的服务器地址以及调用的具体方法的进程,一般可以通过注册中心或者哈希查找来实现,将被调的接口注册到某个地方,比如使用CallerId和函数名作为映射,调用者通过CallerId进行调用,服务端收到调用请求后,通过CallerId查找到对应函数,再执行后续处理流程。

序列化和反序列化
调用者和被调用者处于不同的机器上,因此函数参数及其他一些Context信息需要经过网络传输才能到达服务端,网络传输的是二进制数据,因此RPC需要支持将函数参数(如基本类型int、long、map以及自定义类型等)可以序列化为网络可以传输的二进制数据,同时,也需要支持将二进制数据反序列化为程序可以处理的数据类型,是序列化的逆过程。

网络传输
网络传输协议和RPC本身没有关系,一般使用TCP进行网络传输,通过HTTP或者UDP也是可以完成RPC所需要的功能的。

如上,如果某个服务框架实现了上述这些功能,就是一个RPC框架,通过此框架便可以像调用本地方法一样来调用远端方法。

为什么使用RPC?

如果是一个功能比较简单的应用,可以将所有功能实现在一个服务中或者实现在多个服务中,但是部署在一个机器上,如此,接口间调用要么在同一进程内或者是本地进程间通信。随着业务的发展,服务功能持续迭代,单体应用出现性能瓶颈,因此需要考虑对服务进行拆分,根据业务功能划分为不同的模块,不同的模块部署到不同集群上,模块间进行通信完成功能。如将服务的管理域和执行域进行拆分,不仅是服务架构更合理清晰,也方便根据不同的模块划分不同的资源,保证服务的整体性能。

一个服务拆分为不同的模块,或者单体应用拆分为多个微服务时,此时便需要RPC出场了,不同模块及不同服务间都需要RPC才能完成通信。可以说RPC是分布式系统架构或者微服务架构必不可少的实现手段。

RPC原理

理清了RPC的基本概念之后,简单阐述下RPC框架的实现原理。首先看一张RPC调用的全貌图:

RPC调用

当客户端发起一次远程调用时:

  1. client以本地方式方式调用远程方法;
  2. client stub收到调用后负责将方法以及参数等组装成网络可以传输的消息体;
  3. client stub找到服务端地址,通过系统调用,将数据传输服务端;
  4. server stub收到消息后进行反序列化;
  5. server stub通过得到的参数调用本地方法;
  6. 执行结果返回给server stub;
  7. server stub将执行结果进行序列化;
  8. server stub进行系统调用将数据发送给客户端;
  9. client stub收到消息并进行解码;
  10. cleint stub将结果返回给调用者。

RPC框架所要实现的便是将序列化、反序列化以及网络传输等流程进行封装,这些流程对于调用者来说是透明的,调用者并不需要了解这些细节以及调用流程。

常用的RPC框架有哪些?

Thrift

Thrift是一个轻量级、跨语言的RPC框架,主要用于各个服务之间的RPC通信,最初由Facebook于2007年开发,2008年进入Apache开源项目。它通过自身的IDL中间语言,并借助代码生成引擎生成各种主流语言的RPC服务端和客户端模板代码。Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby、Erlag、Haskell、C#、Cocoa、JavaScript、Nodejs、Smalltalk、OCaml和Golang等。

gRPC

gRPC是一个高性能、通用的开源RPC框架,其由Google2015年主要面向移动应用开发并基于HTTP/2标准协议而设计,基于ProtoBuf序列化协议开发,且支持众多语言开发。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链式功能,从而有助于节省带宽、降低TCP连接次数、节省CPU使用、电池寿命。

支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言

Dubbo

Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用,目前Dubbo已经交给Apache基金会维护。

gRPC VS Thrift

grpc-thrift-1

grpc-thrift-2

什么时候应该选择gRPC而不是Thrift

  • 需要良好的文档、示例
  • 喜欢、习惯HTTP/2、ProtoBuf
  • 对网络传输带宽敏感

什么时候应该选择Thrift而不是gRPC

  • 需要在非常多的语言间进行数据交换
  • 对CPU敏感
  • 协议层、传输层有多种控制要求
  • 需要稳定的版本
  • 不需要良好的文档和示例

参考文档

谁能用通俗的语言解释一下什么是 RPC 框架?
RPC框架:从原理到选型,一文带你搞懂RPC
gRPC vs Thrift

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

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

相关文章

创新能力 | 产品经理实践中常犯的七大错误

做产品是一个既感性又理性的过程,纵然有很多前辈同行的经验传承和技巧指导,但在落到实处是时,总难免犯一些错误。有些是经验不足导致,有些则是产品经理对于人性的浅见寡闻。本文作为产品经理实践指南专题的中级篇,阐述…

用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (2)-走马灯

AWPLC 目前还处于开发阶段的早期,写这个系列文章的目的,除了用来验证目前所做的工作外,还希望得到大家的指点和反馈。如果您有任何疑问和建议,请在评论区留言。 1. 背景 AWTK 全称 Toolkit AnyWhere,是 ZLG 开发的开源…

全球名校AI课程库(35)| 辛辛那提大学 · 微积分Ⅱ课程『MATH101 Calculus II』

🏆 课程学习中心 | 🚧 CS数学基础课程合辑 | 🌍 课程主页 | 📺 中英字幕视频 | 🚀 项目代码解析 课程介绍 Trefor Bazett 教授在 Cincinnati 大学任教时,制作了两套完整的的数学课程(微积分、离…

Eclipse创建Servlet项目-7

目录 1、创建动态 Web 项目 2、使用 Eclipse 创建 Servlet 3、配置 web.xml 4、部署项目并启动服务器 通过前面的学习,我们了解了如何在 Tomcat 目录下手动部署 Servlet,这种方式不但效率低下,而且容易出错。因此,在实际开发中…

变量常量,基本数据类型及数据类型转换

⭐️ 变量常量与基本数据类型及数据类型转换 📍 来自:中南林业科技大学软件协会学术部:谢添 ⏲ 时间:2022 - 10 - 29 至 2022 - 10 - 30 🏠 官网:https://www.csuftsap.cn/ ✏️ 本章所有提供代码均已测…

四旋翼无人机学习第4节--STM32、MPU9250等器件的绘制

0 前言 当画stm32、mpu9250这种多引脚的芯片,就需要参考芯片手册啦。 这里给大家推荐一个芯片手册查询网站。 半导小芯-芯片查询工具 进入网站,输入芯片的具体名称,点击查询即可。 最后点击下载即可。 1 stm32芯片手册引脚查询 选择引脚…

学习在Git项目中使用子模块(图文教程)

一般认为 父项目 是当前正在做的主要工作,但需要依赖 子模块 中提供的算法或者工具。父项目 与 子模块 不是同一批人维护的,或者是需要分开维护的。 此情此景,需要学习该教程了!!! 文章目录1 如何在父项目…

基于Java的一个可自由拖拽的BI可视化系统(附源码)

介绍 这是一个可自由拖拽的BI可视化系统支持主流的关系数据:MySQL,Oracle,PostgreSQL等同时支持Apache Doris,这个一开始初衷就是为了 Doris 数据可视化分析做的后端框架使用了若依 功能 按项目管理数据看板看板具备分享功能可以…

每天五分钟机器学习:超平面分离定理和凸优化

凸集和凸函数 在点集拓扑学与欧几里得空间中,凸集是一个点集,其中每两点之间的直线上的点都落在该点集中。如下所示: 函数任意两点(x,f(x))和(y,f(y))连线上的值大于(x,y)区间内任意一点m的值f(m),那么这个函数就是一个凸函数: 超平面分离定理 空间中存在两类样本,…

【CV】第 3 章:使用 OpenCV 和 CNN 进行面部检测

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

JavaScript语法知识笔记(一)——书写方式,输入出语句,变量,字面量,标识符,数据类型。

01.JS的三种书写方式 <!-- 2.内嵌式的js --><script>// alert(sajmo);</script><!-- 3.外部js script 双标签 --><script src"script.js"></script> <!-- JS代码需要写到script标签中 --><script type"text/jav…

软考高级-系统架构师-案例分析-架构设计真题考点汇总

2010年-2021年(不包括2019年和2020年)涉及到架构设计考点的有: 2010年题1,4; 2011年题1,4; 2012年题1; 2013年题1,4; 2014年题1,4; 2015年题1; 2016年题1; 2017年-题1; 2018年题1,5; 2021年题1 1.软件架构风格 软件架构风格是描述特定软件系统组织方式和惯用模式。组织方式描述…

2022第二届中国高校大数据竞赛A题(更新完毕)

文章目录题目任务做题解析第一问第三问第四问第一个预测第二个预测第五问关键技术摘要代码文件下载题目 制造业是国民经济的主体&#xff0c;近十年来&#xff0c;嫦娥探月、祝融探火、北斗组网&#xff0c;一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业…

公众号网课查题搭建-查题校园题库系统

公众号网课查题搭建-查题校园题库系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台…

Vue项目中Pinia状态管理工具的使用

目录Pinia与Vuex的区别使用Pinia直接修改数据的两种方式使用actions修改数据重置state中数据Pinia持久化存储Pinia模块化实现Pinia中store之间互相调用Pinia官网介绍说&#xff1a;Pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。Vuex同样可以作为状态管理工具…

C++ Reference: Standard C++ Library reference: C Library: cstring: memset

C官网参考链接&#xff1a;https://cplusplus.com/reference/cstring/memset/ 函数 <cstring> memset void * memset ( void * ptr, int value, size_t num ); 填充内存块 将ptr指向的内存块的第一个num个字节设置为指定value&#xff08;解释为unsigned char&#xff0…

云原生之k8s--------Kubernetes原理

单机容器编排&#xff1a;docker-compose 容器集群编排&#xff1a;docker swarm&#xff0c;mesosmarathon&#xff0c;kubernetes 应用编排&#xff1a;ansible 一&#xff0c;Kubernets是什么&#xff1f; Kubernetes的缩写为&#xff1a;K8S&#xff0c;这个缩写是因为…

BFC以及清除浮动四种方式

什么是BFC 先了解常见的三种定位方案&#xff1a; bfc是普通流&#xff1a; 可以将bfc看作是一个属性 2.如何触发bfc 1&#xff0e;根元素() 2&#xff0e;浮动元素(元素的float不是none) 3.绝对定位元素(元素的position为absolute 或 fixed) 4.display为inline-block、tabl…

Xilinx HLS基础介绍(二)—— AXI4接口类型定义

本期主题&#xff1a; HLS的接口类型定义 往期链接&#xff1a; Xilinx HLS基础介绍&#xff08;一&#xff09;——HLS概念以及接口管理 目录1.Vitis HLS AXI4 接口概述2.顶层函数的实参类型与接口关系2.1 寄存器接口 S_AXILITE2.2 存储器接口 m_axi2.3 串流接口 axi4_stream…

学内核之十五:应用层如何实现原子访问

在Linux应用层开发中&#xff0c;使用的锁大多都是基于Posix提供的版本。其中&#xff0c;锁的实现&#xff0c;是基于futex调用来完成的&#xff0c;而futex建立在原子访问和内核系统调用上。通过查阅相关资料&#xff0c;发现futex不完全是内核层的实现&#xff0c;如果锁未被…