RPC

RPC(Remote Procedure Call),远程过程调用。通俗的讲,就是本地的应用调用远程服务的方法。从这个广义的角度讲restful也属于一种rpc,但通俗的来它们是不同的实现。我们在选择技术方案的时候,可以根据不同的场景做出选择。

1. Restful .Pk. RPC
Restful的优势:

可读性,一般时json格式。基于http,可以获得防火墙的支持,比如屏蔽某些访问。这两点保证了它能供轻松的支持跨语言的通信。

Restful的劣势:

成也HTTP,败也HTTP。REST中有效信息占比少,因为http头的内容不少,所以REST占整个通信消息的比重就少了很多。而且由于属于应用层协议,通信效率相对就低了。在这调用复杂,要封装基于http的协议,各种参数名和值。

Restful的使用场景

对性能要求不高,支持跨语言场景。比如天气预报等公共服务。

RPC的使用场景

对性能有一定要求,因为它一般是基于二进制传输的,对可读性要求不高。 多用于大型系统内部服务之间通信。或者说RPC是面向服务的。

2. RPC的实现即基本框架

RPC的基本框架如下图
image
图片来自简书
可以看出,RPC是基于socket进行通信的。socket之上,有个stub层。
客户端存根(Client Stub):存放服务端地址信息,打包请求参数数据通过网络传输发送给服务端。
服务端存根(Server Stub):接收消息并解包,再调用本地服务进行处理。

完整框架

如下
image

RPC有五个功能模块,分别是客户端、客户端stub、网络传输、服务端stub、服务端。
三大核心,1. 服务寻址 2. 数据流的序列化和反序列化 3. 网络传输

1. 如何进行服务寻址,即服务注册和发现

image
这里要引入一个callid的概念,在rpc中每一个函数方法都对应有一个自己的callid。客户端在进行远程调用的时候,要把这个id附带上。这个callid和函数之间的对应关系,存放在注册中心。当客户端发起调用的时候,会查询注册中心有没有这个服务,若有则返回注册地址,接下来才是和服务器的通信和方法的执行。服务器也需要将自己实现的方法到注册中心去注册。服务端在增加新功能的时候,客户端不必感知服务端的方法,服务端也只需要在注册中心更新即可。
服务注册,服务器把服务信息注册到注册中心,注册中心存储 IP、端口、调用方式(协议、序列化方式)等服务相关的信息。
服务发现,客户端调用服务时,先通过注册中心找服务,通常还会缓存到本地,一遍后续使用。当再次调用服务时,就直接通过从 IP 列表中调用服务,但不止一个IP时,怎通过负责均衡算法选择。

2. 数据序列化

客户端怎么传递数据到远程函数?
首先将参数转换成二进制数据,然后通过网络进行传输。序列化和反序列化也就是这个意思。
序列化:数据对象->二进制流
反序列化: 二进制流->数据对象
这样做的好处就是减轻网络负荷,相对json串那种明文数据能较少的传输数据。常用序列化协议比如Protobuf、thrift和avro等,一般都支持多语言。

3. 网络传输协议

基于TCP的RPC:能够灵活定指协议字段,减少开销,从而提高性能,实现更大的吞吐量和并发数。
基于HTTP的RPC:这就类似上面讲的restful了,主要就是方便开发但效率低开销大。
所以大部分RPC框架都是基于传输层协议的,大部分是基于TCP的,少部分是UDP,基于应用层HTTP协议的比较少。 TCP协议可以短链接方式,也可以是长链接方式。

参考:
[0] https://www.zhihu.com/question/41609070/answer/1030913797
[1] https://www.jianshu.com/p/7d6853140e13
[2] https://kaiwu.lagou.com/course/courseInfo.htm?courseId=69#/detail/pc?id=1912

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值