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 ServerClient 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 的区别的更多相关文章

  1. RESTful源码学习笔记之RPC和 RESTful 什么区别

    REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...

  2. rmi rpc restful soa 区别

    rmi rpc restful soa 区别 rmi vs rpc 参考文档:http://stackoverflow.com/questions/2728495/what-is-the-differ ...

  3. RPC的解释以及RPC和Restful、RPC和RMI的区别

    如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...

  4. SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系

    SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...

  5. 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 ...

  6. RPC vs RESTful

    在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: (binary) RPC or Restful. 以Apache Thrift为代表的二进制RPC,支持多种 ...

  7. CoAP、MQTT、RESTful协议区别

    /********************************************************************** * CoAP.MQTT.RESTful协议区别 * 说明 ...

  8. RPC与RMI的区别

    分布式项目按照以下发展经历了以下技术: CORBA: RMI:基于远程接口的调用 RMI-RROP:这是RMI与CORBA的结合,用在了EJB技术上,EJB留给世界上是优秀的理论和糟糕的架构. WEB ...

  9. RPC和WebService的区别

    最近分析的这个系统,逻辑架构中有一层是RPC interface.之前对RPC不熟悉,就上网搜索了一下资料,在此总结一下: RPC是Remote Procedure Calling,远程过程调用的缩写 ...

  10. GraphQL和RESTful的区别

    GraphQL和RESTful的区别 http://graphql.cn/learn/ https://www.cnblogs.com/Wolfmanlq/p/9094418.html http:// ...

随机推荐

  1. ASP.NET Core 5.0之默认主机Host.CreateDefaultBuilder

    通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程序配 ...

  2. 模态框拖拽案例分析--元素偏移量 offset 系列

    弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...

  3. 前端面试问题整理(html和css部分)

    html5新增属性有哪些? 如何理解语义化标签? 你如何看待前端模块化的? 如何看待前后端分离? 浏览器兼容性问题? 你知道的行内元素.块级元素有哪些? css部分: 1.为什么要初始化css样式? ...

  4. 关于CSS3中的min-height等的使用

    一.min-height 当我们需要让某个容器不能低于某个高度,但是不能将高度固定在这个高度,希望其能够随着容器内内容的增多而变高时,我们可以对容器设置一个min-height来让该容器获得该特性.( ...

  5. MarkDown初次见面——

    Markdown基础语法 分级标题 n级标题就在前面加n个#即可,但是仅支持到六级标题. 字体 柔骨兔 字体倾斜:左右两边加1个* 柔骨兔 字体加粗:左右两边各自添加2个* 柔骨兔 倾斜加粗:左右两边 ...

  6. c# 串口 转发到 TCP 客户端

    前言 对于数据流Stream的转发.在.net 3.5之后的版本只需要 stream.CopyTo(stream). 目前只是为了方便调用测试,花了一点点时间做了一个简单的调用demo 完整代码 us ...

  7. vue 项目打包 遇到问题 npm run build 无法打包

    npm run build 打包 直接报错!!! 发现package.json中build的打包后边多了一个:prod 因此打包直接使用  npm run build:prod

  8. Vue2路由跳转传参,获取路由参数,Vue监听路由

    1 this.$router.push({ 2 // name:路由组件名 3 name: routeName, 4 query: { 5 mapId:this.mapId 6 } 7 }) 8 9 ...

  9. vue组件传参,父子组件以及兄弟组件(非常详细)

    一,父子组件传参. 1.首先在项目目录中新建template文件夹,里边包含父组件:List.vue以及子组件:firstComponent.vue,secondComponent.vue. 2.父组 ...

  10. Java基础面试笔试大汇总

    1面向对象的特征有哪些方面? 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象. 继承:继承就是从已有的类得到继承信息创建新类的过程 封装:封装就是把数据和操作数据的方法绑 ...