Hadoop技术内幕HDFS-笔记4之远程调用

1.      hadoop远程过程调用

RPC:XML-RPC,JSON-RPC,CORBA,RMI(Remote Method Invocation),Haoop IPC(进程间通信)

RPC原理:允许本地程序(客户端)调用其他机器(服务器)上的过程,客户端使用参数将信息传送给调用方,通过返回值得到消息。

RPC的server在运行时会阻塞在接收消息的调用上,当接到客户端的请求后,会解包以获取请求参数;结束后返回值通过主程序打包发送给客户端。

1.1.  java RMI

依赖于java序列化机制

运行一个jvm里的java程序调用另一个jvm里的程序,客户端保留一个调用对象的接口,通过接口方式调用方法。而接口实际执行是在服务端,服务端才具有调用对象的实例,客户端可以简单理解为仅是一个代理。

远程对象,实现了一个或多个远程接口,远程接口声明了可以由外部系统调用的对象方法。(远程只是一个修饰语)

1、  定义一个远程接口(实验是失败的)

实际代码:

package test.rmi;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;

//必须继承Remote接口
//必须实现Serializable,增加序列化功能
public interface RMIQueryStatus extends Remote,Serializable{
	
	//方法必须抛出RemoteException异常
	String getFileName(String fileName) throws RemoteException;
}

2、定义一个远程对象的实现类
package test.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class RMIQueryStatusImpl extends UnicastRemoteObject 
	implements RMIQueryStatus{
	//声明一个版本ID(必须要有吗?可以试试)
	private static final long serialVersionUID = 1L;

	public RMIQueryStatusImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String getFileName(String fileName) throws RemoteException {
		// TODO Auto-generated method stub
		return fileName+" ,good,you get it!";
	}
}

3、开启JAVA RMI注册服务
	在cmd下运行rmiregistry (使用默认端口12090)可以增加 如rmiregistry 10000,即使用10000端口
5、	编写服务端主程序

package test.rmi;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class RMIQueryStatusServer {

	public static void main(String[] args) throws Exception {
		//创建远程对象实例
		RMIQueryStatusImpl rmiObj = new RMIQueryStatusImpl();
		//使用本地端口,12090
		LocateRegistry.createRegistry(12090);
		//绑定远程对象到名字
		Naming.rebind("RMI_URL", rmiObj);
		System.out.println("Server is ready.");
	}
}

 

运行报错(解决不了):

java.lang.ClassNotFoundException: test.rmi.RMIQueryStatus

5、客户端程序:

package test.rmi;

import java.rmi.Naming;

public class RMIQueryStatusClient {

	public static void main(String[] args) throws Exception{
		//从注册点获取一个远程对象
		RMIQueryStatus remoteObj = (RMIQueryStatus) Naming.lookup("RMI_URL");
		//调用方法
		String res = remoteObj.getFileName("hello");
		//输出结果
		System.out.println(res);
	}
}

 

--不知道书中是如何成功的。有时间将这个问题解决一下

posted @ 2014-06-30 23:00  jseven  阅读(739)  评论(0编辑  收藏  举报