【网络】什么是RPC

RPC 是Remote Procedure Call的缩写,译为远程过程调用。是一个计算机通信协议。

1、为什么需要远程调用

在如何给女朋友解释什么是分布式这一篇文章中介绍过,为了提升饭店的服务能力,饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切菜师、备菜师等多个角色。

在饭店只有一个厨师的时候,厨师想要做出一道美味的番茄炒蛋的时候,他需要自己洗番茄、切番茄、打鸡蛋、炒菜。整个过程不需要其他人参与自己就完全可以完成了。这就是古老的集中式应用中,一台单体计算机就可以搞定所有事情了。

制作番茄炒蛋{厨师->洗菜->切菜->炒菜
}

随着饭店发展,需要明确分工,让专业的人负责专业的事儿。所以,整个做菜过程中不再只有厨师参与了。需要有多个角色,备菜师傅负责准备番茄和鸡蛋、切菜师傅负责切菜、厨师只要负责炒菜就行了。

但是,随着分工明确,制作番茄炒蛋的过程不再是只有一个人参与的过程了。这个过程中需要多方协作。厨师准备炒菜之前,需要先通知备菜师傅和切菜师傅,前序工作准备好之后才能进行炒菜。

制作番茄炒蛋{备菜师->洗菜切菜师->切菜厨师->炒菜
}

这种情况下,厨师就要依赖很多外人来参与这个炒菜工作。而他在通知备菜师帮他洗菜,通知切菜师傅帮他切菜的时候,这个过程就是远程过程调用。

大多数情况下,一般是服务员直接到厨房下单,然后后厨有一个人员分别把菜单分发给备菜师、切菜师和厨师。

这个过程就和计算机系统很像了。如今的大型网站都是分布式部署的。拿一个下单流程来说,可能涉及到物流、支付、库存、红包等多个系统后,而多个系统又是分别部署在不同的机器上的,分别由不同的团队负责。而要想实现下单流程,就需要用到远程调用。

下单{库存->减少库存支付->扣款红包->红包抵用物流->生成物流信息
}

2、到底什么是远程过程调用

RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。

调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。

就像后厨的例子一样,服务员把菜单传给后厨,厨师告诉备菜师和洗菜师开始工作,然后他等待他们完成工作。备菜师和洗菜师工作完之后,厨师开始炒菜。这个过程对于服务员来说其实是透明的,他不需要关心到底后厨是怎么做菜的。

由于各服务部署在不同机器上,要想在服务间进行远程调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行orderService.buy("HHKB键盘")时,实质上调用的是远端的服务。这种方式其实就是RPC。而提供了这种功能的工具我们称之为RPC框架。

在RPC框架中主要有三个角色:Provider、Consumer和Registry。如下图所示:

Server: 暴露服务的服务提供方。

Client: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

服务提供方和服务消费方都比较好理解,就是后厨的洗菜师和厨师啦。厨师就是服务消费方,洗菜师就是服务提供方。厨师依赖洗菜师提供的服务。

服务注册中心又是个什么东西呢?

其实这个也比较好理解。对于那种很大的饭店来说,厨师可能有很多(集群部署),洗菜师也有很多(集群部署)。而厨师想要洗菜师帮忙洗菜的时候,他不会直接找某个洗菜师,而是通知一个中间人,这个人可能是洗菜师团队的领导,也可能就是一个专门协调后厨的人员。他知道整个厨房有多少洗菜师,也知道哪个洗菜师今天来上班了(需要先进行服务注册)。而且,他还可以根据各个洗菜师的忙碌情况动态分配任务(负载均衡)。

这个中间人就是服务注册中心。

服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表;

服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;

3、实现RPC需要用到的技术

一个成熟的RPC框架需要考虑的问题有很多,这里只介绍实现一个远程调用需要用到的基本技术,感兴趣的朋友可以找一些开源的RPC框架代码来看下。

动态代理

生成 client stub和server stub需要用到Java 动态代理技术,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。

序列化 

为了能在网络上传输和接收 Java对象,我们需要对它进行序列化和反序列化操作。

可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack

NIO

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

服务注册中心 

可选技术: Redis、Zookeeper、Consul、Etcd

参考资料 :https://www.jianshu.com/p/dbfac2b876b1

4、开源RPC框架

Dubbo

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前已经进入Apache孵化器。

Motan

Motan是新浪微博开源的一个Java RPC框架。2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。

gRPC

gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift

thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。

原文链接:漫话:如何给女朋友解释什么是RPC

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

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

相关文章

FPN网络

FPN(Feature Pyramid Network)是一种用于目标检测和语义分割等计算机视觉任务的网络结构。它旨在解决不同尺度下的特征信息不足的问题,提高模型对小目标和远距离目标的检测能力。在目标检测任务中,由于目标的尺度和形状各异&#…

Qt QML的插件(Qt Quick 2 Extension Plugin)方法

Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件qmltypes的生成qmltypes的可能性失效 插件的编码注意1、插件模块版本控制2、pro里的注意 调用插件插件信息输入…

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年,DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示,未来五年,支持DevOps实践的产品市场继续保持健康且快速增长,2022年-2027年的复合年增长率&#xff0…

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

文章目录 前言一、实现步骤1. 获取所需特征点的索引2. 使用opencv.js 计算俯仰角、水平角和翻滚角cv.solvePnP介绍cv.solvePnP原理运行代码查看效果 3.绘制姿态示意直线添加canvas元素计算姿态直线坐标并绘制 总结 前言 在计算机视觉领域,估算脸部姿态是一项具有挑…

element-ui drawer 组件源码分享

今日简单分享 drawer 组件的源码实现,从以下五个方面来分享: 1、drawer 组件页面结构 2、drawer 组件属性 3、drawer 组件 slot 4、drawer 组件方法 5、drawer 组件事件 一、drawer 组件页面结构 二、drawer 组件属性 2.1 append-to-body 属性&am…

政安晨:【Keras机器学习实践要点】(二十一)—— MobileViT:基于变换器的移动友好图像分类模型

目录 简介 导入 超参数 MobileViT 实用程序 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! …

STC89C52学习笔记(六)

STC89C52学习笔记(六) 综述:本文讲述了51单片机的定时器和中断,还讲述了如何初始化定时器、编写中断服务函数和完成定时器控制LED闪烁。 一、定时器 1. 作用 ①用于计时 ②替代长时间的Delay。因为在Delay下,单片…

php站长在线工具箱源码优化版

环境要求 PHP > 7.4MySQL > 5.6fileinfo扩展使用Redis缓存需安装Redis扩展 源码下载地址:php站长在线工具箱源码优化版.zip

stm32GPO的相关操作

GPIO的使用 1.GPIO八种工作模式1.1 上拉输入1.2 下拉输入1.3 浮空输入1.4 模拟输入1.5 推挽输出1.6 开漏输出1.7 复用推挽输出1.8 复用开漏输出 2.相关寄存器2.1 寄存器配置IO 3.相关库函数 1.GPIO八种工作模式 保护二极管的作用:用来保护IO,一般情况IO的…

【React】Ant Design社区扩展库之分割面板:react-resizable-panels

主角:react-resizable-panels 简介:来之Ant Design官方文档社区精选组件 1、效果 2、环境 react-resizable-panels: ^2.0.16next: 14.1.3react: ^18 3、安装 # npm npm install react-resizable-panels# yarn yarn add react-resizable-panels# pnpm …

AI编程005/ 逆向生成mysql的建表语句

1/ 通过insert into 语句生成建表语句 有些时候我们能获取到表的insert语句,但是没有表结构。我们可以借助AI工具,让其逆向生成mysql的建表语句。 提示词如下: 根据下面的SQL语句,逆向生存mysql的建表语句,每个字段…

文心一言上线声音定制功能;通义千问开源模型;openAI又侵权?

文心一言上线定制专属声音功能 百度旗下 AI 聊天机器人文心一言上线新功能,用户录音一句话,即可定制声音。 使用这项功能需要使用文心一言 App。在创建智能体中,点击创建自己的声音,朗读系统提示的一句话,等候几秒钟时…

【大数据】大数据概论与Hadoop

目录 1.大数据概述 1.1.大数据的概念 1.2.大数据的应用场景 1.3.大数据的关键技术 1.4.大数据的计算模式 1.5.大数据和云计算的关系 1.6.物联网 2.Hadoop 2.1.核心架构 2.2.版本演进 2.3.生态圈的全量结构 1.大数据概述 1.1.大数据的概念 大数据即字面意思&#x…

网络工程师笔记18(关于网络的一些基本知识)

网络的分类 介绍计算机网络的基本概念,这一章最主要的内容是计算机网络的体系结构-ISO 开放系统互连参考模型,其中的基本概念,例如协议实体、协议数据单元,服务数据单元、面向连接的服务和无连接的服务、服务原语、服务访问点、相…

Vscode 中调试Django程序

调试介绍: ​​​​​​​Explore the debugger Debug/调试 可以让我们在特定的代码行上暂停程序的运行。当程序暂停时,我们可以查看变量的数值,在“Debug控制台”中运行代码,或利用“Debug”工具提供的其他功能。启动Debugger/调试器会自动…

迭代器模式

前言 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。 迭代器模式在访问数组、集合、列表等数据时,尤其是数据库数据操作时&am…

PSO-SVM,基于PSO粒子群算法优化SVM支持向量机回归预测(多输入单输出)-附代码

PSO-SVM是一种结合了粒子群优化(Particle Swarm Optimization, PSO)算法和支持向量机(Support Vector Machine, SVM)的方法,用于回归预测问题。下面我将解释PSO-SVM的原理: 1、支持向量机(SVM&a…

系统架构评估_3.ATAM方法

架构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM)是在SAAM的基础发展起来的,主要针对性能、实用性、安全性和可修改性,在系统开发之前,对这些质量属性进行评价和折中。 (1&#x…

10倍提效!用ChatGPT编写系统功能文档。。。

系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。 通过ChatGPT,我们能让编写系统功能文档的效率提升10倍以上。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记…

计算机网络-TCP连接建立阶段错误应对机制

错误现象 丢包 网络问题:网络不稳定可能导致丢包,例如信号弱或干扰强。带宽限制可能导致路由器或交换机丢弃包,尤其是在高流量时段。网络拥塞时,多个数据流竞争有限的资源,也可能导致丢包。缓冲区溢出:TC…