首页 > 代码库 > 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); }}
--不知道书中是如何成功的。有时间将这个问题解决一下
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。