Hadoop3.2.1 【 HDFS 】源码分析 : RPC原理 [五] WritableRpcEngine 使用

 

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.测试结果

发布了336 篇原创文章 · 获赞 846 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/105629868