RPC是什么
RPC(Remote Procedure Call),即远程过程调用,它是一种帮助调用远程计算机程序上的开放的服务的一种方式。
两个不同服务器上的服务之间如果想要进行数据传输或者方法调用,那么需要通过网络编程来实现,如果我们手动实现网络编程进行远程调用的话,会带来巨大的工作量,并且还需要考虑底层所使用的网络协议,序列化方式等等。
而RPC的目标就是:让本地程序调用其它远程主机上的函数,就好像调用本地程序内的函数一样简单,即简化远程调用的方式。RPC屏蔽编了程语言的差异性,也不需要使用者了解底层网络技术,屏蔽了底层网络协议的选择,屏蔽了网络编程的细节。
RPC的原理
RPC的架构如下:
RPC包含如下角色:
1、 客户端(Client):服务调用方,直接调用ClientStub;
2、 客户端存根(ClientStub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息(序列化),再通过网络传输发送给服务端;
3、 服务端存根(ServerStub):接收客户端发送过来的请求消息并进行解包(反序列化),然后再调用本地服务的方法进行处理;
4、 服务端(Server):服务的真正提供者,由ServerStub调用;
5、 NetworkService:数据底层传输协议,可以是TCP或HTTP;
RPC调用流程或者原理如下:
1、 client以本地调用方式(即以接口的方式,实际上是代理对象)调用服务;
2、 clientstub接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体,即序列化为Java对象:RpcRequest;
3、 clientstub找到远程服务的地址,通过socket将消息发送到服务端;
4、 serverstub收到消息后进行解码,将消息反序列化为Java对象:RpcRequest;
5、 serverstub根据解码结果RpcRequest中的类、方法、参数信息调用Server的方法;
6、 Server执行方法,并将结果返回给serverstub;
7、 serverstub将返回结果打包成能够进行网络传输的消息体,即序列化为Java对象:RpcResponse;
8、 serverstub通过sockets将序列化的消息发送到client;
9、 clientstub接收到结果消息,并进行解码,将结果消息反序列化为Java对象:RpcResponse;
10、 clientstub将结果返回给client,这样,client可以从RpcResponse中得到Server最终返回的结果;
RPC和HTTP
实际上RPC的出现时间早于HTTP,在上世纪70年代就出现了,而HTTP而是90年代才出现。
RPC是一种概念、一种设计、一种机制, RPC出现的目的就是为了让远程调用(分布式系统之间的通信)变得像本地调用(同一个系统的本地方法之间的调用)那样简单,它是一种更加上层次的东西,RPC有不同的技术实现,但是具体实现一般都会包含有传输协议和序列化协议这两个协议,这两个协议合称“RPC协议”。
HTTP仅仅是一种用来在网络上传输数据的传输协议,它规定了的传输的数据的格式。RPC框架可以使用 HTTP协议作为传输协议或者通过TCP来自定义传输协议,使用不同的协议一般也是为了适应不同的场景,可以自由选择。
所以说,RPC 和 HTTP 根本就不是一个层级的东西,所以严格意义上这两个没有可比性,也不应该来作比较。
HTTP协议是一种成熟的格式固定的应用层传输协议,多用于与公网之间的通信,例如浏览器-服务器架构,对于不同的服务器,只要遵循HTTP协议就能被浏览器访问和解析,而RPC多用于内网中的服务之间的通信,HTTP协议中很多的信息比如请求头都是冗余数据,对于内网这一个安全的网络环境来说都不是必须的,所以 RPC 大多都是基于 TCP 自定义更加精简和高效的传输协议,当然也有使用HTTP作为传输协议的RPC实现(gRPC底层使用HTTP2作为传输协议)。
在项目开发过程中,对于远程服务调用,我们也不需要自己实现RPC,那样的话也会很麻烦,我们直接使用现成的RPC框架即可,目前有很多开源的RPC框。
RPC框架的实现
RMI:JDK自带的RPC,RMI可以被看作SUN对RPC的Java版本(实现),有很多局限性,比如只适用于Java语言,不推荐使用。
Dubbo: Dubbo是阿里巴巴公司开源的一个高性能RPC框架,使得应用可通过高性能的RPC实现服务的远程调用,并且可以和Spring框架无缝集成。目前 Dubbo 已经成为 Apache的核心项目以及Spring Cloud Alibaba 中的官方组件。
gRPC:gRPC是Google开源的一款可以在任何环境中运行的高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。
Hessian:Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。相比WebService,Hessian更简单、快捷。采用的是Binary-RPC(二进制RPC)协议,它很适合于发送二进制数据。
Thrift:Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。