当前位置: 首页 > news >正文

RPC与REST有什么区别?

原文:RPC与REST有什么区别?

77bb0997e4bdf72180a6c1c86262531c.jpeg

背景

    好多开发的同学在工作中,经常分不清RPC和REST的区别,导致经常沟通不在一个层次上。甚至有些同学把这两个当成同一个东西。

RPC与REST的区别?

对比名称

rpc

rest

备注

架构风格

RPC是基于过程调用的架构风格,它将远程方法调用封装为本地方法调用的形式,实现了不同进程或不同机器之间的通信。

REST是基于资源的架构风格,它通过URL表示资源,使用HTTP协议的GET、POST、PUT、DELETE等方法来对资源进行操作。

一个是基于通信的调用架构,一个是基于资源的,不一样哈。

通信协议

RPC通常使用更轻量级、二进制的协议,如Protocol Buffers、Thrift等,以提高性能和效率。

REST使用基于文本的协议,如HTTP,以实现跨平台和跨语言的互操作性。

数据格式

RPC通常使用较为紧凑和高效的二进制数据格式,如Protocol Buffers,以降低数据传输的大小和网络开销。

REST通常使用基于文本的数据格式,如JSON、XML等,以易读易解析的方式呈现数据。

接口形式

RPC的接口通常定义了明确的方法名、参数和返回值类型,类似于本地方法调用,隐藏了网络通信的细节。

REST的接口通过HTTP方法和URL来表示对资源的操作,如GET /users,PUT /users/1等。

状态管理

RPC是无状态的,每个请求都是独立的,服务端不需要保留客户端的状态信息。

REST是有状态的,客户端可以通过使用会话、Cookie等机制来维护和传递状态信息。

这点特别重要,好多工作好多年的同学还不清楚。REST是可选的。

RPC和REST在什么场景下使用?

RPC适用的场景包括:

  • 分布式系统:RPC可用于不同进程或不同机器之间的方法调用,方便实现分布式系统的通信。

  • 高性能要求:由于RPC使用轻量级、二进制的通信协议,如Protocol Buffers,能够提供较高的性能和效率。

  • 内部系统集成:企业内部的服务之间常常需要相互调用,使用RPC可以简化和加速这些调用过程。

  • 强类型语言:RPC广泛用于静态、强类型的编程语言中,如Java、C++等,以便更好地支持类型的定义和校验。

REST适用的场景包括:

  • Web服务:REST是一种基于HTTP协议的架构风格,非常适合构建Web服务和API。

  • 资源操作:REST通过URL和HTTP方法来表示对资源的操作,适合处理资源的增删改查等操作。

  • 跨平台和跨语言:REST使用基于文本的数据格式,如JSON、XML,便于不同平台和语言之间的数据交换和解析。

  • 状态无关:REST的无状态特性使其能够扩展和分布式部署,适合构建可伸缩的系统。

  • 前后端分离:REST与前端开发常常结合使用,可以实现前后端的解耦和并行开发。

最后

    在企业里面一般rpc用于服务与服务之间的通讯比较多,比如openfegin这种,但是rest主要是基于资源的解决方案,类似c++或python要去调用java或之间互相通讯,那么这种跨语言跨平台一般考虑场景就是通过rest的方式实现。当然大部分rpc也实现得了,因为大部分是通过http协议来通讯的,只要这个rpc支持就可以了。

参考文章:

https://baike.baidu.com/item/%E8%BF%9C%E7%A8%8B%E8%BF%87%E7%A8%8B%E8%B0%83%E7%94%A8/7854346?fromtitle=RPC&fromid=609861&fr=aladdin

https://baike.baidu.com/item/RPC%E6%9C%8D%E5%8A%A1%E5%99%A8/617414?fr=ge_ala

https://baike.baidu.com/item/rest/6330506?fr=ge_ala

http://www.lryc.cn/news/105354.html

相关文章:

  • 时间复杂度介绍及其计算
  • etcd实现大规模服务治理应用实战
  • 目标检测中 anchor base和anchor free
  • TypeC拓展设计方案|TypeC转HDMI设计方案|CS5261/CS5265芯片设计参数对比
  • SQL Developer中的Active Data Guard
  • 谈谈FFT到底有何用
  • MATLAB | 如何绘制这样的描边散点图?
  • 偶数科技与白鲸开源完成兼容性认证
  • 【机器学习】Feature scaling and Learning Rate (Multi-variable)
  • windows编译ncnn
  • C++和Lua交互总结
  • nvm安装和切换node版本
  • 每日一题8.2 2536
  • 适配器模式(Adapter)
  • Spring学习笔记——1
  • leetcode 406. 根据身高重建队列
  • Matlab实现AGNES算法
  • STM32F4_外部SRAM
  • Java的代理模式
  • FilterAttributeOnClassMethod
  • springboot + (mysql/pgsql) + jpa 多数据源(不同类数据源)
  • 【Golang】Golang进阶系列教程--Go 语言 context 都能做什么?
  • 画图干货!14种uml图类型及示例
  • 计算机视觉实验:人脸识别系统设计
  • 振弦采集仪完整链条的岩土工程隧道安全监测
  • NLP实战9:Transformer实战-单词预测
  • 使用Vue.js和Rust构建高性能的物联网应用
  • idea调节文字大小、日志颜色、git改动信息
  • 避免大龄程序员边缘化:如何在技术行业中保持竞争力
  • Jenkins工具系列 —— 启动 Jenkins 服务报错