以hadoop中RPC调用来模拟
自定义协议(客户端和服务端要遵循这个协议)
package com.aimuti.hadoop.rpc.protocol;
/*
*客户端和服务端(namenode)调用的通信接口
*/
public interface ClientNamenodeProtocol{
//调用时会读取这个版本号,可以和客户端不同
public static final long versionID=1;
//假设要实现的方法
public String getInfo(String path);
}
服务端
package com.aimuti.hadoop.rpc.server;
import com.zimuti.hadoop.rpc.protocol.ClientNamenodeProtocol;
/*
*提供业务服务,模拟hadoop客户端RPC调用namenode
*namenode要返回信息,这个类要实现一个接口,方便以后两端通信
*/
public class HadoopNamenode implements ClientNamenodeProtocol{
//模拟namenode的业务之一:查询元数据
//参数是client请求获取文件的路径
public String getInfo(String path){
//返回元数据信息
return path+":1-{BLK_1,BLK_2}";
}
}
客户端(我们写在了本地,实际可以是不在本地)
package com.aimuti.hadoop.rpc.client;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import com.aimuti.hadoop.rpc.protocol.ClientNamenodeProtocol;
/*
*客户端访问namenode要调用RPC框架
*hadoop中有RPC类封装底层的通信过程
*protocol(协议):限制了客户端只能调用namenode的协议中的方法
*/
public class HadoopClient{
public static void main(String[] args) throws Exception{
/*
*返回实现这个接口的一个代理对象namenodeProtocol,调用本地的方法(就像调用远程过程一样),
*客户端发送一个请求,(方法名getInfo,参数"/aimuti"),然后客户端的代理对象拦截了这个请求,
*调用socket流发给服务端,然后服务端接收到这个请求,吧方法名和参数取出,这样就知道调用的是哪个方法
*然后在namenode调用这个实例对象,返回处理结果,最后通过网络socket发给代理对象
*/
ClientNamenodeProtocol namenodeProtocol = RPC.getProxy(ClientNamenodeProtocol.class,
1L,new InetSocketAddress("localhost",7777),new Configuration());
Srting info = namenode.getInfo("/aimuti");
System.out.println(info);
}
}
启动服务
package com.aimuti.hadoop.rpc.server;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.RPC.Server;
import com.aimuti.hadoop.rpc.protocol.ClientNamenodeProtocol;
//此类用来发布写好的服务
public class StartService{
public static void main(String[] args) throws Exception{
Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("localhost").setPort(7777)
.setProtocol(ClientNameodeProtocol.class).setInstance(new HadoopNamenode());
Server server = builder.build();
server.start();
}
}