Hadoop之——RPC通信实例,hadooprpc通信


转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45922715

一、 RPC(remote procedure call)

  不同java进程间的对象方法的调用。
  一方称作服务端(server),一方称作客户端(client)。
  server端提供对象,供客户端调用的,被调用的对象的方法的执行发生在server端。
  RPC是hadoop框架运行的基础。

二、通过rpc小例子获得的认识

      1.服务端提供的对象必须是一个接口,接口extends VersioinedProtocal

      2.客户端能够的对象中的方法必须位于对象的接口中。

三、RPC实例

     1、创建MyBiz接口,此接口继承hadoop中的VersionedProtocol接口

package com.lyz.hadoop.rpc;

import org.apache.hadoop.ipc.VersionedProtocol;

/**
 * 设置代理对象的返回值必须为接口类型
 * 此接口用于接收RPC客户端创建代理对象的返回值
 * @author liuyazhuang
 *
 */
public interface MyBiz extends VersionedProtocol{
	/**
	 * 定义的接口
	 * @param name
	 * @return
	 */
	public String hello(String name);
	/**
	 * 版本号
	 */
	long VERSION = 1001;

}

    2、创建MyBiz接口的实现类MyBizImpl

package com.lyz.hadoop.rpc;

import java.io.IOException;

/**
 * MyBiz接口的实现类
 * @author liuyazhuang
 *
 */
public class MyBizImpl implements MyBiz {

	@Override
	public long getProtocolVersion(String protocol, long clientVersion)
			throws IOException {
		return MyBiz.VERSION;
	}

	@Override
	public String hello(String name){
		System.out.println("服务端被调用了");
		return "hello "+name;
	}
}

    3、创建RPC服务端

package com.lyz.hadoop.rpc;

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

/**
 * RPC服务端
 * @author liuyazhuang
 *
 */
public class MyServer {
	public static final String SERVER_ADDRESS = "localhost";
    public static final int SERVER_PORT = 12345;
	public static void main(String[] args) throws Exception {
		/**
		 * 构造一个rpc server
		 * @param instance:实例中的方法会被客户端调用
		 * @param bindAddress:绑定的地址用于监听连接
		 * @param port:绑定的端口用于监听连接
		 * @param conf:the Configuration to use
		 */
		Server server = RPC.getServer(new MyBizImpl(), SERVER_ADDRESS, SERVER_PORT, new Configuration());
		server.start();
	}
}

     4、创建RPC客户端

package com.lyz.hadoop.rpc;

import java.net.InetSocketAddress;

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

/**
 * RPC客户端
 * @author liuyazhuang
 *
 */
public class MyClient {
	public static void main(String[] args) throws Exception {
		MyBiz proxy = (MyBiz) RPC.waitForProxy(MyBiz.class, 
				MyBiz.VERSION, 
				new InetSocketAddress(MyServer.SERVER_ADDRESS, MyServer.SERVER_PORT), 
				new Configuration());
		String result = proxy.hello("world");
		System.out.println("客户端的调用结果为:"+result);
		RPC.stopProxy(proxy);
	}
}

  5、 注意:下图中1和2位置处的版本号必须相同

  



相关内容