WritableRpcEngine 是Hadoop RPC 默認的實現.
在3.2.1版本已經被標識爲 @Deprecated [棄用] , 所以個人覺得精力應該放到ProtobufRpcEngine 上面會更合適一點.
1.定義接口協議
/**
* 協議接口
*/
public interface ClicentNameNodeProtocol {
//1. 定義協議的ID
public static final long versionID = 1L;
/**
* 拿到元數據方法,協議通信前會訪問元數據
*/
public String getMetaData(String path);
}
2.實現接口協議
/**
* 實現協議結構
*/
public class ClicentNameNodeImpl implements ClicentNameNodeProtocol {
public String getMetaData(String path) {
// 數據存放的路徑,有多少塊,塊大小,校驗和,存儲在哪一臺機器上
return path + ":3 - {BLOCK_1,BLOCK_2,BLOCK_3....";
}
}
3.創建Server服務, 並註冊協議.啓動RPC服務.
/**
* 啓動RPC服務
*/
public class Server {
public static void main(String[] args) throws IOException {
//1. 構建RPC框架
RPC.Builder builder = new RPC.Builder(new Configuration());
//2. 綁定地址
builder.setBindAddress("localhost");
//3. 綁定端口
builder.setPort(7777);
//4. 綁定協議
builder.setProtocol(ClicentNameNodeProtocol.class);
//5. 調用協議實現類
builder.setInstance(new ClicentNameNodeImpl());
//6. 創建服務
RPC.Server server = builder.build();
//7. 啓動服務
server.start();
}
}
4.創建Client服務,請求數據接口
/**
* 訪問RPC服務
*/
public class Client {
public static void main(String[] args) throws IOException {
//1. 拿到RPC協議
ClicentNameNodeProtocol proxy = RPC.getProxy(ClicentNameNodeProtocol.class, 1L,
new InetSocketAddress("localhost", 7777), new Configuration());
//2. 發送請求
String metaData = proxy.getMetaData("/meta");
//3. 打印元數據
System.out.println(metaData);
}
}
5.測試結果