Hadoop源码分析之RPC(Remote Procedure Call Protocol)

2019-03-28 13:13|来源: 网络

理解这个RPC是不是的先去理解哈动态代理 好多invoke,还有Socket网络编程

先来张eclipse下IPC源码图:


先来看看RPC.java,既然是动态代理,自然会想到Invoke()方法了,先来看看RPC中的Invoker中的invoke()方法

private static class Invoker implements InvocationHandler {
    private InetSocketAddress address;
    private UserGroupInformation ticket;
    private Client client;
    private boolean isClosed = false;

    public Invoker(InetSocketAddress address, UserGroupInformation ticket,
                  Configuration conf, SocketFactory factory) {
      this.address = address;
      this.ticket = ticket;
      this.client = CLIENTS.getClient(conf, factory);
    }

    public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
      final boolean logDebug = LOG.isDebugEnabled();
      long startTime = 0;
      if (logDebug) {
        startTime = System.currentTimeMillis();
      }

      ObjectWritable value = (ObjectWritable)
        client.call(new Invocation(method, args), address,
                    method.getDeclaringClass(), ticket);
      if (logDebug) {
        long callTime = System.currentTimeMillis() - startTime;
        LOG.debug("Call: " + method.getName() + " " + callTime);
      }
      return value.get();
    }
   
    /* close the IPC client that's responsible for this invoker's RPCs */
    synchronized private void close() {
      if (!isClosed) {
        isClosed = true;
        CLIENTS.stopClient(client);
      }
    }
  }

可以看出动态代理里的invoke()方法其实是RPC里的invocation对方法名,参数做了封装,可以看invocation类的

相关问答

更多
  • Web Service是RPC的更高层次的代表? 是的。 Web服务是RPC的具体实现。 在最底层,所有Web服务正在连接到套接字,使用HTTP协议协商发送在远程空间中执行的有效负载(甚至可能在所有消费者知道的同一台计算机上)。 所有这些抽象都是其核心RPC。 Is Web Service a higher level representation of RPC? Yes, it is. A web service is a specific implementation of RPC. At its lo ...
  • 他们这样做是因为这是SPI总线的本质,这就是总线通信的完成方式。 看: 数据传输 每个SPI时钟周期都是全双工数据传输。 主器件在MOSI引脚上发送一个位,从器件读取它,而从器件在MISO引脚上发送一个位,主器件读取它。 即使您只需要单向数据传输,此序列也是如此。 看到这张图片(来自维基百科) 因此每个传输都涉及两个固定大小的移位寄存器(例如8位)。 一个在主设备中,一个在从设备中。 在每个时钟周期中,数据都会移位。 如果继续并输出足够的脉冲数(与寄存器的大小一样多),主机和从机将交换寄存器值。 现在您可以 ...
  • 关于hadoop:您需要确保core-site.xml namenode条目在hadoop配置中服务于0.0.0.0而不是127.0.0.1(localhost)。 重要的是,由于某种原因,clouderas vm发行版默认为localhost。 Regarding hadoop : You need to make sure the core-site.xml namenode entry is serving to 0.0.0.0 instead of 127.0.0.1 (localhost) in ...
  • 你在这里混淆了术语。 服务器正在侦听TCP端口。 这意味着它绑定到端口并在其上启动接受循环。 每次新客户端连接到此端口时,accept函数都会与该客户端建立TCP 连接 ,然后返回侦听端口。 服务器应用程序是同时处理多个操作的多线程或异步应用程序:侦听新客户端,与每个连接的客户端通信以及执行实际工作。 典型的RPC服务器看起来像 status = RpcServerUseProtseqEp(pszProtocolSequence, RPC_C_L ...
  • 一旦Window被激活,似乎可以调用Broker 。 正如我所尝试的那样,它应该像这样完成: public MainPage() { this.InitializeComponent(); Window.Current.Activated += Current_Activated; } private void Current_Activated(object sender, Windows.UI.Core.WindowActivatedEventArgs e) { Window. ...
  • 可能最简单的解决方案是松散地遵循RMI的路径。 你从一个接口和一个实现开始: interface FooService { Bar doThis( String param ); String doThat( Bar param ); } class FooServiceImpl implements FooService { ... } 您只将接口部署到服务器端,并将实现部署到服务器端。 然后为了获得一个客户端对象,你创建一个动态代理。 它的调用处理程序除了序列化服务的类名,方法名和参数 ...
  • 远程过程调用概念仅仅是客户端 - 服务器通信模型中的请求 - 答复机制的抽象。 客户端向(远程)服务器发送请求,等待响应,并在接收到后,根据收到的信息继续执行。 这就对了。 这基本上是在调用NETCONF操作时发生的情况。 你引用的规范 : ONC RPC协议基于远程过程调用模型,类似于本地过程调用模型。 在本地情况下,调用者将参数放在某个明确指定的位置(例如寄存器窗口)中。 然后它将控制转移到程序,并最终重新获得控制权。 此时,从指定的位置提取过程的结果,并且调用者继续执行。 远程过程调用模型类似。 一个 ...
  • 与使用PHP中的游标一起使用,与直接从SELECT语句访问行相比,需要三个额外的步骤。 第一步是使用oci_new_cursor()函数在PHP中准备游标资源,然后使用该函数将其绑定到适当的参数。 第二步是在oci_bind_by_name()函数上添加一个参数 第三步,在执行通常的SQL语句之后,在游标资源上调用oci_execute() 。 代码: //Connection does not change $db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (P ...
  • 好的,找到原因,我连接到纱线资源管理器的错误端口。 正确的配置是:yarn.resourcemanager.address = localhost:8032 Ok, found the reason, I connected to the wrong port for the yarn resourcemanager. The correct configuration is: yarn.resourcemanager.address=localhost:8032