当前位置: 首页 > 知识库问答 >
问题:

rpc - RPC方法调用与本地调用差异在何处,为何不适用于本地?

郑曜灿
2024-07-09

目前参与的项目中会写一些 RPC 接口供其他服务调用,但是我发现这些接口也可以以 sdk 的方式提供给其他服务调用,但是为什么不用 sdk 的方式提供呢?

共有2个答案

金承嗣
2024-07-09

假设一个是php系统,一个java系统,他们是由两个团队维护,这时候如果使用RPC调用就不需要使用其他方案来引入依赖了

颛孙越
2024-07-09

RPC(Remote Procedure Call)方法调用与本地调用的主要差异在于调用发生的位置、网络通信的开销、以及如何处理调用失败和异常。这些差异使得RPC在某些场景下比本地调用更为复杂,但并不意味着RPC不适用于本地调用,而是说在某些情况下使用本地调用可能更为高效。

RPC与本地调用的主要差异:

  1. 位置:本地调用发生在同一进程内,而RPC调用通常发生在不同的进程或不同的机器上。
  2. 网络通信:RPC涉及网络通信,这可能会引入延迟、带宽限制和潜在的失败点(如网络中断)。本地调用则没有这些问题。
  3. 序列化/反序列化:RPC需要将参数和返回值序列化为字节流以便在网络上传输,然后在目标端反序列化。这可能会引入额外的开销和复杂性。本地调用则直接传递内存中的对象,无需序列化和反序列化。
  4. 异常处理:RPC调用失败时,需要一种机制来通知调用方(通常是抛出异常或返回错误代码)。这种机制可能需要额外的协议和复杂性来确保错误信息的准确传递。本地调用则可以直接使用语言的异常处理机制。
  5. 负载均衡和容错:对于RPC,可能需要实现负载均衡和容错机制,以确保服务的高可用性和可扩展性。本地调用则无需考虑这些问题。

为何RPC不适用于本地调用?

实际上,RPC可以用于本地调用,但通常不是最佳选择。原因如下:

  • 性能开销:本地调用通常比RPC调用更快,因为避免了网络通信和序列化/反序列化的开销。
  • 复杂性:引入RPC框架会增加系统的复杂性和维护成本,特别是当只需要本地调用时。
  • 调试难度:RPC调用失败时,调试可能会更加困难,因为需要考虑网络问题和序列化/反序列化错误等因素。
  • 依赖关系:使用RPC框架会增加对外部库的依赖,这可能会增加部署和管理的复杂性。

使用RPC的场景:

  • 分布式系统:当需要在不同的进程或机器上调用方法时,RPC是首选的解决方案。
  • 微服务架构:在微服务架构中,服务之间的通信通常通过RPC实现。
  • 跨语言调用:当需要在不同的编程语言之间调用方法时,RPC提供了一种通用的解决方案。

总结:

RPC和本地调用各有优缺点,适用于不同的场景。在大多数情况下,本地调用是最高效和最简单的选择。然而,在需要跨进程或跨机器通信的场景中,RPC是不可或缺的。选择哪种方式取决于具体的需求和约束条件。

 类似资料:
  • 说明 此文档只适用于 jboot v3.1.0 以上,之前的版本请参考 这里 。 目录 添加依赖 配置 开始使用 restful 暴露 高级功能 添加依赖 Jboot 支持 dubbo 和 motan,假设我们需要使用 dubbo 作为底层的 RPC 框架,需要添加如下依赖: <dependency> <groupId>org.apache.dubbo</groupId> <art

  • 本文向大家介绍golang两种调用rpc的方法,包括了golang两种调用rpc的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了golang两种调用rpc的方法。分享给大家供大家参考,具体如下: golang的rpc有两种方法进行调用,一种是rpc例子中给的: 另一种是使用NewServer 这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRP

  • 本文向大家介绍python远程调用rpc模块xmlrpclib的方法,包括了python远程调用rpc模块xmlrpclib的方法的使用技巧和注意事项,需要的朋友参考一下 RPC(Remote Procedure Call Protocol)是远程调用协议,它通过网络请求服务到远端服务器,服务器根据请求做出响应,将结果返回 它是一种C/S模式,客户端可以调用远程服务器上的参数(类似URL)并返回结

  • 问题内容: 首先,我知道进行同步调用是“错误的”,并且知道“不可能”。 但是,在非常复杂的情况下(我不知道如何解释),我需要等待服务器的响应,我正在对GWT RPC调用使用GWT-Platform命令实现。 我正在为此寻找某种“黑客”。 提前致谢。 问题答案: 有解决方案,但这并不容易(例如,您无法翻转单个参数以使其起作用)。GWT在后台使用了普通的JS XMLHttpRequest。在GWT中,

  • Introduction 介绍 Socket and HTTP programming use a message-passing paradigm. A client sends a message to a server which usually sends a message back. Both sides are responsible for creating messages in

  • 本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。 配置 定义 injvm 协议 <dubbo:protocol name="injvm" /> 设置默认协议 <dubbo:provider protocol="injvm" /> 设置服务协议 <dubbo:service protocol="in

  • 或者这个: 如果REST用于资源,而RPC用于过程,那么将RPC用于这样的事情难道不是一个糟糕的实践吗? 如果我错了请纠正我,但在我看来,RPC应该更纯粹地是功能性的。 意味着调用过程应该始终: null 如果这个问题因为太“基于意见”而结束,我就会知道我应该做任何我想做的事...