在进行系统设计与技术选型时,“RPC好,还是RESTful好?”这个问题常常让开发者陷入思考。要回答它,首先需要理解两者的根本区别。RPC(远程过程调用)服务主要基于TCP/IP协议,而HTTP服务(我们常说的RESTful风格)则基于HTTP协议。我们都知道,HTTP协议是构建在传输层TCP协议之上的应用层协议。因此,从效率角度看,RPC通常更胜一筹。接下来,让我们深入探讨一下RPC服务和HTTP服务各自的特点。
OSI网络七层模型
在具体分析差异之前,有必要回顾一下OSI七层网络模型(实际应用中常简化为五层)。它从上到下依次为:
- 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口。
- 第二层:表示层。定义不同系统中数据的传输格式、编码和解码规范等。
- 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断。
- 第四层:传输层。管理着网络中的端到端的数据传输。
- 第五层:网络层。定义网络设备间如何传输数据。
- 第六层:链路层。将网络层的数据包封装成数据帧,便于物理层传输。
- 第七层:物理层。负责传输二进制数据流。
在实际的五层协议结构中,表示层和会话层通常与应用层合并。对于理解RPC和HTTP,我们需要重点关注应用层和传输层。HTTP是应用层协议,TCP是传输层协议。了解这个分层模型后,我们能更好地理解为何RPC服务在一些场景下比HTTP服务更具优势。

RPC服务
我们可以从三个维度来认识RPC服务:架构、调用方式以及主流框架。
RPC架构
一个典型的RPC架构包含四个核心组件:Client(客户端)、Server(服务端)、Client Stub(客户端存根)以及Server Stub(服务端存根)。
- 客户端:服务的调用方。
- 服务端:真正的服务提供者。
- 客户端存根:存放服务端的地址信息,将客户端的请求参数打包成网络消息,并通过网络传输远程发送给服务端。
- 服务端存根:接收客户端发送来的消息,将其解包,并调用本地方法。
RPC常见于大型企业内部,这类环境系统繁杂、业务线交织,对效率的要求极高,此时RPC的优势便得以凸显。在实际开发中,通常使用Maven管理项目。例如,我们有一个订单处理系统服务,先声明其所有接口(Java中的Interface),然后将整个项目打包为一个二方库(jar包)。服务端引入此二方库并实现功能,客户端同样只需引入该库即可调用。这样做主要是为了减少客户端jar包体积,因为打包发布时过多的依赖会影响效率;同时也实现了客户端与服务端的解耦,提升了代码的可移植性。

同步调用与异步调用
RPC支持同步与异步两种调用模式。
- 同步调用:客户端发起调用后,会阻塞等待执行完成并返回结果。
- 异步调用:客户端发起调用后不等待结果返回,继续执行后续逻辑,但可通过回调函数等方式接收结果通知。如果客户端完全不关心结果,甚至可以发起单向调用。
这个过程类似于Java中的Callable和Runnable接口。当我们需要异步执行并获取结果时,可以使用Callable接口,并通过Future对象获取结果。如果只关心执行过程而不需要结果,则使用Runnable接口(当然,使用Callable但不获取Future也是可以的)。
流行的RPC框架
目前主流的开源RPC框架有很多,这里重点介绍三个:
- gRPC:Google开源的高性能框架,基于最新的HTTP/2.0协议,支持多种编程语言。HTTP/2.0是HTTP协议的二进制升级版本。gRPC底层使用Netty框架支持,充分利用了HTTP/2的多路复用等特性。
- Thrift:Facebook开源的跨语言服务开发框架。它通过IDL(接口定义语言)定义服务,并由代码生成器自动生成服务端和客户端代码框架。开发者只需进行业务逻辑的二次开发,底层RPC通信对开发者透明。但学习其特定的IDL有一定成本。
- Dubbo:阿里巴巴开源的一款极为知名的RPC框架,在众多互联网公司和企业应用中广泛使用。其鲜明的特色是协议和序列化框架的可插拔性。同样基于Java Interface定义远程接口,并能很好地与Spring框架集成,方便开发部署,符合当前微服务理念。
HTTP服务
在很长一段时间里,企业开发模式常被定性为基于HTTP接口的开发,也就是我们常说的RESTful风格服务接口。
的确,在系统间接口不多、交互较少的情况下,使用HTTP是一种简单直接的通信手段,能有效解决信息孤岛问题。其优点是开发简单、直观,直接利用现成的HTTP协议进行传输。许多后台开发工作就是围绕接口展开的,需要编写详细的接口文档,明确每个接口的请求方法、输入参数和返回格式。
例如:
POST http://www.httpexample.com/restful/buyer/info/share
接口通常返回JSON或XML格式的数据,由客户端进行解析和处理,这种模式能实现快速开发迭代。
然而,对于内部子系统众多、接口调用频繁的大型企业而言,RPC框架的优势就显现出来了。首先,RPC通常使用长连接,避免了HTTP每次通信所需的多次握手,显著减少了网络开销。其次,成熟的RPC框架一般配有注册中心,提供服务发现、丰富的监控管理、接口动态发布与下线、以及动态扩展能力,这些操作对调用方来说是无感知且统一的。

总结
RPC服务和HTTP服务存在诸多差异。一般来说,RPC更适用于对性能、内部治理有较高要求的大型企业或复杂分布式系统;而HTTP服务凭借其简单、通用、易于理解和调试的特点,在中小型项目或对外公开API的场景中开发迭代更快。
最终,技术选型不应盲目追随市场潮流,而应基于项目的完整评估。需要仔细权衡两种技术框架对项目整体(包括开发效率、运维成本、性能要求、团队技能等)的影响,从而选择最合适的方案。切记不要为了使用RPC而使用RPC,因地制宜、具体问题具体分析才是明智之举。希望这篇对比能帮助你在云栈社区未来的架构设计中做出更清晰的选择。