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