首页 > 代码库 > Hadoop技术内幕HDFS-笔记4之远程调用

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

 

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