模拟RPC调用

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gltncx11/article/details/84830371
今日推荐