导入包:
理解: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);
}
}