rpc 订阅
RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。 展开全文
RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。
信息
外文名
Remote Procedure Call
作    用
对数据进行处理后显示或打印
中文名
远程过程调用
缩写形式
RPC
远程过程调用简介
进程间通信(IPC)是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术。有两种类型的进程间通信(IPC)。本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。 远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNⅨ操作系统的计算机中。
收起全文
精华内容
参与话题
问答
  • RPC

    2020-02-24 10:51:00
    RPC要解决的两个问题: 解决分布式系统中,服务之间的调用问题。 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。 二进制。 RPC vs Restful 如果硬要比较,那么可以从RPC风格的url和...

    RPC要解决的两个问题:

    1. 解决分布式系统中,服务之间的调用问题。
    2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
    3. 二进制

    RPC vs Restful

    如果硬要比较,那么可以从RPC风格的url和Restful风格的url上进行比较。

    比如你提供一个查询订单的接口,用RPC风格,你可能会这样写:

     

    /queryOrder?orderId=123
    

    用Restful风格呢?

    Get  
    /order?orderId=123

    一次完整的RPC调用流程(同步调用,异步另说)如下:

    1)服务消费方(client)调用以本地调用方式调用服务;

    2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

    3)client stub找到服务地址,并将消息发送到服务端;

    4)server stub收到消息后进行解码;

    5)server stub根据解码结果调用本地的服务;

    6)本地服务执行并将结果返回给server stub;

    7)server stub将返回结果打包成消息并发送至消费方;

    8)client stub接收到消息,并进行解码;

    9)服务消费方得到最终结果。

    展开全文
  • rpc

    2017-08-05 17:59:31
    一周学习rpc原理及dubbo开源 https://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/ 1、目标 1、研究基本原理 2、编写rpc程序 3、研究motan 4、研究thrift或者grpc...
    一周学习rpc原理及dubbo开源
    https://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/

    1、目标
    1、研究基本原理
    2、编写rpc程序
    3、研究motan
    4、研究thrift或者grpc
    展开全文
  • RPC

    2008-04-17 09:59:00
    RPC 英文原义:Remote Procedure Call Protocol中文释义:(RFC-1831)远过程调用协议注解:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP...
    RPC

    英文原义:Remote Procedure Call Protocol

    中文释义:(RFC-1831)远过程调用协议

    注解:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCPUDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

    RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。

      目前,有多种 RPC 模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC PRC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。


    协议结构

      远程过程调用(RPC)信息协议由两个不同结构组成:调用信息和答复信息。信息流程如下所示:  


    RPC:远程过程调用流程

      RPC 调用信息:每条远程过程调用信息包括以下无符号整数字段,以独立识别远程过程:
    程序号(Program number)
    程序版本号(Program version number)
    过程号(Procedure number)
      RPC 调用信息主体形式如下:

      struct call_body {

       unsigned int rpcvers;

       unsigned int prog;

       unsigned int vers;

       unsigned int proc;

       opaque_auth cred;

       opaque_auth verf;

       1 parameter

       2 parameter . . .

      };

      RPC 答复信息:RPC 协议的答复信息的改变取决于网络服务器对调用信息是接收还是拒绝。答复信息请求包括区别以下情形的各种信息:
    RPC 成功执行调用信息。.
    RPC 的远程实现不是协议第二版,返回 RPC 支持的最低和最高版本号。
    在远程系统中,远程程序不可用。
    远程程序不支持被请求的版本号。返回远程程序所支持的最低和最高版本号。
    请求的过程号不存在。通常是呼叫方协议或程序差错。
      RPC答复信息形式如下:

      enum reply_stat stat {  
      MSG_ACCEPTED = 0,

      MSG_DENIED   = 1

      };
     
    展开全文
  • 深入浅出 RPC - 深入篇

    万次阅读 多人点赞 2014-09-22 11:25:10
    《深入篇》我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它?   RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供...

     

    《深入篇》我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它?

     

    RPC 功能目标

    RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用,在前文《浅出篇》中给出了一种实现结构,基于 stub 的结构来实现。下面我们将具体细化 stub 结构的实现。

     

    RPC 调用分类

    RPC 调用分以下两种:

    1. 同步调用
       客户方等待调用执行完成并返回结果。
    2. 异步调用
       客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
       若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
    

    异步和同步的区分在于是否等待服务端执行完成并返回结果。

     

    RPC 结构拆解

    《浅出篇》给出了一个比较粗粒度的 RPC 实现概念结构,这里我们进一步细化它应该由哪些组件构成,如下图所示。

    RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。

    RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。

     

    RPC 组件职责

    上面我们进一步拆解了 RPC 实现结构的各个组件组成部分,下面我们详细说明下每个组件的职责划分。

    1. RpcServer
       负责导出(export)远程接口
    2. RpcClient
       负责导入(import)远程接口的代理实现
    3. RpcProxy
       远程接口的代理实现
    4. RpcInvoker
       客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回
       服务方实现:负责调用服务端接口的具体实现并返回调用结果
    5. RpcProtocol
       负责协议编/解码
    6. RpcConnector
       负责维持客户方和服务方的连接通道和发送数据到服务方
    7. RpcAcceptor
       负责接收客户方请求并返回请求结果
    8. RpcProcessor
       负责在服务方控制调用过程,包括管理调用线程池、超时时间等
    9. RpcChannel
       数据传输通道
    

     

    RPC 实现分析

    在进一步拆解了组件并划分了职责之后,这里以在 java 平台实现该 RPC 框架概念模型为例,详细分析下实现中需要考虑的因素。

    导出远程接口

    导出远程接口的意思是指只有导出的接口可以供远程调用,而未导出的接口则不能。在 java 中导出接口的代码片段可能如下:

    DemoService demo   = new ...;
    RpcServer   server = new ...;
    server.export(DemoService.class, demo, options);
    

    我们可以导出整个接口,也可以更细粒度一点只导出接口中的某些方法,如:

    // 只导出 DemoService 中签名为 hi(String s) 的方法
    server.export(DemoService.class, demo, "hi", new Class<?>[] { String.class }, options);
    

    java 中还有一种比较特殊的调用就是多态,也就是一个接口可能有多个实现,那么远程调用时到底调用哪个?这个本地调用的语义是通过 jvm 提供的引用多态性隐式实现的,那么对于 RPC 来说跨进程的调用就没法隐式实现了。如果前面DemoService 接口有 2 个实现,那么在导出接口时就需要特殊标记不同的实现,如:

    DemoService demo   = new ...;
    DemoService demo2  = new ...;
    RpcServer   server = new ...;
    server.export(DemoService.class, demo, options);
    server.export("demo2", DemoService.class, demo2, options);
    

    上面 demo2 是另一个实现,我们标记为 "demo2" 来导出,那么远程调用时也需要传递该标记才能调用到正确的实现类,这样就解决了多态调用的语义。

    导入远程接口与客户端代理

    导入相对于导出远程接口,客户端代码为了能够发起调用必须要获得远程接口的方法或过程定义。目前,大部分跨语言平台 RPC 框架采用根据 IDL 定义通过 code generator 去生成 stub 代码,这种方式下实际导入的过程就是通过代码生成器在编译期完成的。我所使用过的一些跨语言平台 RPC 框架如 CORBAR、WebService、ICE、Thrift 均是此类方式。

    代码生成的方式对跨语言平台 RPC 框架而言是必然的选择,而对于同一语言平台的 RPC 则可以通过共享接口定义来实现。在 java 中导入接口的代码片段可能如下:

    RpcClient client = new ...;
    DemoService demo = client.refer(DemoService.class);
    demo.hi("how are you?");
    

    在 java 中 'import' 是关键字,所以代码片段中我们用 refer 来表达导入接口的意思。这里的导入方式本质也是一种代码生成技术,只不过是在运行时生成,比静态编译期的代码生成看起来更简洁些。java 里至少提供了两种技术来提供动态代码生成,一种是 jdk 动态代理,另外一种是字节码生成。动态代理相比字节码生成使用起来更方便,但动态代理方式在性能上是要逊色于直接的字节码生成的,而字节码生成在代码可读性上要差很多。两者权衡起来,个人认为牺牲一些性能来获得代码可读性和可维护性显得更重要。

    协议编解码

    客户端代理在发起调用前需要对调用信息进行编码,这就要考虑需要编码些什么信息并以什么格式传输到服务端才能让服务端完成调用。出于效率考虑,编码的信息越少越好(传输数据少),编码的规则越简单越好(执行效率高)。我们先看下需要编码些什么信息:

    -- 调用编码 --
    1. 接口方法
       包括接口名、方法名
    2. 方法参数
       包括参数类型、参数值
    3. 调用属性
       包括调用属性信息,例如调用附件隐式参数、调用超时时间等
    
    -- 返回编码 --
    1. 返回结果
       接口方法中定义的返回值
    2. 返回码
       异常返回码
    3. 返回异常信息
       调用异常信息
    

    除了以上这些必须的调用信息,我们可能还需要一些元信息以方便程序编解码以及未来可能的扩展。这样我们的编码消息里面就分成了两部分,一部分是元信息、另一部分是调用的必要信息。如果设计一种 RPC 协议消息的话,元信息我们把它放在协议消息头中,而必要信息放在协议消息体中。下面给出一种概念上的 RPC 协议消息设计格式:

     

    -- 消息头 --
    magic      : 协议魔数,为解码设计
    header size: 协议头长度,为扩展设计
    version    : 协议版本,为兼容设计
    st         : 消息体序列化类型
    hb         : 心跳消息标记,为长连接传输层心跳设计
    ow         : 单向消息标记,
    rp         : 响应消息标记,不置位默认是请求消息
    status code: 响应消息状态码
    reserved   : 为字节对齐保留
    message id : 消息 id
    body size  : 消息体长度
    
    -- 消息体 --
    采用序列化编码,常见有以下格式
    xml   : 如 webservie soap
    json  : 如 JSON-RPC
    binary: 如 thrift; hession; kryo 等
    

    格式确定后编解码就简单了,由于头长度一定所以我们比较关心的就是消息体的序列化方式。序列化我们关心三个方面:

    1. 序列化和反序列化的效率,越快越好。
    2. 序列化后的字节长度,越小越好。
    3. 序列化和反序列化的兼容性,接口参数对象若增加了字段,是否兼容。

    上面这三点有时是鱼与熊掌不可兼得,这里面涉及到具体的序列化库实现细节,就不在本文进一步展开分析了。

    传输服务

    协议编码之后,自然就是需要将编码后的 RPC 请求消息传输到服务方,服务方执行后返回结果消息或确认消息给客户方。RPC 的应用场景实质是一种可靠的请求应答消息流,和 HTTP 类似。因此选择长连接方式的 TCP 协议会更高效,与 HTTP 不同的是在协议层面我们定义了每个消息的唯一 id,因此可以更容易的复用连接。

    既然使用长连接,那么第一个问题是到底 client 和 server 之间需要多少根连接?实际上单连接和多连接在使用上没有区别,对于数据传输量较小的应用类型,单连接基本足够。单连接和多连接最大的区别在于,每根连接都有自己私有的发送和接收缓冲区,因此大数据量传输时分散在不同的连接缓冲区会得到更好的吞吐效率。所以,如果你的数据传输量不足以让单连接的缓冲区一直处于饱和状态的话,那么使用多连接并不会产生任何明显的提升,反而会增加连接管理的开销。

    连接是由 client 端发起建立并维持。如果 client 和 server 之间是直连的,那么连接一般不会中断(当然物理链路故障除外)。如果 client 和 server 连接经过一些负载中转设备,有可能连接一段时间不活跃时会被这些中间设备中断。为了保持连接有必要定时为每个连接发送心跳数据以维持连接不中断。心跳消息是 RPC 框架库使用的内部消息,在前文协议头结构中也有一个专门的心跳位,就是用来标记心跳消息的,它对业务应用透明。

    执行调用

    client stub 所做的事情仅仅是编码消息并传输给服务方,而真正调用过程发生在服务方。server stub 从前文的结构拆解中我们细分了 RpcProcessorRpcInvoker 两个组件,一个负责控制调用过程,一个负责真正调用。这里我们还是以 java 中实现这两个组件为例来分析下它们到底需要做什么?

    java 中实现代码的动态接口调用目前一般通过反射调用。除了原生的 jdk 自带的反射,一些第三方库也提供了性能更优的反射调用,因此 RpcInvoker 就是封装了反射调用的实现细节。

    调用过程的控制需要考虑哪些因素,RpcProcessor 需要提供什么样地调用控制服务呢?下面提出几点以启发思考:

    1. 效率提升
       每个请求应该尽快被执行,因此我们不能每请求来再创建线程去执行,需要提供线程池服务。
    2. 资源隔离
       当我们导出多个远程接口时,如何避免单一接口调用占据所有线程资源,而引发其他接口执行阻塞。
    3. 超时控制
       当某个接口执行缓慢,而 client 端已经超时放弃等待后,server 端的线程继续执行此时显得毫无意义。
    

     

    RPC 异常处理

    无论 RPC 怎样努力把远程调用伪装的像本地调用,但它们依然有很大的不同点,而且有一些异常情况是在本地调用时绝对不会碰到的。在说异常处理之前,我们先比较下本地调用和 RPC 调用的一些差异:

    1. 本地调用一定会执行,而远程调用则不一定,调用消息可能因为网络原因并未发送到服务方。
    2. 本地调用只会抛出接口声明的异常,而远程调用还会跑出 RPC 框架运行时的其他异常。
    3. 本地调用和远程调用的性能可能差距很大,这取决于 RPC 固有消耗所占的比重。

    正是这些区别决定了使用 RPC 时需要更多考量。当调用远程接口抛出异常时,异常可能是一个业务异常,也可能是 RPC 框架抛出的运行时异常(如:网络中断等)。业务异常表明服务方已经执行了调用,可能因为某些原因导致未能正常执行,而 RPC 运行时异常则有可能服务方根本没有执行,对调用方而言的异常处理策略自然需要区分。

    由于 RPC 固有的消耗相对本地调用高出几个数量级,本地调用的固有消耗是纳秒级,而 RPC 的固有消耗是在毫秒级。那么对于过于轻量的计算任务就并不合适导出远程接口由独立的进程提供服务,只有花在计算任务上时间远远高于 RPC 的固有消耗才值得导出为远程接口提供服务。

     

    总结

    至此我们提出了一个 RPC 实现的概念框架,并详细分析了需要考虑的一些实现细节。无论 RPC 的概念是如何优雅,但是“草丛中依然有几条蛇隐藏着”,只有深刻理解了 RPC 的本质,才能更好地应用。

     

    ----------------------------

    我的专栏,欢迎订阅交流

    展开全文
  • Json-RPC for java中文手册

    热门讨论 2008-09-05 21:52:37
    * 调用:rpc.getRpcObj('test.rpc.MyTestRpc').getTestMsg() * @return */ public String getTestMsg() { return "噢,成功了!"; } } 2、 JSP的JavaScript?中调用的方式,例如:alert(rpc.getRpcObj('test....
  • RPC和REST区别

    万次阅读 2020-01-04 10:42:01
    首先要明确一点:REST 实际上只是一种设计风格,它并不是标准。(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准)。 说说几个重要的概念: 1、REST 是面向资源的,这个概念非常重要...
  • RPCRPC框架

    万次阅读 2019-11-21 22:29:19
    RPC即 Remote Procedure Call ,远程过程调用,一种通信概念,编程模型概念 通俗讲,两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要...
  • 远程过程调用(RPC)详解

    万次阅读 2016-07-11 00:12:33
    本文介绍了什么是远程过程调用(RPC),RPC 有哪些常用的方法,RPC 经历了哪些发展阶段,以及比较了各种 RPC 技术的优劣。
  • 遇到的问题一: ... error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack fail...
  • RPC提高

    千次阅读 2015-08-22 15:50:13
    RPC 结构拆解 如下图所示。 RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架...
  • RPC基础

    千次阅读 2015-08-22 15:48:00
    分布式的技术越来越成熟,而RPC在其中扮演着不可或缺的角色,我们平时直接或者隐式的用RPC但是很多人并不一定清楚的理解什么事RPC   RPC 是什么? RPC 的全称是 Remote Procedure Call 是一种进程间通信...
  • RPC简介

    千次阅读 2009-05-12 11:42:00
    远程过程调用(RPC)是一个协议,程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节。(过程调用有时也称作函数调用,或子例行程序调用。)RPC使用client/server模型。请求程序是client...
  • RPC介绍

    2017-07-02 12:55:17
    RPC
  • RPC框架

    2016-07-19 10:35:14
    作者:用心阁 ...你的题目是RPC框架,首先了解什么叫RPC,为什么要RPCRPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一
  • RPC编程

    2012-09-20 09:30:24
    图 3 说明在客户机和服务器之间完成 RPC 涉及的步骤。 图 3. 在客户机和服务器之间完成 RPC 涉及的步骤   服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口。需要注册接口是因为,客户机在向...
  • 网上的解答是 : rpc的目的 就是通过像调用本地服务一样远程调用另一台服务器上的服务来完成需求。 我的理解就是调用这个远程服务的目的就是获取一个返回结果,然后客户端拿到这个结果再做相关的操作,那么问题来了...
  • clnt_create: RPC: Program not registered这个问题不知道怎么回事,希望大家给予指教,这个前几天搭好了,还可以用,今天重新启动就不行了,重装了也不行,怎么回事 日志: Jul 14 15:20:32 zsq177 rpc.mountd[7811...
  • RPC,remote procedure call,远程过程调用。分为REST风格RPC和SOAP RPC两种。一直以来,我对这两个概念都比较模糊,总是习惯性地将REST风格RPC称为WEB API,SOAP RPC称为WebService,应该是很不规范的。 那么REST...
  • RPC服务和HTTP服务对比

    万次阅读 多人点赞 2017-11-28 10:03:55
    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单地介绍一下两种形式的C/S架构,先说...
  • 2020-03-20 11:59:19,634 [xxl-rpc, NettyHttpServer-serverHandlerPool-962778749] ERROR c.x.r.r.n.i.n.s.NettyHttpServerHandler 93 - xxl-rpc request data empty. com.xxl.rpc.util.XxlRpcException: xxl-rpc ...
  • RPC(linux)报错:Cannot register service: RPC: Authentication error; why = Client credential too weak解决办法udo -i service portmap stopsudo -i rpcbind -i -wsudo -i service portmap start应该就能解决 ...

空空如也

1 2 3 4 5 ... 20
收藏数 62,421
精华内容 24,968
关键字:

rpc