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的基本框架如下图
图片来自简书
可以看出,RPC是基于socket进行通信的。socket之上,有个stub层。
客户端存根(Client Stub):存放服务端地址信息,打包请求参数数据通过网络传输发送给服务端。
服务端存根(Server Stub):接收消息并解包,再调用本地服务进行处理。
完整框架
如下
RPC有五个功能模块,分别是客户端、客户端stub、网络传输、服务端stub、服务端。
三大核心,1. 服务寻址 2. 数据流的序列化和反序列化 3. 网络传输
1. 如何进行服务寻址,即服务注册和发现
这里要引入一个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