一、基础知识
原理 http://www.cnblogs.com/edisonchou/p/4285817.html,这个谢了一些rpc与hadoop的例子。
用到了java的动态代理,服务端实现一个接口,客户端得到这个接口的实现类,客户端通过自定义的versionID来标志一对服务端和客户端。
二、代码
2.1 接口
package rpc;
import org.apache.hadoop.ipc.VersionedProtocol;
//默认情况下,不同版本号的RPC Client和Server之间不能相互通信,因此客户端和服务端通过版本号标识。
public interface RPCable extends VersionedProtocol {
public static final long versionID = 10010;
public String sayHi(String name) ;
}
我原来没继承VersionedProtocol接口,也成功了。接口不能在实现接口
2.2 服务端
package rpc;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.ProtocolSignature;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
//动态代理:客户端和服务端同时实现一个接口
//可以在linux和win下
//不同main进程下相互调用
//是不同进程见的方法调用
//底层走的是jav的rmi
public class RPCServer implements RPCable{
public String sayHi(String name) {
return "HI!"+name;
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
//方法的调用连 因为每次调用返回的是this
Server server = new RPC.Builder(conf).setProtocol(RPCable.class).
setInstance(new RPCServer()).setBindAddress("localhost").
setPort(9527).build();
server.start();
}
@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1,
int arg2) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
// TODO Auto-generated method stub
return 0;
};
}
我原来没继承VersionedProtocol类,那么服务端不需要下面的两个方法,继承了以后必须写。
2.3 客户端
package rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
//打印在客户端 拼接字符串确实在服务端
public class RPCClient {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//协议一般是.class
RPCable proxy = RPC.getProxy(RPCable.class, 10010,
new InetSocketAddress("localhost",9527), new Configuration());
String res = proxy.sayHi("!!!!!!!!!!!!");
System.out.println(res);
RPC.stopProxy(proxy);
}
}
三、结束
rpc不受系统、地理位置的限制。
不相信的话可以在和护短打断点,一步一步发现进入了;额服务器端。
做的时候如果不知道使用那个类哭下的东西,可以打开对应类的class文件,可能是黑色,不是源码,那么点击attach source找到hadoop的源码包就可以了,导进去就看到的是普通的和咱的java类似的文件,可以看看里面的蚕食来自那个包。