Hadoop 中RPC使用

导入包:

理解:rpc是一种“远程过程调用协议”

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

具体使用:方面可以理解为,例如一个公司的后台数据支持此公司多个平台的使用,如果每个平台都写一套调用逻辑,如果后台逻辑做调整则每个平台都需要涉及;如果把各个平台访问后端的操作提前出来,放在服务端,来提供服务,则各个平台都可以使用;并且对平台开发也隐藏了后端。

开发注意:

rpc服务端和rpc客户端的通信协议接口。服务端和客户端都必须有,且路径一致

实例如下:

一:建两个项目:

客户端项目:democlient

服务器端项目:demonamenode

在服务器端和客户端开发都需要建相同的接口:网络通信双方都要遵循的协议

1>开发路径一致;--hadoop.rpctest

2>名称一致。       --DemoNamenodeProtocol.java

服务器端需要一个协议的实现类:例如DemoNamenodeImpl.java;

服务器端还需要把协议的实现发布到RPC服务上

这里测试实现:ServerPublisher.java

二:服务端项目实现后,需要 打包  Runnable JAR,并上传到服务器上,

发布:  java -jar   ***.jar

三:服务器端发布后,则客户端可以调用此服务。

代码实现附上:

---------------------------------------------------------------------start
自定义协议接口:DemoNamenodeProtocol

package hadoop.rpctest;
/*
 * 接口定义网络通信双方共同遵循的约定或协议
 */
public interface DemoNamenodeProtocol {
       
       //定义通信上方一致的版本号
       public static final long versionID = 1L;
//定义通信双方可以调用的方法
       public String getMetaData(String filePath);
}

--------------------------------------------------------------end

---------------------------------------------------------------------start
服务器端 实现类:DemoNamenodeImpl

package hadoop.rpctest;
public class DemoNamenodeImpl implements DemoNamenodeProtocol{
       public String getMetaData(String filePath) {
              return filePath + "-----我给你开玩笑呢" ;
       }
}

--------------------------------------------------------------end

---------------------------------------------------------------------start
服务发布类:ServerPublisher

package hadoop.rpctest;
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;
//用于把我们定义的业务功能发布为rpc服务
public class ServerPublisher {
    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
        // TODO Auto-generated method stub
        //获取一个创建rpc服务的builder
        Builder builder = new RPC.Builder(new Configuration());
        //通过Builder与我名定义的业务功能建立关系
        //设置服务端服务实例实现的接口--及通信双方功能遵循的协议
        builder.setProtocol(DemoNamenodeProtocol.class);
        //设置提供业务服务的具体实例对象
        builder.setInstance(new DemoNamenodeImpl());
        
        //设置服务进程所绑定的地址信息
        builder.setBindAddress("hadoop02");
        //设置服务进程的端口
        builder.setPort(10000);
        
        //用builder来创建一个服务  (socket服务)
        Server server = builder.build();
        
        //启动服务,这样就可以被客户端调用了
        server.start();
    }
}

--------------------------------------------------------------end

客户端访问测试:DemoClient

package clienttest;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import hadoop.rpctest.DemoNamenodeProtocol;
public class DemoClient {
public static void main(String[] args) throws IOException {
    //客户端访问rpc服务器代码实现
        InetSocketAddress addr = new InetSocketAddress("hadoop02",10000);
        DemoNamenodeProtocol demoNamenodeImpl = RPC.getProxy(DemoNamenodeProtocol.class, 1L, addr, new Configuration());
        String MetaData = demoNamenodeImpl.getMetaData("获取RPC服务:hello world");
        System.out.println(MetaData);
}
}

猜你喜欢

转载自my.oschina.net/u/3420885/blog/1634814