项目一:作为服务端:
ClientNamenodeProtocol 这是一个接口,相当于是调用RPC之间的协议
package com.thp.bigdata.protocol;
public interface ClientNamenodeProtocol {
public static final long versionID = 1L; // 会读取这个版本号,可以和客户端的不一样, 没有校验
public String getMetaData(String path);
}
MyNameNode : 是实现类:
package com.thp.bigdata.server;
import com.thp.bigdata.protocol.ClientNamenodeProtocol;
public class MyNameNode implements ClientNamenodeProtocol {
// 模拟namenode的业务方法之一:查询元数据
@Override
public String getMetaData(String path) {
return path + " 3- {BLK_1,BLK_2} ... ";
}
}
PublishServiceUtil 服务端的启动程序:
package com.thp.bigdata.start;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.RPC.Server;
import com.thp.bigdata.protocol.ClientNamenodeProtocol;
import com.thp.bigdata.server.MyNameNode;
/**
* 启动rpc的服务端
* @author 汤小萌
*
*/
public class PublishServiceUtil {
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("localhost")
.setPort(8888)
.setProtocol(ClientNamenodeProtocol.class)
.setInstance(new MyNameNode());
Server server = builder.build();
server.start();
}
}
服务端工程:
ClientNamenodeProtocol 这个接口就是协议,是跟服务端工程的接口完全一致,包名也要一样.
MyHdfsClient 是 客户端启动的程序:
package com.thp.bigdata.client;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import com.thp.bigdata.protocol.ClientNamenodeProtocol;
public class MyHdfsClient {
public static void main(String[] args) throws IOException {
ClientNamenodeProtocol namenodeProxy = RPC.getProxy(ClientNamenodeProtocol.class, 1L, new InetSocketAddress("localhost",8888), new Configuration());
System.out.println("==================");
System.out.println(namenodeProxy.getClass());
System.out.println("==================");
String metaData = namenodeProxy.getMetaData("/llp.txt");
System.out.println("调用RPC返回的数据 : " + metaData);
}
}
返回的namenodeProxy 其实是RPC框架生成的一个代理对象,当客户端需要调用服务端的方法时,服务端会更新实现类生成一个对象然后传输给客户端.