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