关于Spring Cloud远程调用采用HTTP而非RPC的讨论,一直是微服务架构领域的一个经典面试题和设计考量点。这背后涉及到协议特性、开发便利性以及架构灵活性的综合权衡。
-
基于现有生态与跨平台需求:Spring Cloud构建的Web服务通常依赖于内嵌的Tomcat等Servlet容器。这些容器天然处理HTTP请求。在信息飞速发展的今天,为了适应大流量的微服务场景,采用HTTP协议并以JSON作为数据传输格式,能够更灵活地处理多样化的业务数据。更重要的是,HTTP协议是跨平台的,它完美契合了微服务中后端与前端(Browser/Client)的数据交互模式。一套基于HTTP RESTful API的后端服务,可以同时为Web H5、移动App、小程序等多种客户端提供服务,极大地提升了服务的通用性和复用性。
-
协议层级的差异与灵活性:RPC(如基于TCP的定制协议)在通信前需要客户端与服务端进行三次握手以建立可靠的连接,之后再进行数据传输。由于TCP是传输层协议,其之上的应用层传输协议需要服务端和客户端统一约定,通常采用二进制格式传输,高度依赖特定的序列化与反序列化规则。这对于业务数据格式需要频繁变动的应用场景来说,可能不够灵活。RPC更常用于Socket长连接或数据传输格式基本固定的场景,以减少因数据格式变动带来的开发和适配成本。
建立Socket连接至少需要一对套接字,一个运行于客户端(ClientSocket),另一个运行于服务器端(ServerSocket)。连接过程分为三个步骤:服务器监听、客户端请求和连接确认。
一个简单的HTTP请求处理
在Web应用中,浏览器请求一个URL,服务器将生成的HTML网页发送给浏览器,浏览器和服务器之间的传输协议就是HTTP。那么,一个简单的HTTP服务器是如何工作的呢?

RPC (远程过程调用)
RPC (Remote Procedure Call) 是一种进程间通信方式,是一种技术思想而非具体规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而程序员无需显式编码远程调用的细节。这意味着,无论调用本地还是远程函数,程序员编写的调用代码在形式上基本相同。
通俗地说:假设有两台服务器A和B,一个应用部署在A上,另一个部署在B上。如果A应用想要调用B应用提供的函数/方法,由于它们不在同一台机器(即不在同一个JVM内存空间),无法直接调用,必须通过网络来进行。这个通过网络进行的调用过程就是RPC。


RPC框架有两个核心模块:通信 和 序列化。
注意:无论何种类型的数据,最终都需要被序列化成二进制流才能在网络上传输。数据的发送方需要将对象序列化为二进制流,而接收方则需要将二进制流反序列化为对象。
RESTful (基于HTTP)
RESTful 指的是一组架构约束条件和原则。如果一个架构符合RESTful的约束条件和原则,就称它为RESTful架构。其背后的理念是充分利用Web的现有特征和能力,遵循现有Web标准中的准则和约束。
虽然RESTful深受Web技术影响,但理论上RESTful架构风格并不绑定在HTTP上。只不过,目前HTTP是唯一与RESTful相关的、广泛使用的实例。因此,我们通常所说的RESTful,就是指通过HTTP实现的RESTful。
RPC 与 HTTP 的区别
两者在形式上非常相似,都是有请求有响应的通信模式。
核心不同点:
- RPC的目标是让调用远程服务像调用本地服务一样透明,因此在API层面对调用过程进行了高度封装,隐藏了网络通信细节。
- HTTP协议本身没有这种“透明化”的要求,请求的构建、发送、响应的解析等网络通信细节,需要开发者自己或借助库来实现。
优点对比:
- RPC:对开发者更加透明、方便,调用体验好。
- HTTP:更加灵活,不绑定特定的API设计风格和编程语言,天生支持跨语言、跨平台。
缺点对比:
- RPC:由于需要在API层面进行深度封装,通常会对服务端和客户端的开发语言环境有一定限制(虽然现代RPC框架如gRPC支持多语言,但仍有约束)。
如何选择:
- 性能方面:RPC通常比HTTP更快。虽然底层都是TCP,但HTTP消息头通常比较臃肿(尽管可以使用gzip压缩body),而RPC可以采用更精简的二进制协议。
- 实现难度:一个功能完整的RPC框架实现起来较为复杂;而基于HTTP构建服务相对简单,有大量成熟库和工具。
- 灵活性:HTTP更灵活,开发者不关心服务端具体实现技术,可以轻松实现跨平台、跨语言的交互,这在异构系统集成中优势明显。
未来发展方向:
- 微服务架构强调服务的独立、自治和灵活性。RPC在某些方面的限制相对较多,因此,在Spring Cloud等主流微服务框架中,普遍采用基于HTTP的REST风格服务作为服务间通信的基础,这更符合微服务的设计理念。
如果你想深入实践微服务架构,可以参考一些优秀的开源项目。例如,mall-swarm 就是一个采用了 Spring Cloud Alibaba、Spring Boot 3、Docker 与 Kubernetes 等核心技术的微服务商城系统。通过研究其架构,可以更好地理解在Java生态中如何整合这些技术栈。

对微服务架构和分布式系统有更多疑问或想分享经验?欢迎来 云栈社区 与更多开发者交流探讨。
|