WritableRpcEngine
是 Hadoop RPC 默认的实现。在 3.2.1 版本已经被标识为@Deprecated
定义接口协议
/**
* 协议接口
*/
public interface ClicentNameNodeProtocol {
//1. 定义协议的ID
public static final long versionID = 1L;
/**
* 拿到元数据方法,协议通信前会访问元数据
*/
public String getMetaData(String path);
}
实现接口协议
/**
* 实现协议结构
*/
public class ClicentNameNodeImpl implements ClicentNameNodeProtocol {
public String getMetaData(String path) {
// 数据存放的路径,有多少块,块大小,校验和,存储在哪一台机器上
return path + ":3 - {BLOCK_1,BLOCK_2,BLOCK_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();
}
}
创建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);
}
}