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