美团一面:Spring Cloud 远程调用为啥要采用 HTTP,而不是 RPC?
作者:简简单单神经蛙
来源:blog.csdn.net/m0_61878423/article/details/124607067
关于SpringCloud远程调用采用HTTP而非RPC。
1、首先SpringCloud开启Web服务依赖于内部封装的Tomcat容器,而今信息飞速发展,适应大流量的微服务,采用Tomcat处理HTTP请求,开发者编写Json作为资源传输,服务器做出相应的响应,可以更加的灵活处理业务数据,而HTTP协议是跨平台的,符合微服务B/C数据交互的方式,可以的一套服务器对应移动H5、App、小程序提供服务。
2、RPC基于TCP协议,客服端与服务端需要进行三次握手完成可靠连接,第四步进行数据传输。因为TCP是数据传输层,传输协议需要服务器统一编写,进行二进制传输,依赖序列化和反序列化规则,对于大部分应用需要灵活变动数据则不适用,RPC常用于Socket连接或一些基本不变动的传输格式数据,减少数据变动带来的开发成本
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket ,套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
一个简单HTTP请求处理
在Web应用中,浏览器请求一个URL,服务器就把生成的HTML网页发送给浏览器,而浏览器和服务器之间的传输协议是HTTP,那么接下来我们看下如何用Java来实现一个简单的HTTP服务器。
RPC
RPC(Remote Procedure Call:远程过程调用):是一种进程间通信方式,是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
通俗的说法就是:比如说现在有两台服务器A和B,一个应用部署在A服务器上,另一个应用部署在B服务器上,如果A应用想要调用B应用提供的方法,由于他们不在一台机器下,也就是说它们不在一个JVM内存空间中,是无法直接调用的,需要通过网络进行调用,那这个调用过程就叫做RPC。
RPC两个核心模块:通讯,序列化。
注意:无论是何种类型的数据,最终都需要序列化转换成二进制流在网络上进行传输,数据的发送方需要将对象序列化转换为二进制流,而数据的接收方则需要把二进制流反序列化为对象。
Restful(HTTP)
Restful 指的是一组架构约束条件和原则。" 如果一个架构符合 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速度比HTTP快,底层都是TCP,HTTP消息往往比较臃肿,但是可以采用gzip压缩。
- 难度方面:RPC实现有点儿复杂,HTTP相对比较简单。
- 灵活性方面:HTTP更灵活,不需要关系实现的细节,可以跨平台,跨语言。
未来发展方向
- 微服务,强调独立,自治,灵活。RPC限制较多,因此微服务框架中,一般都会采用基于HTTP的rest风格服务。
更多文章推荐:
2.2,000+ 道 Java面试题及答案整理(2024最新版)
3.免费获取 IDEA 激活码的 7 种方式(2024最新版)
觉得不错,别忘了随手点赞+转发哦!