2023-分布式学习记录6-RPC
RPC / RMI
远程过程调用(RPC):使应用程序可以像调用本地节点上的过程(子程序) 那样去调用一个远程节点上的子程序。
除了 RPC ,还有远程方法调用(RMI),但两者不作严格区分。
为什么要使用 RPC ?
- 实现跨进程、跨语言、跨网络、跨平台的过程调用,方便协作分工
- 强化面向接口编程的编程风格
如何利用 Socket API 实现远程过程调用?
- 客户端通过 Socket 发送请求,提供过程调用所需数据(如函数参数)
- 服务器通过 Socket 返回结果
显然我们自己利用 Socket 实现 RPC 并不方便,所以可以采用 RPC/RMI 中间件。
RPC / RMI 中间件的作用:
- 定义并利用Socket服务接口实现了一套调用者和被调用者之间的通信协议。(远程过程调用协议),例如 Java RMI 的 Java Remote Method Protocol (JRMP)
- 实现了过程参数的序列化、反序列化;过程运算结果的序列化、反序列化
- 通信过程中的错误处理
- 过程服务进程(或远程对象)的集中注册与发现(目录服务)
- 远程对象的统一标识和生命周期管理
- 在服务端支持并发访问。(多采用多线程技术)
参考博客:RPC原理解析 - 牧梦者 - 博客园 (cnblogs.com)
RPC 架构:
- 客户端(Client),服务的调用方。
- 客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
- 服务端(Server),真正的服务提供者。
- 服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。
- 客户端(client)以本地调用方式(即以接口的方式)调用服务;
- 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制);
- 客户端通过sockets将消息发送到服务端;
- 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);
- 服务端存根( server stub)根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给服务端存根( server stub);
- 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);
- 服务端(server)通过sockets将消息发送到客户端;
- 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息发序列化);
- 客户端(client)得到最终结果。
如果 RPC / RMI 中间件支持跨编程语言调用,需要定义一套独立于各种编程语言的接口定义语言 IDL ,以实现跨编程语言。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号