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框架的实现目标则是将上面的第2-9步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。

二、实现RPC需要解决的问题

通信问题
远程调用,肯定两个机器之间需要通信。主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。

服务寻址
上面提到,RPC是面向本地调用。那么用户进行了本地调用,如何找到对应的远程调用,需要RPC底层进行实现。需要管理ip,端口,服务列表等信息。常见的是使用zookeeper来进行管理。
对生产者而言:
服务启动的时候,将自己提供的服务注册到注册中心;
生产者挂掉时,注册中心注销停止的服务;
生产者定时向注册中心发送心跳,如果心跳异常,注册中心也注销生产者服务。

对消费者而言:
订阅注册中心的服务,获取ip,端口等服务信息;
当生产者上线下线时,注册中心会通知调用者;
服务下线后,消费者不再消费该服务。

网络传输
当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。

当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。

服务调用
B机器进行本地调用(通过代理Proxy和反射调用)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理,一般是业务逻辑处理操作。

三、RPC 与 REST 的区别?

RPC 与 REST 最大的区别就在于 RPC 提供了更好的抽象,RPC 甚至将网络传输细节彻底隐藏了,而 REST 没有。具体来说,REST 至少要求用于提供 URL 以及请求参数,而 RPC 隐藏了与网络传输的相关实现细节。另一方面,RPC 可以基于任何网络通信协议,而 REST 通常基于 HTTP(或者 HTTPS)协议。RPC 调用者并不会关心具体的协议是:HTTP、TCP 还是其他任何自定义协议。

四、优缺点

优点:
帮助客户端通过传统使用高级语言的过程调用与服务器进行通信。
可以在分布式环境以及本地环境中使用。
支持面向进程和面向线程的模型。
对用户隐藏内部消息传递机制。
只需极少的努力即可重写和重新开发代码。
提供抽象,即对用户隐藏网络通信的消息传递性质。
省略许多协议层以提高性能。

缺点:
客户端和服务器对各自的例程使用不同的执行环境,并且资源(例如,文件)的使用也更加复杂。因此,RPC 系统并不总是适合传输大量数据。

RPC 非常容易发生故障,因为它涉及通信系统,另一台计算机和另一个进程。

RPC 没有统一的标准;它可以通过多种方式实现。

RPC 只是基于交互的,因此,在硬件架构方面,它不提供任何灵活性。

参考文章:
RPC协议解析[通俗易懂]
千字带你了解什么是 RPC 协议

你可能感兴趣的:(协议,rpc,网络,java)