模擬RPC呼叫
阿新 • • 發佈:2018-12-05
以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(); } }