RPC与REST对比指南

简介: 【5月更文挑战第19天】使用RPC可以得到很轻的载荷、传输较轻、速度快、协议层少、转换快,但是会产生依赖性,做不到平台无关性,在安全性上较差。使用REST风格,则具备平台无关性、高安全性和独立性。

RPC可以有很多种,比较流行的是Alibaba贡献的Apache Dubbo、Facebook贡献的Apache Thrift和Google的gRPC。实际上,不同RPC框架的底层协议和实现,会有一定的差异,但是也是类同的。为了进一步讨论RPC。


Thrift是一种接口描述语言和二进制通信协议,用于定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是Facebook为“大规模跨语言服务”开发的。Thrift服务在实际应用中分为4层,分别是服务器层(server)、处理器层(processor)、数据协议层(protocal)和传输层(transport),它们的作用如下。

  • 服务器层:它提供一个关于Thrift的服务器,客户端可以连接它,它会实现一个线程池,来管理这些客户端连接。
  • 处理器层:处理器是由开发者根据自己业务的需要实现的业务逻辑代码。
  • 数据协议层:指定数据采用何种编码协议进行传输,然后客户端也可以按照该协议进行解码解析,还原数据。在Thrift中可以使用二进制,这样传输的数据就会大大减少,从而提高传输的速度。当然也可以使用JSON类型的数据协议,这样会使得开发者更容易理解。
  • 传输层:可以用Socket、按帧、压缩(zlib)等协议进行传输。


其中服务层、数据协议层和传输层,Thrift都已经提供了良好的封装类,我们只需要告诉Thrift服务器选择便可以了。而处理器层则是开发所需的业务逻辑代码,需要自行开发。Thrift的服务调用并不是很复杂。


首先,服务提供者按照Thrift的要求提供4层结构,然后暴露对应的服务端口。其次,服务消费者会连接服务提供的Thrift服务器,获取它暴露的接口的存根(stub),然后通过存根执行远程调用。这里谈到的存根是一个接口,它会屏蔽内部实现的细节,从而提高代码可读性,降低开发者使用的困难。


从Thrift来看,可以说,RPC和REST风格服务调用在性能上相差是很大的,究其原因主要是以下3点:

  • RPC不单可以使用HTTP协议,也可以使用其他协议,如TCP、UDP等,而REST风格只能使用HTTP协议。
  • RPC需要传递的净荷(payload)小,一般是REST风格的20%左右。而REST传输的内容越多,需要的带宽越大、时间也越长,对系统性能不利,因此RPC的性能更优。
  • RPC一般层级较少,而REST风格则需要更多的层结构,这意味着,在转换和传输的性能上,RPC将大大超过REST风格的调用。


注意,以上3点只是针对性能来说的。但在分布式(微服务)中,追求的不仅仅是性能,在大部分的情况下,如果不会出现较为严重的性能瓶颈,还是推荐使用REST风格,因为REST风格比起RPC,至少有以下3种优势:

  • 平台无关性:在RPC中,可用协议很多,传输的数据也可以使用不同的规则(如Java的序列化数据流),这样就使得它只能适应某些平台。而REST风格使用HTTP协议,只要约定采用某种数据格式,如JSON,就具备平台无关性的特点。
  • 安全性:REST风格遵循的协议多,可以通过防火墙、网关等进行拦截,这样可以降低恶意攻击的可能性。而RPC则不具备这样的功能。
  • 独立性:采用REST风格后,当前的服务是一个相对独立的服务,对于服务消费者来说,不依赖服务提供者的接口和类。而使用RPC,则需要服务提供者暴露对应的接口服务进行调用,因此耦合性较高,独立性较差。


从上面可以看出,使用RPC可以得到很轻的载荷、传输较轻、速度快、协议层少、转换快,但是会产生依赖性,做不到平台无关性,在安全性上较差。使用REST风格,则具备平台无关性、高安全性和独立性。从程序开发的角度来说,使用REST风格时,可以把服务提供者看成一个独立的产品,它更容易使用和扩展,依赖性更低,这有利于应用的复用和扩展,可读性也高。如果性能不会遇到严重瓶颈,那么作为开发者,应该先考虑可读性,这就是为什么微服务推荐使用REST风格调用,而非RPC的原因。对于那些需要高性能、高并发的服务,在某些情况下,也可以考虑牺牲REST风格的优点去使用RPC,以满足性能的需要,所以在使用RPC的时候,需要考虑其适用的场景。

相关文章
|
SQL 存储 缓存
了解API相关范式(RPC、REST、GraphQL)
了解API相关范式(RPC、REST、GraphQL) 前言 两个独立的应用程序经常需要相互访问交谈,或则可以是同一个应用程序,但部署在不同的服务器,或者现在常用的前后端分离式架构等等需要经常相互访问交谈,因此开发人员经常搭建桥梁API(Application Programming Interfaces) 关于API的定义,你可以简单看看这篇文章-- What is an API: Definition, Types, Specifications, Documentation
246 0
|
网络架构
ElasticSearch Rest/RPC 接口解析
ElasticSearch 的体系结构比较复杂,层次也比较深,源码注释相比其他的开源项目要少。这是ElasticSearch 系列的第一篇。解析ElasticSearch的接口层,也就是Rest/RPC接口相关。我们会描述一个请求从http接口到最后被处理都经过了哪些环节。
4198 0
|
Java 数据格式 网络架构
主流RPC框架详解,以及与SOA、REST的区别
什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
1639 0
|
存储 网络架构 数据处理
REST 和RPC的区别
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/8263717 RPC(Rem...
836 0
|
网络架构
Rest协议框架-bboss rpc
restful风格rpc服务协议rest,定义的语法如下: (rest::a/b/c/d)/rpc.test 协议头:rest 节点路由组:a/b/c/d,以/分割的服务器路由节点列表,执行顺序由左到右 服务id:rpc.test,配置在aop框架中的一般业务组件 Rest协议服务调用示意图如下: 系统将逐步解析a/b/c这三个节点的地址: a,b,c分别代表远程服务器地址 系统根据a,b,c的顺序来路由远程服务调用,首先将远程请求发送到a服务器,然后由a路由到b服务器,再由b路由到c服务器 当c处理完请求后再将结果返回给b,b再返回给a。
1102 0
|
7月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
301 0
|
1月前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
4月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
3月前
|
XML 负载均衡 监控
分布式-dubbo-简易版的RPC框架
分布式-dubbo-简易版的RPC框架