RPC:Remote Procdure Call,远程过程调用;
- 它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。
- 类似于C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。
模拟 RPC 的客户端、服务端、通信协议三者如何工作的。
以mkdirs为例
模拟RPC协议,接口中定义一个版本号和mkdirs方法
public interface RPCProtocal {
long versionID = 001;
void mkdirs(String path);
}
服务端实现接口协议,重写mkdirs方法,创建RPC服务
public class Server implements RPCProtocal {
// 实现通信接口
public static void main(String[] args) throws IOException {
// 启动服务
RPC.Server server = new RPC.Builder(new Configuration())
.setBindAddress("localhost") // 服务器地址
.setPort(7777) // 端口号
.setProtocol(RPCProtocal.class) // 通信协议
.setInstance(new Server()) // 创建一个实例
.build();
System.out.println("start server");
server.start();
}
public void mkdirs(String path) {
System.out.println("服务器接收到客户端请求,mkdir的path为:" + path);
}
}
客户端获取服务器代理,通过服务器代理调用mkdirs方法
public class Client {
public static void main(String[] args) throws IOException {
// 获取客户端对象
RPCProtocal client = RPC.getProxy(RPCProtocal.class, RPCProtocal.versionID,
new InetSocketAddress("localhost", 7777), new Configuration());
System.out.println("start client");
client.mkdirs("/input");
}
}
总结
-
1)接口协议中有一个版本号的一个mkdirs方法
-
2)服务端用来创建RPC服务以及实现接口协议中的方法
- RPC服务定义服务器地址、端口号、通信协议、以及创建一个实例;通过实例来调用start方法
-
3)客户端获取服务器代理(需要获取到通信协议的class,版本号,以及RPC服务定义的地址和端口号),通过服务器代理调用mkdirs方法