1. 程式人生 > >模擬RPC呼叫

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

在這裡插入圖片描述