2023-分布式学习记录6-RPC

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/17182434.html


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 ,以实现跨编程语言。

 

 

posted @   kuaiquxie  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示