背景
好多开发的同学在工作中,经常分不清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