导入包:

理解:rpc是一种“远程过程调用协议”
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
具体使用:方面可以理解为,例如一个公司的后台数据支持此公司多个平台的使用,如果每个平台都写一套调用逻辑,如果后台逻辑做调整则每个平台都需要涉及;如果把各个平台访问后端的操作提前出来,放在服务端,来提供服务,则各个平台都可以使用;并且对平台开发也隐藏了后端。
开发注意:
rpc服务端和rpc客户端的通信协议接口。服务端和客户端都必须有,且路径一致
实例如下:

一:建两个项目:
客户端项目:democlient
服务器端项目:demonamenode
在服务器端和客户端开发都需要建相同的接口:网络通信双方都要遵循的协议
1>开发路径一致;--hadoop.rpctest
2>名称一致。 --DemoNamenodeProtocol.java
服务器端需要一个协议的实现类:例如DemoNamenodeImpl.java;
服务器端还需要把协议的实现发布到RPC服务上
这里测试实现:ServerPublisher.java
二:服务端项目实现后,需要 打包 Runnable JAR,并上传到服务器上,
发布: java -jar ***.jar
三:服务器端发布后,则客户端可以调用此服务。
代码实现附上:
---------------------------------------------------------------------start
自定义协议接口:DemoNamenodeProtocol
1package hadoop.rpctest; 2/* 3 * 接口定义网络通信双方共同遵循的约定或协议 4 */ 5public interface DemoNamenodeProtocol { 6 7 //定义通信上方一致的版本号 8 public static final long versionID = 1L; 9//定义通信双方可以调用的方法 10 public String getMetaData(String filePath); 11}
--------------------------------------------------------------end
---------------------------------------------------------------------start
服务器端 实现类:DemoNamenodeImpl
1package hadoop.rpctest; 2public class DemoNamenodeImpl implements DemoNamenodeProtocol{ 3 public String getMetaData(String filePath) { 4 return filePath + "-----我给你开玩笑呢" ; 5 } 6}
--------------------------------------------------------------end
---------------------------------------------------------------------start
服务发布类:ServerPublisher
1package hadoop.rpctest; 2import java.io.IOException; 3import org.apache.hadoop.HadoopIllegalArgumentException; 4import org.apache.hadoop.conf.Configuration; 5import org.apache.hadoop.ipc.RPC; 6import org.apache.hadoop.ipc.RPC.Builder; 7import org.apache.hadoop.ipc.RPC.Server; 8//用于把我们定义的业务功能发布为rpc服务 9public class ServerPublisher { 10 public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { 11 // TODO Auto-generated method stub 12 //获取一个创建rpc服务的builder 13 Builder builder = new RPC.Builder(new Configuration()); 14 //通过Builder与我名定义的业务功能建立关系 15 //设置服务端服务实例实现的接口--及通信双方功能遵循的协议 16 builder.setProtocol(DemoNamenodeProtocol.class); 17 //设置提供业务服务的具体实例对象 18 builder.setInstance(new DemoNamenodeImpl()); 19 20 //设置服务进程所绑定的地址信息 21 builder.setBindAddress("hadoop02"); 22 //设置服务进程的端口 23 builder.setPort(10000); 24 25 //用builder来创建一个服务 (socket服务) 26 Server server = builder.build(); 27 28 //启动服务,这样就可以被客户端调用了 29 server.start(); 30 } 31}
--------------------------------------------------------------end
客户端访问测试:DemoClient
1package clienttest; 2import java.io.IOException; 3import java.net.InetSocketAddress; 4import org.apache.hadoop.conf.Configuration; 5import org.apache.hadoop.ipc.RPC; 6import hadoop.rpctest.DemoNamenodeProtocol; 7public class DemoClient { 8public static void main(String[] args) throws IOException { 9 //客户端访问rpc服务器代码实现 10 InetSocketAddress addr = new InetSocketAddress("hadoop02",10000); 11 DemoNamenodeProtocol demoNamenodeImpl = RPC.getProxy(DemoNamenodeProtocol.class, 1L, addr, new Configuration()); 12 String MetaData = demoNamenodeImpl.getMetaData("获取RPC服务:hello world"); 13 System.out.println(MetaData); 14} 15}