RPC和REST对比

RPC和REST对比

参考学习

RPC 和 REST 之间有什么区别?

当我们对比RPC和REST时,其实是在对比RPC风格的API和REST风格的API,后者通常成为RESTful API。

远程过程调用(RPC)和 REST 是 API 设计中的两种架构风格。API 是允许两个软件组件使用一组定义和协议相互通信的机制。

RPC API 允许开发人员在外部服务器中调用远程函数,就好像它们在软件本地一样。例如,您可以通过远程调用其他聊天应用程序上的消息收发函数来向应用程序添加聊天功能。

相比之下,REST API 允许您在远程服务器上执行特定的数据操作。例如,您的应用程序可以使用 REST API 在远程服务器上插入或修改员工数据。

RPC 和 REST 有何相似之处?

远程过程调用(RPC)和 REST 都是设计 API 的方法。API 在现代 Web 设计和其他分布式系统中均不可或缺。它们允许两个独立的分布式应用程序或服务进行通信,而无需知道另一个应用程序或服务的内部工作原理。除了少量的数据交换外,这两个应用程序或服务彼此之间可能几乎没有关系。

API 也是程序后端(逻辑组件)与程序前端(显示组件)通信的常用机制。当您使用 API 而不是紧密耦合的集成来设计网页和 Web 应用程序时,您可以确保它们能够进行扩展而更改,同时只需要更少的代码重写。

接下来,我们将讨论 RPC 与 REST API 之间的其他相似之处。

  • 抽象
    虽然网络通信是 API 的主要目标,但较低级别的通信本身是从 API 开发人员那里抽象出来的。这使开发人员可以专注于功能而不是技术实施。

  • 交流
    REST 和 RPC 都使用 HTTP 作为底层协议。RPC 和 REST 中最常用的消息格式是 JSON 和 XML。JSON 因其可读性和灵活性而备受青睐。

  • 跨语言兼容性
    开发人员可以用他们选择的任何语言实施 RESTful 或 RPC API。只要 API 的网络通信元素符合 RESTful 或 RPC 接口标准,您就可以使用任何编程语言编写其余代码。

架构原则:RPC vs.REST

在远程过程调用(RPC)中,客户端在服务器上进行远程函数(也称为方法或过程)调用。通常,在调用期间会向服务器传递一个或多个数据值。

相比之下,REST 客户端则是请求服务器针对特定服务器资源执行操作。操作仅限于创建、读取、更新和删除(CRUD),并以 HTTP 动词或 HTTP 方法的形式传达。

RPC 侧重于函数或操作,而 REST 则侧重于资源或对象。

RPC 原则

接下来,我们将讨论 RPC 系统通常遵循的一些原则。但这些原则并不像 REST 那样标准化。

  • 远程调用
    RPC 调用是由客户端对远程服务器上的函数进行的,就像该函数是在本地调用到客户端的一样。

  • 传递参数
    客户端通常向服务器函数发送参数,与本地函数大致相同。

  • 存根
    函数存根同时存在于客户端和服务器上。在客户端上,它进行函数调用。在服务器上,它调用实际函数。

REST 原则

REST 原则是标准化的。REST API 必须遵循这些原则才能被归类为 RESTful。

  • 客户端-服务器
    REST 的客户端-服务器架构将客户端与服务器分离。该架构将客户端和服务器视为独立系统。

  • 无状态
    服务器不会保留两次客户端请求之间客户端状态的记录。

  • 可缓存
    客户端或中间系统可能会根据客户端是否指定了可以缓存响应来缓存服务器响应。

  • 分层系统
    中间系统可以存在于客户端与服务器之间。客户端和服务器都对中间系统一无所知,并像它们直接连接一样运行。

  • 统一接口
    客户端和服务器通过一组标准化指令和消息收发格式与 REST API 通信。资源由其 URL 标识,此 URL 称为 REST API 端点。

工作原理:RPC vs.REST

在远程过程调用(RPC)中,客户端使用 HTTP POST 按名称调用特定函数。客户端开发人员必须事先知道函数名称和参数,RPC 才能正常工作。

在 REST 中,客户端和服务器使用 GET、POST、PATCH、PUT、DELETE 和 OPTIONS 等 HTTP 动词来执行选项。开发人员只需要知道服务器资源 URL,而不必关心单个函数的名称。

下表显示了客户端用于在 RPC 和 REST 中执行类似操作的代码类型。
在这里插入图片描述

主要区别:vs.REST

远程过程调用(RPC)和 REST 都是用于设计相应的客户端和服务器系统接口以通过互联网进行通信的方法。但两者的结构、实施和基本原则各不相同。使用 REST 设计的系统称为 RESTful API,而使用 RPC 设计的系统就是 RPC API。
下面列出了两者的更多区别。

  • 开发时间
    RPC 是在 1970 年代末和 1980 年代初开发的,而 REST 则是由计算机科学家 Roy Fielding 于 2000 年首次创造的术语。

  • 操作格式
    由于 HTTP 方法,REST API 拥有一组标准化服务器操作,但 RPC API 没有。某些 RPC 实施为标准化操作提供了框架。

  • 数据传递格式
    REST 可在同一 API 内传递任何数据格式和多种格式,如 JSON 和 XML。
    但对于 RPC API 而言,数据格式由服务器选择,并且在实施过程中是固定的。您可以拥有特定的 JSON RPC 或 XML RPC 实施,但客户端没有灵活性。

  • 省/市/自治区
    在 API 的上下文中,无状态是指服务器不存储有关客户端先前交互的任何信息的设计原则。每个 API 请求都是独立处理的,服务器不依赖任何已存储的客户端状态来处理请求。

REST 系统必须始终是无状态的,但 RPC 系统可以有状态,也可以无状态,具体取决于设计。

何时使用:RPC 与REST

远程过程调用(RPC)通常用于调用服务器上需要操作结果的远程函数。当您需要进行复杂计算或者想要在服务器上触发远程过程时,可以使用它,并使该进程对客户端隐藏。

下面列出一些操作,对于这些操作而言,RPC 是不错的选择:

  • 使用远程设备的摄像头拍照
  • 在服务器上使用机器学习算法识别欺诈行为
  • 在远程银行系统上将资金从一个账户转到另一个账户
  • 远程重启服务器

REST API 通常用于针对服务器上的数据对象执行创建、读取、更新和删除(CRUD)操作。这使得 REST API 非常适用于需要统一公开服务器数据和数据结构的情况。

下面列出一些操作,对于这些操作而言,REST API 是一个理想选择:

  • 将产品添加到数据库
  • 检索音乐播放列表的内容
  • 更新某人的地址
  • 删除博客文章

为什么 REST 取代了 RPC?

虽然 REST Web API 已经成为当今的标准,但远程过程调用(RPC)并未消失。REST API 通常用于应用程序,因为它更易于开发人员理解和实施。但 RPC 仍然存在,并在更适合的应用场景中使用。

RPC 的现代实施(如 gRPC)现在更受欢迎。在某些应用场景下,gRPC 的性能优于 RPC 和 REST。它允许客户端-服务器间的流式通信,而非请求和响应数据交换模式。

差异摘要:RPC vs.REST

在这里插入图片描述

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

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

相关文章

「Swift」取消UITableView起始位置在状态栏下方开始

前言:在写页面UI时发现,当隐藏了NavigationBar时,即使UITableView是从(0,0)进行布局,也会一直在手机状态栏下方进行展示布局,而我的想法是希望UITableView可以从状态栏处就进行展示布局 当前页面展示: 问题…

qt-C++笔记之QStringList

qt-C笔记之QStringList —— 杭州 2023-12-03 code review! 文章目录 qt-C笔记之QStringList1.1.《Qt官方文档》第一部分翻译&#xff1a;继承自QList\<QString\>-初始化-添加字符串1.2.迭代字符串1.3.join()和split()1.4.filter()1.5.lastIndexOf()1.6.indexOf()1.7.…

最有效的wordpress禁止生成缩略图教程

把以下代码加入你的主题 functions.php 文件即可。 // 禁用自动生成的图片尺寸由www.wwttl.com提供学习 function shapeSpace_disable_image_sizes($sizes) {unset($sizes[thumbnail]); // disable thumbnail sizeunset($sizes[medium]); // disable medium sizeun…

stream流操作List对象,指定属性,取差集、交集

差集 // 差集 (list1 - list2 list1 中不同数据)List<Person> reduce1 list1.stream().filter(a -> !list2.stream().map(b -> b.getAge() "&" b.getName()).collect(Collectors.toList()).contains(a.getAge() "&" a.getName()…

【Delphi】实现彩色日志显示框(TRichEdit Helper)

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

简单3D姿态基线模型网络架构与验证【SIM】

在这篇文章中&#xff0c;我们将回顾 ICCV’17 上提出的 Simple 3D Pose Baseline &#xff0c;即用于 3d 人体姿势估计的简单而有效的基线&#xff0c;也称为 SIM。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在…

基础组件总结(以Element UI组件库为例)

一般对一个组件的使用方式&#xff1a; 每一个组件都有被绑定的数据&#xff0c; &#xff08;1&#xff09;首先会对组件的数据初始化&#xff08;a.data中赋初值 b. 在生命周期函数created或mounted中为变量赋予初值&#xff09; &#xff08;2&#xff09;由于不同组件的…

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>#define BOARD_SIZE 10#define NUM_MINES 10int main() { int board[BOARD_SIZE][BOARD_SIZE]; int num_flags, num_clicks; int …

threadlocal - 黑马程序员

目录 1、ThreadLocal介绍1.2 ThreadLocal基本使用1.2.1、常用方法1.2.2 使用案例 1.3 ThreadLocal类与synchronized关键字 2、运用场景_事务案例3、ThreadLocal的内部结构4、 ThreadLocal的核心方法源码5、ThreadLocalMap源码分析5.2 弱引用和内存泄漏 课程地址&#xff1a; ht…

Android Camera2使用

一 简介 1.1 Camera API&#xff1a; 这是旧版本的相机API&#xff0c;也称为Camera1 API。它提供了较简单的使用方式&#xff0c;适用于旧版Android设备。但它存在一些限制&#xff0c;如性能不佳、操作复杂等 1.2 Camera2 API&#xff1a; 这是新版本的相机API&#xff0…

LeetCode [简单] 对称二叉树二叉树的直径

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; //对称二叉树 /*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public TreeNode(int val0, TreeNode leftnu…

Blender学习笔记:小车狂奔动画

文章目录 路旁小树汽车尾气移动 教程地址&#xff1a;八个案例教程带你从0到1入门blender【已完结】 小车建模 路旁小树 1 添加摄像机&#xff0c;在小车下面拉一个平面&#xff0c;覆盖到摄像机的观察视窗。复制一层平面&#xff0c;收窄变成小车两侧的路面&#xff0c;编辑…

【设计模式-4.3】行为型——责任链模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;责任链模式&#xff1b; 审批流程 责任链模式属于行为型设计模式&#xff0c;关注于对象的行为。责任链模式非常典型的案例&#xff0c;就是审批流程的实现。如一个报销单的审批流程&#xff0c;根据报销单…

力扣每日一题day26[42. 接雨水]

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

一站式自动化:Ansible Playbook的全面学习之旅

1 Playbook介绍 1.1 Playbook介绍 playbook 是由一个或多个play组成的列表 Playbook 文件使用YAML来写的 1.2 YAML 1.2.1 介绍 是一种表达资料序列的格式&#xff0c;类似XML Yet Another Markup Language 2001年首次发表 www.yaml.org 1.2.2 特点 可读性好 和脚本语言交…

RPG项目01_新输入输出

基于“RPG项目01_脚本代码”&#xff0c;本次修改unity的新输入输出系统。本次修改unity需要重启&#xff0c;如果一直跟着做教学项目&#xff0c;请先保存项目&#xff0c;再继续修改unity为新输入输出系统。 向下翻&#xff0c; 向下翻&#xff0c; 选择both加入新输入输出系…

Android把宽高均小于给定值的Bitmap放大到给定值,Kotlin

Android把宽高均小于给定值的Bitmap放大到给定值&#xff0c;Kotlin 假设拉伸放大到SIZE2048 fun scaleSize(image: Bitmap): Bitmap {val w image.widthval h image.heightvar newW: Intvar newH: Intif (w > h) {newW SIZEnewH (SIZE / w.toFloat()) * h} else {newW …

PHP常用系统函数的 学习资料

输出函数 echo($string): 输出一个或多个字符串。print($string): 输出一个字符串。printf($format, $args): 根据指定的格式输出格式化的字符串。var_dump($expression): 打印变量的相关信息&#xff0c;包括类型和值。print_r($expression): 打印变量的易读版本&#xff0c;…

Harmony OS (eTS语言)的起源和演进

Harmony OS&#xff08;eTS语言&#xff09;的起源和演进 1.eTS语言的起源和演进 1.1.概括 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了eTS。eTS&#xff08;extended TypeScript&#xff09;是鸿蒙(Harmony)生态的一种应用开发语言。也是H…

qt 动态生成柱状图

cpp文件 #include "mform.h" #include "ui_mform.h" #include <QBarSeries> #include <QBarSet> #include <QtCharts> #include <QPushButton> #include <QtCharts/QChartView> #include <QtCharts/QPieSeries> #inc…