RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,
而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,
而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,
RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格
hadoop 是基于java NIO实现的RPC协议,具体架构如下:
客户端跟服务器通过Listener建立连接,Listener中关注Selector对OP_ACCEPT,建立连接后就交给Reader线程处理,Reader线程的Selector中注册监听OP_READ,读取里面的请求数据,包装成Call,放到callQueue里,然后很多Handler线程去处理这些Call,处理后的结果数据放到Connectin的responseQueue里,由Responder线程发送回客户端。
hadoop RPC 实例代码
1. 接口定义,接口中需要定义versionID
package com.liangjya.hadoop.demo;
public interface IServer {
public static final long versionID=100;
public String sayHello(String name);
}
2. 接口实现
package com.liangjya.hadoop.demo;
public class Server implements IServer {
@Override
public String sayHello(String name) {
return " hello "+name;
}
}
3. RPC服务端
package com.liangjya.hadoop.demo;
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;
public class RPCServer {
public static void main(String[] args) {
try {
Builder server =new RPC.Builder(new Configuration())
.setProtocol(IServer.class)
.setInstance(new Server())
.setBindAddress("simulate")
.setPort(8080);
server.build().start();
} catch (HadoopIllegalArgumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4 客户端
package com.liangjya.hadoop.demo;
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) {
try {
IServer server=RPC.getProxy(IServer.class, 100, new InetSocketAddress("192.168.31.100", 8080), new Configuration());
System.out.println(server.sayHello("liangjya"));
} catch (IOException e) {
e.printStackTrace();
}
}
}