欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RPC机制

程序员文章站 2022-06-01 21:32:28
...
@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

1.概述

RPC(Remote Procedure Call)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

PRC协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中,RPC跨越了传输层和应用层,RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。

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

2.框架

RPC通常采用客户端服务器模型,其框架主要有以下几部分

  • 通信模块:实现请求应该协议。主要分为同步方式和异步方式。
  • stub程序:客户端和服务器均包含stub程序,可以看做代理程序。使得远程函数表现的跟本地调用一样,对用户程序完全透明。
  • 调度程序:接受来自通信模块的请求消息,根据标识选择stub程序处理。并发量大一般采用线程池处理。
  • 客户程序/服务过程:请求发出者和请求的处理者。


RPC机制

3.代码实现

//Message.java
package China.hadoop.RPC;

public interface Message
{
    public static final int versionID = 10010;

    public String sayHi(String name);
}
//RPCClient.java
package China.hadoop.RPC;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class RPCClient
{
    public static void main(String[] args) throws IOException
    {
        Message proxy = RPC.getProxy(Message.class, 10010,
                new InetSocketAddress("172.16.247.175", 9527),
                new Configuration());
        String result = proxy.sayHi("test");
        System.out.println(result);
        RPC.stopProxy(proxy);
    }
}
//RPCServer.java
package China.hadoop.RPC;

import java.io.IOException;

import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.Server;

public class RPCServer implements Message
{
    @Override
    public String sayHi(String name)
    {
        return "Hi" + name;
    } 

    public static void main(String[] args)
            throws HadoopIllegalArgumentException, IOException
    {
        Configuration conf = new Configuration();
        Server server = new RPC.Builder(conf).setProtocol(Message.class)
                .setInstance(new RPCServer()).setBindAddress("172.16.247.175")
                .setPort(9527).build();
        server.start();
    }
}

相关标签: RPC