Hadoop 中RPC使用
2018-03-14 00:00
417 查看
导入包:
理解:rpc是一种“远程过程调用协议”
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
具体使用:方面可以理解为,例如一个公司的后台数据支持此公司多个平台的使用,如果每个平台都写一套调用逻辑,如果后台逻辑做调整则每个平台都需要涉及;如果把各个平台访问后端的操作提前出来,放在服务端,来提供服务,则各个平台都可以使用;并且对平台开发也隐藏了后端。
开发注意:
rpc服务端和rpc客户端的通信协议接口。服务端和客户端都必须有,且路径一致
实例如下:
一:建两个项目:
客户端项目:democlient
服务器端项目:demonamenode
在服务器端和客户端开发都需要建相同的接口:网络通信双方都要遵循的协议
1>开发路径一致;--hadoop.rpctest
2>名称一致。 --DemoNamenodeProtocol.java
服务器端需要一个协议的实现类:例如DemoNamenodeImpl.java;
服务器端还需要把协议的实现发布到RPC服务上
这里测试实现:ServerPublisher.java
二:服务端项目实现后,需要 打包 Runnable JAR,并上传到服务器上,
发布: java -jar ***.jar
三:服务器端发布后,则客户端可以调用此服务。
代码实现附上:
---------------------------------------------------------------------start
自定义协议接口:DemoNamenodeProtocol
--------------------------------------------------------------end
---------------------------------------------------------------------start
服务器端 实现类:DemoNamenodeImpl
--------------------------------------------------------------end
---------------------------------------------------------------------start
服务发布类:ServerPublisher
--------------------------------------------------------------end
客户端访问测试:DemoClient
理解: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); } }
相关文章推荐
- hadoop 使用内部RPC技术实现通信
- Hadoop学习笔记—3.Hadoop RPC机制、原理及使用
- Hadoop学习笔记—3.Hadoop RPC机制的使用
- 轻松使用Hadoop RPC
- 使用hadoop中的RPC框架实现远程调用
- Hadoop学习笔记—3.Hadoop RPC机制的使用
- 轻松使用Hadoop RPC
- Hadoop学习笔记—3.Hadoop RPC机制的使用
- 直接使用HADOOP-RPC的编码实例
- 轻松使用Hadoop RPC
- hadoop2.7.3源码解析之hadoop RPC使用
- Hadoop的 RPC机制的使用
- Hadoop学习笔记—3.Hadoop RPC机制的使用
- Hadoop1.X中使用RPC
- hadoop所封装的RPC框架简单使用
- Hadoop中RPC使用
- 轻松使用Hadoop RPC
- Hadoop2.X中使用RPC
- hadoop中RPC的使用方法---DEMO
- 轻松使用Hadoop RPC