Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RPC和REST的区别(转)

RPC和REST的区别(转)

作者头像
全栈程序员站长
发布于 2021-05-19 07:31:07
发布于 2021-05-19 07:31:07
5880
举报

原文: http://pgoy.wordpress.com/2007/09/08/rpc%e5%92%8crest%e7%9a%84%e5%8c%ba%e5%88%ab%ef%bc%88%e5%8e%9f%e5%88%9b%ef%bc%89/

这两天要忙着写老师布置的论文,遇到两个网络方面的专业术语不太明白,于是翻阅无数国内网站,国内对RPC的解释比较齐全也比较权威,但想查些关于REST的就很少了。国内网站对REST的解释实在是很模糊,不知道是我理解的太不彻底,还是写这些文章的本身对概念了解的就不是很彻底,最终我对REST还是一头雾水。无奈去问老师,结合他的讲解终于对REST有了些实在的理解。后来我感觉,是否是因为这些概念本身是由国外率先提出来的,国内人士对这些概念的理解也无非是通过阅读外文书籍,或是看那些翻译成中文的解释,但在这里我要着重说的是,那些翻译过来的文章的作者是否是在真正理解到了这些概念的精髓之后,才进行翻译同时加入自己对其的理解呢。通过老师的讲解和对国内网站中对REST的认识我发觉,要想真正想理解一些这些概念还得阅读英文原文,

首先,这些概念是作者创造出来的,对概念的理解可谓是最深刻,阐述也可谓最全面; 其次,英文毕竟不是我们的母语,所以从文字结合内容上讲毕竟有一些难度,同一篇文章对中心的理解可能就更相形见拙了,有些甚至只对全文粗率的看了一遍,确已经开始大胆的表述看法,以为也不过如此云云。实际上,对精髓的认识更可能还只是了解到一些皮毛。对这样的学习态度我认为是非常不负责任的,有的已经把自己的看法发布到网上,拜为权威,可谓误人子弟。

我之所以会先到国内网站上搜索是因为,中文毕竟是母语,理解起来可能会快些,也会帮我尽快的入门,预热。可这些曾被我视为权威的文章留给我的只是些片面的皮毛的认识,或者可以说是还不入流。我这样说的本意并不是在讽刺国内相关专业发展程度落后,但学术是不容得一知半解的,是严肃谨慎的。希望那些经常在网上进行专业交流的朋友不要一概的追求长篇大论,以字数和对众多题目的回复量而造成的虚拟声望值来混淆视听,这样只会自欺欺人;而是应该实事求是,对知识的理解到了炉火纯青,相当透彻的地步再进行公开发表。更不要只是看到对问题的解释篇幅很长便视为权威,疯狂转载,经常可以看到网上对某一知识点的解释千篇一律,如果观点是正确的还好,否则就成了有奶便是娘,失之毫厘,谬以千里。总之,对学术要谨慎,要负责任。

言归正传,这里谈谈我结合老师的解释对REST的认识,以及REST和RPC的区别。首先要声明我不敢保证我说的一定权威,可能也很肤浅,但我非常真诚的请求各位如果有感觉我说的不对,或者还不全面的地方给予指出,正确的,我一定会虚心接受。

先来了解一下: RPC(Remote Procedure Call)远程调用 RPC是在客户端/服务器端(client/server)网页或软件编程中不可缺少的一种方法,client若需要对数据进行处理时,先创建一个提出问题的进程(procedure),进程采用将操作以请求的方式发送给服务器,并等待服务器端对请求做出响应并给出回复,不需要在client端去实地的进行数据处理和复杂的运算,而是将这些过程交给服务器去做,这个client端的进程只是等待,等待会有两种可能的结果:一种是由服务器端传回计算或处理的结果;二是操作超时,并未收到从服务器端发来的回复,但无论是哪一种情况发生,client端进程都算完成使命并自行结束。从编程的角度讲,打个比方,在网上购物的购物篮功能中,将选购的物品放入购物篮的操作就会使用到RPC,在客户端所表现的只是需要点击一个按钮,按钮的功能是将选定的物品放入购物篮中。这是在前台,用户可以确实的看到的操作;而在后台,在编辑这个网页的过程中,用户点击按钮的这一步,是由远程调用服务器端的相应的函数实现的。在此例中,想实现这个按钮的功能就要知道调用服务器端的添加物品的函数(也叫接口interface)的名称--AddinBasket();client端发送请求给服务器,要将选定的物品放入购物篮,服务器端接到请求后,由AddinBasket函数对请求进行响应,做出处理,然后把响应结果(如,物品已放入购物篮)返回给client端。Client端接到回复后显示给用户:操作成功,物品已加入购物篮。

那么一次RPC在计算机的内部又是如何进行的呢?“远程”调用是怎么调用实现的?

还拿上面的例子: client端,用户点击按钮后,在client本地建立一个进程A(procedure A),进程的目的是想将一本书(book)放入购物篮,进程A将这本书放入本地的内存地址中(进程A本身并不会直接去产生调用远程服务器端的请求,而是和在本地操作一样只是将数据存储到内存中,由其它进程进行处理,将结果保存到内存中),然后进入等待状态,client端的client-stub检测到进程A在内存中存储的数据后,从内存中将数据读取出来连同需要调用的函数AddinBasket函数名一起建立一个数据包发送给服务器端的server-stub程序。

server端,server-stub收到client-stub发送过来的数据包后,打开数据包,从里面读出数据,将数据存储到server的内存中,server端的处理进程procedure B检测到server端由server-stub存储的数据后,调用server端的AddinBasket函数,处理数据,并将结果存入server端的内存,通知server-stub数据处理完毕,server-stub从内存中读取出处理结果,制作一个数据包作为client端请求的回复发送给client-stub。自此server端的运行完毕。

client端,client-stub接收到数据包,从中读取出处理结果的数据,保存到client端的内存中并通知进程A数据处理完毕。进程A从内存中读取结果。这样一次远程调用彻底结束。在这个过程中,client端的进程A以及server端的进程B都不知道他们要进行的是一个远程的调用或请求,而是一直当作本地的操作一样,从各自本地的内存中读取数据,而client-stub和server-stub是实现这个远程调用的具体实施者。这种客户端向服务器端发送请求,由服务器相应处理传回结果的方法被称为RPC(远程调用)。

因为需要调用服务器端的接口函数就需要了解服务器端究竟提供了什么样的接口,接口的实现方法是什么,函数的参数是什么类型的,这些信息都会写在服务器端的函数文档中,如上面的购物篮功能涉及的函数不光有:AddinBasket()还应该包括,RemovefromBasket(),ClearBasket(),getBasketItem(),purchasBasket()等等这些,这些也就是相对于客户的“从购物篮中删除物品”,“清空购物篮”,“获得购物篮中的物品列表”,“为购物篮内物品付款”的这些具体的操作的响应函数,编程人员在编写页面的代码时需要透彻的理解各个函数的调用方法,以及相互之间的逻辑关系。这里的逻辑关系是指如例中,当购物篮内是空的时,从购物篮中删除物品的按钮应该是不允许操作状态的。这一系列的函数的理解都给编程增添了复杂度,而且服务器端在正式运行中要处理所有的用户请求,而这些请求的功能是很烦琐的,这给服务器端无形中创造了很多的工作量,而REST在这一点上是很精简有效的。

现在我们来看: REST(Representational Status Transfer) 必须承认的是大部分的REST的实现中使用了RPC的机制,它也有client端和server端,所不同于RPC的是,它的响应函数简单来讲就是get函数和post函数,对于上面使用的购物篮问题中使用REST方法实现的化,只需要两个函数getBasket和PostBasket,getBasket函数是将服务器端当前的购物篮状态获取下来,client端想对购物篮中的物品做出操作的话,比如添加一本书,或将已经有的物品取出购物篮,直接修改修改购物篮中的物品,最后将一个新的购物篮内物品的状态(status)用postBasket方法发送给服务器。这就是REST的中心原理,即:下载服务器端的当前状态,修改之后将最终用户所期待的状态发送给服务器,服务器按照客户的期待进行修改。而不同于RPC的也就是响应函数没有那么多的,复杂的逻辑关系,函数也减少了很多,只是get和post两个。从而给服务器减少了工作量而且在逻辑上也是符合的。表面上看来REST比RPC是要先进的,但是REST的缺点在于,这种只有get和post的逻辑并不是永远有效的,并不是对一切问题都是万能的,举个例子来说:两个用户A和B使用同一个账户在网上商店购物,他们都从服务器端获得了当前购物篮中的状态,用户A向购物篮中添加了一本书,用户B在购物篮中添加了一辆自行车,随后A先向购物篮状态上传给服务器,此时服务器中购物篮里多出了一本书,此时B也把他的购物篮上传给服务器,服务器将B的购物篮状态覆盖了原有的状态,购物篮里多了一辆自行车,而A挑选的一本书在B上传后购物篮覆盖过程中被丢失了。这就造成了对用户的操作的不完全服从。这一点也成了REST的缺点。

总结一下,RPC逻辑复杂,对服务器造成很多的工作量,但分工明确,不容易造成失误。REST逻辑简单,对服务器的工作压力也比较小,但在某些特殊情况下不一定完美的解决问题。 (以上观点系本人对RPC和REST的认识如有不同的理解请予指出。愿闻其详!在这里真诚的希望国内计算机业人才也能多产生一些高精尖的理论,这样我们学习国人创造发明的新理论时能消除一知半解,不止感受到自豪,也不在那么困难了。最后愿国内的电子软件业能够繁荣昌盛!) 

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100486.html原文链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年5月9日 p,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解RPC
我觉得学习一项技术最好的方法就是跟着官方文档学,最近在深入学习 dubbo,就逛了一下 Dubbo 的官网,发现官方已经整理了很多比较好的博客文档,都是实打实的干活,建议大家有时间也可以看看。接下来我会整理一个专题来分享我在这个学习中记录的笔记,希望可以帮助到大家,今天分享第一篇,深入了解一下 RPC。
故里
2020/11/25
6560
RPC协议了解
1.RPC概述 RPC(Remote Procedure Call Protocol)远程过程调用协议。 通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个过程或函数,就像调用本地应用程序中的一 样。 正确的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
全栈程序员站长
2022/08/31
3130
RPC简介
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
Helloted
2022/06/08
4.8K0
RPC简介
深入浅出 RPC - 浅出篇
近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了。缺乏对原理层面的理解,往往也会造成开发中的一些误用。
Java高级架构
2018/12/10
1.1K0
深入浅出 RPC - 浅出篇
RPC 快速入门
RPC 协议的基本原理是客户端调用远程服务器上的函数,并将函数参数传递给服务器。 服务器执行相应的函数逻辑,并将结果返回给客户端。从客户端的角度来看,RPC 调用就像是调用本地函数一样,而不需要关心远程函数的实现和通信细节。简单来说:从本质上讲,它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程的。
蔡不菜丶
2024/04/01
7420
RPC 快速入门
RPC和RESTful的区别
RPC和RESTful都是远程调用接口,那么它们之间到底有什么区别的呢?我以前一直傻傻分不清楚,直到我看了周志明老师写的《凤凰架构:构建可靠的大型分布式系统》我才理清了它们之间的区别,怕自己忘了,特意做下笔记。
zhanyd
2022/05/16
6850
RPC和RESTful的区别
分布式通信技术之远程调用:RPC
通过前面的学习,不知道你有没有发现分布式的本质就是多进程协作,共同完成任务。要协作,自然免不了通信。那么,多个进程之间是如何通信的呢?这也就是在“分布式通信技术”模块中,我将要为你讲解的问题。
架构师修炼
2020/07/17
3.4K0
rpc是什么?php中流行的rpc框架有哪些?
先回答第一个问题:什么是RPC框架?如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call)
码农编程进阶笔记
2021/07/20
2.8K0
rpc是什么?php中流行的rpc框架有哪些?
从0到1:轻松搞定从RPC到服务化框架的设计!
导语 | 目前互联网系统都是微服务化,那么就需要RPC调用,因此本文梳理了从RPC基本框架协议到整个服务化框架体系建设中所包含的知识点,重点在于RPC框架和服务治理能力的梳理。 一、从RPC到服务化框架设计 (一)RPC基本框架 理解RPC RPC就是远程过程调用。我们本地的函数调用,就是A方法调B方法,然后获取结果,RPC就是让你像本地函数调用一样进行跨服务的函数调用。我们现在都在讲微服务,服务都拆分为微服务了,那么相关依赖的调用,就会变成跨服务之间的调用,他们的通信方式就是依靠RPC。 RPC基础
腾讯云开发者
2021/11/19
7910
【大数据之Hadoop】 从自定义 RPC 到 Hadoop RPC ,理解分布式通信系统的底层工作原理
Hadoop是分布式计算系统,在分布式环境中,网络通信模块是其核心模块之一。要学好Hadoop,需理解其底层通信系统的基本工作原理。Hadoop提供有体系完整的RPC框架,实现了对底层网络通信的优雅封装。
一枚大果壳
2023/08/18
2180
【大数据之Hadoop】 从自定义 RPC 到 Hadoop RPC ,理解分布式通信系统的底层工作原理
RPC 发展史
本文主要介绍RPC基础概念以及发展历程,目的是为了让读者对RPC 的发展以及发展过程中遇到的问题有比较清晰的了解。
goodspeed
2021/08/18
2.4K0
【云原生】RPC调用-Dubbo
微服务在维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。所以微服务之间日常调用一般用的都是RestFul,比如Feign、Ribbon等。国内厂商阿里巴巴提供了同样轻量级的通信另一种解决方案:RPC通信方式,Dubbo是其中的代表。 RPC是指远程过程调用(Remote Procedure Call)的缩写,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 RestFul_请求_ 当然可以,但是相对RestFul,RPC采用长链接机制,性能更高延时更低,RPC 与 RESTful 最大的不同是,RPC 采用客户端(Client) - 服务端(Server) 的架构方式实现跨进程通信,实现的通信协议也没有统一的标准,具体实现依托于研发厂商的设计。 最终解决的问题:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
共饮一杯无
2022/11/28
7260
【云原生】RPC调用-Dubbo
Python3简单使用xmlrpc实现RPC
先说说什么是RPC,RPC(Remote Procedure Call)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
Cloudox
2021/11/23
1K0
Python3简单使用xmlrpc实现RPC
花了一个星期,我终于把RPC框架整明白了!
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
范蠡
2020/10/23
6.7K0
花了一个星期,我终于把RPC框架整明白了!
通俗的解释一下什么是 RPC 框架?
首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
李海彬
2018/07/26
3K0
通俗的解释一下什么是 RPC 框架?
初探gRPC
随着微服务框架和云原生框架的出现,传统的单体应用程序被分解为一组细粒度的、自治的和面向业务能力的微服务,网络通信链路的数量激增,服务间的通信技术也因此成为了现代分布式系统中至关重要的一个环节。
会呼吸的Coder
2023/03/03
5751
初探gRPC
性能基础之常见RPC框架浅析
在性能基础之浅谈常见接口性能压测一文中我们有简单介绍常见的 RPC 接口,本文将单篇详细介绍 RPC 框架。
高楼Zee
2019/07/17
1.7K0
性能基础之常见RPC框架浅析
01 . RPC简介原理及用Go实现一个RPC
RPC简介 本地过程调用 // 正常情况下程序的执行和调用情况。例如有如下go语言代码: package main import "fmt" func main() { var a,b int a = 1 b = 2 c := Add(a,b) fmt.Println("计算结果",c) } func Add(a int,b int) int{ return a+b } 在上述的Go语言代码中,我们定义了一个Add方法用于实现两个数相加的功能,在main方法中通过调用Add方法实现了
iginkgo18
2020/09/27
9850
01 . RPC简介原理及用Go实现一个RPC
RMI与RPC的区别
一、RMI 远程方法调用 RMI(Remote Method Invocation)远程方法调用。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。使用
黑泽君
2018/10/11
18.1K0
RMI与RPC的区别
SOA、SOAP、RPC、REST、DUBBO的区别与联系[通俗易懂]
SOA(面向服务的软件架构、Service Oriented Architecture),是一种软件设计模式,主要应用于不同应用组件之间通过某种协议来互操作。例如典型的 通信网络协议。因此SOA是独立于任何厂商、产品、技术的。 SOA有两个层面的定义:
全栈程序员站长
2022/08/04
1.7K0
相关推荐
深入理解RPC
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档