RPC机制

@Author  : Spinach | GHB
@Link    : http://blog.youkuaiyun.com/bocai8058

1.概述

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

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

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

2.框架

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

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

在这里插入图片描述

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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学僧来啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值