RPC 与 Restful 的区别
PRC 是一种技术的代名词,HTTP 是一种协议,RPC 可以通过 HTTP 来实现,也可以通过 Socket 自己实现一套协议来实现。所以谈论为什么用 RPC 不用 HTTP 是无意义的。但我们习惯性将两者进行比较,那就有必要将易混点提出来说说。
RPC主要是基于 TCP/IP协议的,而 HTTP服务主要是基于 HTTP协议的,我们都知道 HTTP协议是在传输层协议 TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说 RPC服务和 HTTP服务。
OSI 网络七层模型
在说 RPC和 HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下)
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输;
第五层:网络层。定义网络设备间如何传输数据;
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据;
实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面。因为 HTTP是应用层协议,而 TCP是传输层协议。
RPC架构
RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用)。自定义数据格式,基于原生TCP通信,速度快,效率高。 缺点是当使用 RPC框架实现服务间调用的时候,要求服务提供方和服务消费方都必须使用统一的 RPC框架,要么都dubbo,要么都cxf。跨操作系统在同一编程语言内使用。
一个完整的 RPC架构里面包含了四个核心的组件,分别是Client 、Server、Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:
【1】客户端(Client),服务的调用方;
【2】服务端(Server),真正的服务提供者;
【3】客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方;
【4】服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法;
传统的 RPC是基于二进制的。因此RPC主要是用在大型企业里面,因为大型企业里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候 RPC的优势就比较明显了。RPC框架要做到的最基本的三件事:
【1】服务端如何确定客户端要调用的函数:在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
【2】如何进行序列化和反序列化:客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。
【3】如何进行网络传输(选择何种网络协议):多数 RPC框架选择 TCP作为传输协议,也有部分选择 HTTP。如 gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而 HTTP在实际应用中更加的灵活。
HTTP服务
HTTP其实是一种网络传输协议,现在客户端浏览器与服务端通信基本都是采用 Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。优势是无需关注服务提供方使用的编程语言,也无需关注服务消费方使用的编程语言,服务提供方只需要提供RESTful风格的接口,服务消费方,按照 RESTful的原则,请求服务,即可。跨系统跨编程语言的远程调用框架。通用性强。REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。RESTful规范把所有内容都视为资源,网络上一切皆资源。REST并没有创造新的技术,组件或服务,只是使用 Web的现有特征和能力。 可以完全通过 HTTP协议实现,使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应 HTTP协议提供的GET、POST、PUT和 DELETE方法。
其实在很久以前,我对于企业开发的模式一直定性为 HTTP接口开发,也就是我们常说的 RESTful风格的服务接口。的确,在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的 Http协议进行传输。
接口可能返回一个 JSON字符串或者是 XML文档。然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。但是对于大型企业来说,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像 HTTP一样去3次握手什么的,减少了网络开销;其次就是 RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
如何选择
既然两种方式都可以实现远程调用,我们该如何选择呢?
【1】速度来看,RPC要比 HTTP更快,虽然底层都是TCP,但是 HTTP协议的信息往往比较臃肿。
【2】难度来看,RPC实现较为复杂,HTTP相对比较简单。
【3】灵活性来看,HTTP更胜一筹,因为它不关心实现细节,跨平台、跨语言。
因此,两者都有不同的使用场景:
【1】如果对效率要求更高,并且开发过程使用统一的技术栈,那么用 RPC还是不错的。
【2】如果需要更加灵活,跨语言、跨平台,显然 HTTP更合适。
微服务,更加强调的是独立、自治、灵活。而 RPC方式的限制较多,因此微服务框架中,一般都会采用基于 HTTP的RESTful风格服务。
总结
【相同点】:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务。
【不同点】:RPC服务和 HTTP服务还是存在很多的不同点的,一般来说,RPC服务主要是针对大型企业的,而 HTTP服务主要是针对小企业的,因为 RPC效率更高,而 HTTP服务开发迭代会更快。要对整个项目进行完整地评估,从而在仔细比较两种开发框架对于整个项目的影响,最后再决定什么才是最适合这个项目的。RESTful 调用及测试都很方便,RPC就显得有点繁琐,但是 RPC的效率是毋庸置疑的,所以建议在多系统之间的内部调用采用RPC,对外提供的服务RESTful 更加合适。IO 密集的服务调用用 RPC,低频服务用 RESTful(效率层面)。用更少的请求字节数来达到通信的目的,它主要用于分布式架构中应用与应用的交互。Restful基于Http应用层协议而 Http协议基于 Tcp协议,它遵守了 Http协议,当然它的请求字节数就大,它面向的是资源,通过对资源的Get/Post等实现前后端的交互。
| 比较项 | RESTful | RPC |
| 通信协议 | HTTP | 一般 TCP |
| 灵活度 | 高 | 低 |
| 效率 | 低 | 高 |
RPC 与 Restful 的区别的更多相关文章
- RESTful源码学习笔记之RPC和 RESTful 什么区别
REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...
- rmi rpc restful soa 区别
rmi rpc restful soa 区别 rmi vs rpc 参考文档:http://stackoverflow.com/questions/2728495/what-is-the-differ ...
- RPC的解释以及RPC和Restful、RPC和RMI的区别
如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...
- SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系
SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...
- RPC和RMI的区别(Difference Between RPC and RMI)
RPC和RMI的区别(Difference Between RPC and RMI) RPC vs RMI RPC (Remote Procedure Call) and RMI (Remote Me ...
- RPC vs RESTful
在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: (binary) RPC or Restful. 以Apache Thrift为代表的二进制RPC,支持多种 ...
- CoAP、MQTT、RESTful协议区别
/********************************************************************** * CoAP.MQTT.RESTful协议区别 * 说明 ...
- RPC与RMI的区别
分布式项目按照以下发展经历了以下技术: CORBA: RMI:基于远程接口的调用 RMI-RROP:这是RMI与CORBA的结合,用在了EJB技术上,EJB留给世界上是优秀的理论和糟糕的架构. WEB ...
- RPC和WebService的区别
最近分析的这个系统,逻辑架构中有一层是RPC interface.之前对RPC不熟悉,就上网搜索了一下资料,在此总结一下: RPC是Remote Procedure Calling,远程过程调用的缩写 ...
- GraphQL和RESTful的区别
GraphQL和RESTful的区别 http://graphql.cn/learn/ https://www.cnblogs.com/Wolfmanlq/p/9094418.html http:// ...
随机推荐
- Django 介绍及环境准备
Django介绍: Django(发音:[`dʒæŋɡəʊ])是基于Python的Web框架,它是开源的,免费的. Django使构建更好的web应用程序变得更容易.更快.代码更少 django的MT ...
- Selenium+Python上传文件方法大全
转自:https://www.jianshu.com/p/fba37cc5d5e2
- C和C++内存分配语法补充
NOTE: 动态内存分配:需要加载头文件<stdlib.h>malloc(m):开辟m字节长度的地址空间,并返回首地址sizeof(x):计算变量x的长度free(p):释放指针p所指的存 ...
- 132pattern-Leetcode456
QUESTION: To search for a subsequence (s1,s2,s3) such that s1 < s3 < s2. INTUITION: Suppose we ...
- SQL之查询
1. SQL之模糊查询 例如查询姓名时,不用输入全名,仅仅输入其中的一部分 语法: select 列名 from 表名 where 列名 like 匹配串 其中 匹配串用英文的单引号括起来 四种匹配模 ...
- uart 理解
1: 串口字符串传输和单字节传输的差异体现在字节与字节间是或在停止位后有空闲位的插入(下图红箭头处,没有插入),即 uart_send("123") 和 uart_send('1 ...
- 三,打包electron
1,在当前项目下运行 npm install --save-dev @electron-forge/cli npx electron-forge import 此时package.json内容如下: ...
- django rest 自定义返回数据接口和异常处理
参考 Django rest framework自定义返回数据格式 一.简介 drf 默认返回的异常格式是这样的 1 { 2 "username": [ 3 "该字段是必 ...
- echarts 图表动态刷新数据
需求:每次重新加载数据,图表柱状图从零开始加载 用 myChart.clear(); 这个方式解决. 在setOption 之前用 示例: myChart.clear(); myChart.setOp ...
- 十大经典排序之归并排序(C++实现)
归并排序 思路:(分而治之的思想) 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置: 3.比较两个指针所指向的元 ...