RPC协议
RPC 协议
通常我们调用一个函数,是直接调用,也就是本地调用,但如果 A 服务,想要调用 B 服务的某一个函数,而他们又不在同一台机器上(内存不共享)该怎么调用呢?
通常我们会想到,让 B 服务暴露一个接口,交给 A 服务调用,这其实已经很接近 RPC 概念了。
但不能每次要用到这个函数的时候都去写 http 调用的代码吧,能不能简单点,就像调用本地函数一样方便?
RPC 协议可以提供这样解决方案
- 需要解决通讯的问题
客户端和服务端建立 TCP 连接,远程调用的过程和结果,所有的数据交换,都在这个连接中传输,连接可以按需连接,使用完了之后关闭,也可以建立长连接,多个远程连接共享一个连接。
- 需要解决寻址的问题
A 服务器上的应用需要告诉底层的 RPC 框架,如何连接到 B 服务器,以及特定的端口,函数的名称是什么,这样才能精准的调用目标函数,
- 数据传递
当 A 客户端发起调用时,函数的参数需要通过底层的网络协议如 TCP 传递到 B 服务器,由于网络协议是基于二进制的,参数也需要化成二进制的形式,通过序列化的二进制数据发送给 B 服务器。
- B 服务器收到请求之后,需要对参数进行反序列化,将参数恢复为内存中的变量(表达式),然后通过反射或其他方式,调用本地函数,得到返回值
- 返回值传输到客户端时,也要经过二进制序列化的方式发送,服务器 A 接受到了之后,再反序列化恢复为内存中的变量,然后正常往下执行。
RPC 要解决的两个问题
- 解决分布式系统中,服务之间的调用问题
- 远程调用时,要能够像本地调用一样方便,让调用者感受不到远程调用的逻辑。
RPC 是一种技术的概念名词
RPC=Remote Produce Call 是一种技术的概念名词,HTTP 是一种协议,RPC 可以通过 HTTP 来实现,也可以通过 Socket 自己实现一套协议来实现
RPC 框架的好处、为什么要使用 RPC 服务
HTTP 接口是在接口不多,系统与系统之间的调用较小的解决方案。
优点是:
- 简单、快速、开发方便
如果是一个大型系统,内部子系统较多,对外接口非常多,RPC 框架的优势就体现出来了。
首先是长连接,不必要每次调用时就要建立网络连接,省去了网络开销。
其次是 RPC 框架一般都具备注册中心,有丰富的监控管理,对调用方是无感的。
RPC 能够解耦服务,RPC 协议更加简单、更小,那么它的效率也会更高。