RPC和HTTP的理解以及不同之处

RPC协议:远程过程调用协议(Remote Procedure Call Protocol),是一种计算机通讯协议。

如何理解远程过程调用?

假设有两台服务器A和B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,所以不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

简要的步骤
  1. 解决通讯问题。主要是客户端和服务器建立TCP连接,远程调用所有交换的数据都在这个连接里面进行交换,连接可以是按需连接,数据交换完毕之后就关闭连接;也可以是长连接,多个远程调用都共享同一个连接。
  2. 解决寻址问题。服务器A想要调用服务器B的应用,那么A应该告知RPC框架B服务器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。比如基于Web服务协议栈的RPC,就需要提供一个endpoint URI,或者是从UDDI服务上进行查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
  3. 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
  4. B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。
  5. 返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用。

通常,经过以上五个步骤之后,一次完整的RPC调用算是完成了,另外可能因为网络抖动等原因需要重试等。

为什么会使用RPC?

主要就是因为在几个进程内(应用分布在不同的机器上),无法共用内存空间,或者在一台机器内通过本地调用无法完成相关的需求,比如不同的系统之间的通讯,甚至不同组织之间的通讯。此外由于机器的横向扩展,需要在多台机器组成的集群上部署应用等等。

RPC支持的协议?

最早的CORBA、Java RMI, WebService方式的RPC风格, Hessian, Thrift甚至Rest API。

RPC实现的基础?

1、需要有非常高效的网络通信,比如一般选择Netty作为网络通信框架。
2、需要有比较高效的序列化框架,比如谷歌的Protobuf序列化框架。
3、可靠的寻址方式(主要是提供服务的发现),比如可以使用Zookeeper来注册服务等等。
4、如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能。


HTTP协议:HTTP(Hyper Text Transfer Protocol),超文本传输协议的缩写。是用于从WWW服务器传输超文本到本地浏览器的传输协议。HTTP是一个应用层协议,由请求和响应构成,是一个标准的个客户端和服务器模型。

如何理解HTTP协议?

虽然HTTP是超文本传输协议,但它跟传输没有半毛钱关系,它就是一种协议,和租房合约一样,是一种双方约定的规则。有一定的格式,比如合同,要是甲乙双方、有要具体内容、时间等等。

HTTP组成?

HTTP由起始行(start line)、请求头(header)、消息正文组成(entity)。
1、起始行:描述请求方式和相应的基本信息。由请求方式、请求资源、使用HTTP的版本号。

例如:GET index.html HTTP/1.1

2、请求头:以key-value的形式说明报文内容。
3、消息正文:具体需要传输的数据,可以是文本、图片视频等二级制数据。

HTTP的基本结构如下图:

其中HTTP完整的头部格式如下:
完整的请求头
完整的响应头

在浏览器输入网址会发生什么呢?

下面以访问www.baidu.com为例
1、浏览器对www.baidu.com进行DNS域名解析,解析得到ip地址。
2、通过ip地址找到对应的服务器,发起TCP三次握手。
3、基于TCP连接,发送http请求。
4、服务器响应http请求,返回html代码。
5、浏览器解析html的代码,并且请求静态资源(如:js、css、img等)。
6、浏览器将渲染的页面呈现给用户。


RPC和HTTP的不同?
  1. 传输协议:
    RPC:可以基于TCP也可以基于HTTP。
    HTTP:基于HTTP。

  2. 传输效率:
    RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。
    HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理。

  3. 性能消耗,主要在于序列化和反序列化的耗时:
    RPC:可以基于thrift实现高效的二进制传输。
    HTTP:大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能。

  4. 负载均衡:
    RPC:基本都自带了负载均衡策略。
    HTTP:需要配置Nginx,HAProxy来实现。

  5. 服务治理(下游服务新增,重启,下线时如何不影响上游调用者):
    RPC:能做到自动通知,不影响上游。
    HTTP:需要事先通知,修改Nginx/HAProxy配置。

总结:
  RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。

参考文章:
https://www.jianshu.com/p/b61695e6b473 HTTP和RPC的优缺点
https://www.jianshu.com/p/78f72ccf0377 RPC框架实现原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值