浅谈RPC与Http

什么是RPC,RPC原理是什么?

什么是RPC?

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务A、B部署在两台不同的机器上,那么服务A如果想要嗲用服务B中的某个方法该怎么办呢?使用Http请求当然可以,但是可能会比较慢而且一些优化做的并不好。RPC的出现就是为了解决这个问题。

RPC原理是什么?

 

1、服务消费方(client)调用以本地调用方式调用服务;

2、client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3、client stub找不到服务地址,并将消息发送到服务端;

4、server stub收到消息后进行解码;

5、server stub根据解码结果调用本地的服务;

6、本地服务执行并将结果返回给server stub;

7、server stub将返回结果打包成消息并发送至消费方;

8、client stub接收到消息,并进行解码;

9、服务消费方得到最终结果。

时序图如下:

 

 RPC解决了什么问题?

从上面对RPC介绍的内容中,概括来讲,RPC主要解决了:让分布式或者微服务系统中不同服务之间像本地调用一样简单。

常见的RPC框架总结

RMI(JDK自带):JDK自带的RPC,有很多局限性,不推荐使用。

Dubbo:Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成,目前Dubbo已经成为Spring Cloud Alibaba中的官方组件。

gRPC:gRPC是可以在任何环境中运行的现代开源高性能RPC框架,他可以通过插拔的支持来有效的链接数据中心内和跨数据中心的服务,以实现负载均衡,跟踪,运行情况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。

Hessian:Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

Thrift:Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

既然有Http,为啥用RPC进行服务调用?

RPC只是一种设计而已

RPC只是一种概念,一种设计,就是为了解决不同服务之间的调用问题,它一般会包含传输协议和序列化协议这两个。

实现RPC的可以传输协议可以直接建立在TCP之上,也可以建立在HTTP协议之上,大部分RPC框架都是使用的TCP链接(gRPC使用了HTTP2).

Http和TCP

可能现在很多对计算机网络不太熟悉的朋友已经被搞蒙了,要想真正搞懂,还需要简单复习一下计算机网络基础知识:

我们通常说的计算机网络的五层协议的体系结构是指:应用层、传输层、网络层、数据链路层、物理层。

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。Http属于应用层协议,他会基于TCP/IP通信协议来传输数据(Html文件、图片、查询结果等)。Http协议工作于客户端-服务端框架之上。浏览器作为Http客户端通过URL向Http服务端即Web服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息,Http协议建立在TCP协议之上。

传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。TCP是传输层协议,主要解决数据如何在网络中传输。相比于UDP、TCP提供的是面向链接的、可靠的数据传输服务。

主要关键就在于Http使用的TCP协议,和我们自定义的TCP协议在报文上的区别。

http1.1协议的TCP报文包含太多在传输过程中可能无用的信息:

 

 使用自定义TCP协议进行传输就会避免上面这个问题,极大的减轻了传输数据的开销。这也就是为什么通常会采用自定义TCP协议的RPC来进行服务调用的真正原因。除此之外,成熟的RPC框架还提供好了“服务自动注册于发现”、“智能负载均衡”、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择RPC进行服务注册和发现的一方面原因吧。

一个常见的错误观点

很多文章中还会提到说Http协议相较于自定义TCP报文协议,增加的开销在于链接的建立与断开,但是这个观点已经被否认,下面截取自某乎中的一个回答:

 

 

posted @ 2020-04-13 18:14  萌萌丶小魔王  阅读(722)  评论(0编辑  收藏  举报