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);

    }
}
posted @ 2022-12-12 17:19  不要给我歪!  阅读(159)  评论(0编辑  收藏  举报