Hadoop的RPC分析

一、基础知识

  原理 http://www.cnblogs.com/edisonchou/p/4285817.html,这个谢了一些rpc与hadoop的例子。

  用到了java的动态代理,服务端实现一个接口,客户端得到这个接口的实现类,客户端通过自定义的versionID来标志一对服务端和客户端。

二、代码

  2.1 接口

package rpc;

import org.apache.hadoop.ipc.VersionedProtocol;
//默认情况下,不同版本号的RPC Client和Server之间不能相互通信,因此客户端和服务端通过版本号标识。

public interface RPCable extends VersionedProtocol {
	public static final long versionID = 10010;
	public String sayHi(String name) ;
	
}

  我原来没继承VersionedProtocol接口,也成功了。接口不能在实现接口

  2.2 服务端

package rpc;

import java.io.IOException;

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


//动态代理:客户端和服务端同时实现一个接口
//可以在linux和win下   
//不同main进程下相互调用

//是不同进程见的方法调用
//底层走的是jav的rmi

public class RPCServer implements RPCable{
	
	public String sayHi(String name) {
		return "HI!"+name;
	}

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		//方法的调用连   因为每次调用返回的是this
		Server server = new RPC.Builder(conf).setProtocol(RPCable.class).
		setInstance(new RPCServer()).setBindAddress("localhost").
		setPort(9527).build();
		server.start();
		  
	}

	@Override
	public ProtocolSignature getProtocolSignature(String arg0, long arg1,
			int arg2) throws IOException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getProtocolVersion(String arg0, long arg1) throws IOException {
		// TODO Auto-generated method stub
		return 0;
	};

}

  我原来没继承VersionedProtocol类,那么服务端不需要下面的两个方法,继承了以后必须写。

  2.3 客户端

package 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 Exception {
		// TODO Auto-generated method stub
		//协议一般是.class
		RPCable proxy = RPC.getProxy(RPCable.class, 10010,
				new InetSocketAddress("localhost",9527), new Configuration());
		String res = proxy.sayHi("!!!!!!!!!!!!");
		System.out.println(res);
		RPC.stopProxy(proxy);
	}

}

三、结束

  rpc不受系统、地理位置的限制。

  不相信的话可以在和护短打断点,一步一步发现进入了;额服务器端。

  做的时候如果不知道使用那个类哭下的东西,可以打开对应类的class文件,可能是黑色,不是源码,那么点击attach source找到hadoop的源码包就可以了,导进去就看到的是普通的和咱的java类似的文件,可以看看里面的蚕食来自那个包。

原文地址:https://www.cnblogs.com/hxsyl/p/6138292.html