RPC
这个随笔是对徐葳(b站号:大数据1024_徐葳)老师关于RPC部分讲解的一个整理。
一、RPC含义
1、RPC全称是Remote Procedure Call远程程序调用,顾名思义就是通过网络向远程计算机请求服务,而无需知道底层网络技术的协议
2、RPC是典型的CS架构,提供服务的远程计算机充当服务器,请求服务的机子是客户端。本质是跨机器,跨进程的一种协议,首先,客户端发送一个有进程参数的调用信息到服务进程,等待应答消息,服务机从启动后一直阻塞直到收到客户机的调用信息,获得进程参数,计算结果,发送答复消息。
3、RPC是Hadoop架构通信的基础,正常启动hadoop下(不包含yarn),有三个进程:NameNode,DataNode,SecondaryNameNode,相应的有三个RPC协议,ClientProtocol(HDFS客户端与NameNode通信接口),DataNodeProtocol(DataNode与 NameNode通信接口),NameNodeProtocol(SecondaryNameNode与NameNode通信接口)
二、RPC简单实现
2.1自定义接口
点击查看代码
public interface MyProtocol extends VersionedProtocol {
long versionID =12345L;
String hello(String name);
}
2.2接口实现类
点击查看代码
public class MyProtocolImp implements MyProtocol{
@Override
public String hello(String name) {
System.out.println("hello方法被调用了");
return "hello "+name;
}
@Override
public long getProtocolVersion(String s, long l) throws IOException {
return versionID;
}
@Override
public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
return new ProtocolSignature();
}
}
2.3服务器端代码
点击查看代码
public class MyServer {
public static void main(String[] args) throws Exception{
//创建RPC Server构建器
Configuration cof = new Configuration();
RPC.Builder builder = new RPC.Builder(cof);
//设置构建器相关参数
builder.setBindAddress("localhost")
.setPort(1234)
.setProtocol(MyProtocol.class) //设置RPC接口
.setInstance(new MyProtocolImp()); //设置RPC接口实现类
// 构建RPC Server
RPC.Server server = builder.build();
//启动
server.start();
System.out.println("服务器启动");
}
}
2.4客户端代码
点击查看代码
public class MyClient {
public static void main(String[] args) throws Exception{
//通过Socket连接PRC Server
InetSocketAddress addr = new InetSocketAddress("localhost", 1234);
//获得RPC Server代理
Configuration conf = new Configuration();
MyProtocol proxy = RPC.getProxy(MyProtocol.class, MyProtocol.versionID, addr, conf);
//调用对应的服务
String res = proxy.hello("joseph");
System.out.println("RPC客户端接收到的结构: "+res);
}
}