找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2813

积分

0

好友

389

主题
发表于 昨天 11:27 | 查看: 0| 回复: 0

关于Spring Cloud远程调用采用HTTP而非RPC的讨论,一直是微服务架构领域的一个经典面试题和设计考量点。这背后涉及到协议特性、开发便利性以及架构灵活性的综合权衡。

  1. 基于现有生态与跨平台需求:Spring Cloud构建的Web服务通常依赖于内嵌的Tomcat等Servlet容器。这些容器天然处理HTTP请求。在信息飞速发展的今天,为了适应大流量的微服务场景,采用HTTP协议并以JSON作为数据传输格式,能够更灵活地处理多样化的业务数据。更重要的是,HTTP协议是跨平台的,它完美契合了微服务中后端与前端(Browser/Client)的数据交互模式。一套基于HTTP RESTful API的后端服务,可以同时为Web H5、移动App、小程序等多种客户端提供服务,极大地提升了服务的通用性和复用性。

  2. 协议层级的差异与灵活性:RPC(如基于TCP的定制协议)在通信前需要客户端与服务端进行三次握手以建立可靠的连接,之后再进行数据传输。由于TCP是传输层协议,其之上的应用层传输协议需要服务端和客户端统一约定,通常采用二进制格式传输,高度依赖特定的序列化与反序列化规则。这对于业务数据格式需要频繁变动的应用场景来说,可能不够灵活。RPC更常用于Socket长连接或数据传输格式基本固定的场景,以减少因数据格式变动带来的开发和适配成本。

    建立Socket连接至少需要一对套接字,一个运行于客户端(ClientSocket),另一个运行于服务器端(ServerSocket)。连接过程分为三个步骤:服务器监听、客户端请求和连接确认。

一个简单的HTTP请求处理

在Web应用中,浏览器请求一个URL,服务器将生成的HTML网页发送给浏览器,浏览器和服务器之间的传输协议就是HTTP。那么,一个简单的HTTP服务器是如何工作的呢?

HTTP请求处理流程示意图

RPC (远程过程调用)

RPC (Remote Procedure Call) 是一种进程间通信方式,是一种技术思想而非具体规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而程序员无需显式编码远程调用的细节。这意味着,无论调用本地还是远程函数,程序员编写的调用代码在形式上基本相同。

通俗地说:假设有两台服务器A和B,一个应用部署在A上,另一个部署在B上。如果A应用想要调用B应用提供的函数/方法,由于它们不在同一台机器(即不在同一个JVM内存空间),无法直接调用,必须通过网络来进行。这个通过网络进行的调用过程就是RPC。

RPC通信架构示意图

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生态中如何整合这些技术栈。

mall-swarm微服务商城系统整体架构图

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




上一篇:Moltbot接入企业微信/QQ/钉钉/飞书:腾讯云Lighthouse部署指南
下一篇:JustGRPO提升扩散语言模型推理能力:回归自回归顺序的极简训练法
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-1 01:28 , Processed in 0.281782 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表