RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP/IP或UDP,为通讯程序之间携带信息数据。RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了近似于无限制提高的可能。在OSI网络通讯模型中,RPC跨域了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。git
一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub能够理解为存根。github
(1) 客户端(client)以本地调用方式(即以接口的方式)调用服务;跨域
(2) 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成可以进行网络传输的消息体(将消息体对象序列化为二进制);服务器
(3) 客户端经过sockets将消息发送到服务端;网络
(4) 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);架构
(5) 服务端存根( server stub)根据解码结果调用本地的服务;并发
(6) 本地服务执行并将结果返回给服务端存根( server stub);框架
(7) 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);socket
(8) 服务端(server)经过sockets将消息发送到客户端;分布式
(9) 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息发序列化);
(10) 客户端(client)获得最终结果。
RPC的目标是要把二、三、四、七、八、9这些步骤都封装起来。
注意:不管是何种类型的数据,最终都须要转换成二进制流在网络上进行传输,数据的发送方须要将对象转换为二进制流,而数据的接收方则须要把二进制流再恢复为对象。
设计框架视图以下:
与1.3架构图相比较,rpc-sample-client至关于client-functions,经过接口方法发起请求;而rpc-client至关于client-stub,负责把方法和参数序列化并发送给查找到的服务器。rpc-server至关于server stub,负责把客户端发送过来的消息反序列化,并经过反射调用本地服务,再把本地服务返回的结果序列化发送给客户端;rpc-sample-server则至关于server-functions,提供本地服务并返回得出的结果给rpc-server。rpc-client等待接收rpc-server返回的结果,并将结果反序列化,再把反序列化最终获得的结果返回给rpc-sample-client。
rpc-common提供基于netty的序列化与反序列化方法,并封装rpc请求和rpc响应,序列化和反序列的对象就是封装好的RpcRequest和RpcResponse。rpc-registry则是基于zookeeper设计的分布式服务器动态上下线通知的应用程序,经过rpc-registry能够查找服务器或者注册服务器,用于均衡负载。
rpc-client与rpc-server之间的通讯是基于netty的,netty底层也是sockets设计,可是效率比sockets高。
范例github地址:
https://github.com/qiushangwenyue/CustomRpcFramework.git