Java 的RPC:remote procedure call 远程过程调用
RPC:remote procedure call 远程过程调用
Hadoop实现了RPC协议
(*) Server
(*) Client
========================================================================
(*) RPC服务Server端
1、首先定义自己的接口实现Hadoop的VersionedProtocol接口
2、定义接口的实现类
3、RPC定义在Hadoop服务端的的主程序
-------------------------------------------------------------------------------------------------------------------------------
1、首先定义自己的接口实现Hadoop的VersionedProtocol接口
package demo.rpc.server;
import org.apache.hadoop.ipc.VersionedProtocol;
public interface MyBusiness extends VersionedProtocol {
//定义自己的签名,就是一个ID号。通过这个ID号,就能区分在客户端调用的时候,调用的是哪个具体的实现
//变量的名字必须叫:versionID
public static long versionID = 1l;
//定义自己的方法
public String sayHello(String name);
}
---------------------------------------------------------------------------------------------------------------------------
2、定义接口的实现类
package demo.rpc.server;
import java.io.IOException;
import org.apache.hadoop.ipc.ProtocolSignature;
public class MyBusinessImpl implements MyBusiness {
@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {
//返回我们的签名
return new ProtocolSignature(versionID, null);
}
@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
// 返回你的ID
return versionID;
}
@Override
public String sayHello(String name) {
System.out.println("************ 服务器端被调用了 **************");
//自己的方法
return "Hello " + name;
}
}
----------------------------------------------------------------------------------------------------------------
3、RPC定义在Hadoop服务端的的主程序
package demo.rpc.server;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class MyRPCServer {
public static void main(String[] args) throws Exception {
//使用HDFS的RPC Server来部署我们的程序
RPC.Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("localhost");
builder.setPort(7788);
//部署我们的程序
builder.setProtocol(MyBusiness.class);//部署接口
builder.setInstance(new MyBusinessImpl());//定义接口实现类,客户端调用的时候,需要指定相同的签名
//生成RPC Server
Server server = builder.build();
server.start();
}
}
=======================================================================
(*) RPC服务Client端
1、得到一个RPC客户端
2、RPC调用部署在Server上代理对象
/*
MyBusiness proxy = RPC.getProxy(MyBusiness.class, //调用的接口
MyBusiness.versionID, //需要跟服务器定义的签名一样
new InetSocketAddress("localhost", 7788), //服务器的地址
new Configuration());
*/
package demo.rpc.client;import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import demo.rpc.server.MyBusiness;
public class MyRPCClient {
public static void main(String[] args) throws Exception {
//得到一个RPC的客户端,通过这个客户端去调用RPC Server的程序
MyBusiness proxy = RPC.getProxy(MyBusiness.class, //调用的接口
MyBusiness.versionID, //需要跟服务器定义的签名一样
new InetSocketAddress("localhost", 7788), //服务器的地址
new Configuration());
//通过RPC代理对象来调用服务器的方法
System.out.println(proxy.sayHello("Tom"));
}
}