Hadoop-rpc调用案例,服务端,客户端代码案例
1. Hadoop-rpc框架 在hadoop中提供了一个rpc框架,通过这个rpc框架可以编写一个rpc服务端程序,然后发布出去供客户端调用。 1.1.服务端代码 其中服务端(example-hadoop-rpc-server),其中代码结果如下: 代码说明: ClientNamenodeProtocal 接口定义 NameNode 接口的实现 ServerPublisher 用于发布服务的类 若写服务端代码,需要一个服务端的接口,其中接口如下: package cn.toto.rpc.protocal; public interface ClientNamenodeProtocal { //为了保证客户端和服务端的版本是一致的,如果没有定义将报错 public static final long versionID = 1L; public String getMetaData(String path); } 接口的实现类是: package cn.toto.rpc.server; import cn.toto.rpc.protocal.ClientNamenodeProtocal; public class NameNode implements ClientNamenodeProtocal { @Override public String getMetaData(String path) { return path + " 2 {BLK1,BLK2} {BLK1:min1,mini2} {BLK2:mini4,mini5}"; } } 用于发布的接口类: package cn.toto.rpc.server; import java.io.IOException; 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 cn.toto.rpc.protocal.ClientNamenodeProtocal; public class ServerPublisher { public static void main(String[] args) throws Exception, IOException { Builder builder = new RPC.Builder(new Configuration()); //暴露的仅仅是ClientNamenodeProtocal.class中的new NameNode()实现的方法 builder.setBindAddress("localhost").setPort(8787) .setProtocol(ClientNamenodeProtocal.class) .setInstance(new NameNode()); //构建一个Server,并且启动一下 Server server = builder.build(); server.start(); } } 1.2.客户端 写完客户端后,可以开始写客户端调用进行测试了。 客户端的代码如下: 代码说明: ClientNamenodeProtocal 和服务端一样的接口 HdfsClient 用于调用的客户端代码 接口代码如下: package cn.toto.rpc.protocal; public interface ClientNamenodeProtocal { //为了保证客户端和服务端的版本是一致的,如果没有定义将报错 public static final long versionID = 1L; public String getMetaData(String path); } 客户端代码: package cn.toto.rpc.client; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import cn.toto.rpc.protocal.ClientNamenodeProtocal; public class HdfsClient { /** * 在使用这个之前,需要先启动服务端 */ public static void main(String[] args) throws IOException { //通过这种方式获取到一个远程调用对象 ClientNamenodeProtocal nameNode = RPC.getProxy(ClientNamenodeProtocal.class, 1L, new InetSocketAddress("localhost",8787), new Configuration()); //调用服务端的接口,看看返回的结果 String metaData = nameNode.getMetaData("/a.doc"); System.out.println(metaData); } } 输出的结果: