Hadoop HDFS RPC通信和Proxy(代理)

RPC和Proxy

RPC(Remote Procedure Call):远程调用过程,调用代码不在本地执行,实现调用者与被调用者之间的连接和通信。
基于Client Server,相当于DFSClient 相当于客户端。NameNode集群相当与Server。

Proxy:代理,是一种设计模式,提供了对目标对象的另一种访问方式。通过代理对象访问目标对象。
代理分为静态代理和动态代理。
静态代理:接口的定义,实现接口。被代理对象与对象实现相同的接口。
动态代理:接口的定义不需要实现接口(匿名内部类 + 反射invoke)。

HDFS使用的是动态代理

程序示例

依赖

<dependency>
    <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-common</artifactId>
     <version>2.7.3</version>
 </dependency>
 <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-hdfs</artifactId>
     <version>2.7.3</version>
 </dependency>
 <dependency>
     <groupId>org.apache.hadoop</groupId>
     <artifactId>hadoop-client</artifactId>
     <version>2.7.3</version>
 </dependency>

接口

package server;

import org.apache.hadoop.ipc.VersionedProtocol;

/**
 * 接口
 */
public interface MyInterface extends VersionedProtocol {

    /**
     *  版本号
     */
    static long versionID = 2020;

    /**
     * 测试方法
     * @param param
     * @return
     */
    String test(String param);
}
package server;

import org.apache.hadoop.ipc.ProtocolSignature;
import java.io.IOException;

/**
 * 接口实现类 实际对象
 */
public class MyInterfaceImpl implements MyInterface {

    @Override
    public String test(String param) {
        return "调用test方法:" + param;
    }

    /**
     * 返回版本号
     * @param s
     * @param l
     * @return
     * @throws IOException
     */
    @Override
    public long getProtocolVersion(String s, long l) throws IOException {
        return versionID;
    }

    /**
     * 返回签名信息
     * @param s
     * @param l
     * @param i
     * @return
     * @throws IOException
     */
    @Override
    public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
        return new ProtocolSignature(versionID, null);
    }
}

RPC服务

package server;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import java.io.IOException;

/**
 * Hadoop RPC服务
 */
public class MyRPCServer {

    public static void main(String[] args) throws IOException {
        // 利于Hadoop实现RPC通信
        // 1、通过RPC建立通信
        RPC.Builder builder = new RPC.Builder(new Configuration());
        // 2、定义server参数
        builder.setBindAddress("localhost");
        builder.setPort(9000);
        // 3、部署程序
        builder.setProtocol(MyInterface.class);
        builder.setInstance(new MyInterfaceImpl());
        // 4、开启server
        Server server = builder.build();
        server.start();

    }
}

RPC客户端

package client;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import server.MyInterface;
import java.io.IOException;
import java.net.InetSocketAddress;

/**
 * 客户端
 */
public class MyRPCClient {

    public static void main(String[] args) throws IOException {
        // 使用RPC框架调用server
        MyInterface proxy = RPC.getProxy(MyInterface.class,
                MyInterface.versionID,
                new InetSocketAddress("localhost", 9000),
                new Configuration());
        System.out.println(proxy.test("hello world"));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章