HDFS代码分析-RPC框架

什么是RPC框架:

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

简单来说就是:

服务器A和服务器B同时都内部实现同一个抽象类,但是服务器B有对抽象类的具体实现的子类,而服务器A没有,但是服务器A使用动态代理来实现这个抽象类,果服务器A调用对象函数,这时代理会拦截函数调用,携带函数参数发送socket请求给服务器B,服务器B可以调用子类的具体实现的函数并且将函数返回值使用socket方式返回.

抽象类:

package com.sy.rpc.service;

public interface LoginServerInterface {

    public static final long versionID = 1L;
    String login(String username,String password);


}

服务器A代码:

package com.sy.rpc;

import com.sy.rpc.service.LoginServerInterface;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;
import java.net.InetSocketAddress;

public class RpcClientScript {
    public static void main(String[] args) throws IOException {
        LoginServerInterface loginServer =RPC.getProxy(LoginServerInterface.class,
                LoginServerInterface.versionID,
                new InetSocketAddress("127.0.0.1",1300), new Configuration());
        String str = loginServer.login("老王","123");
        System.out.println(str);

    }
}

服务器B代码:

package com.sy.rpc;

import com.sy.rpc.service.LoginServerInterface;
import com.sy.rpc.service.imp.LoginServerImp;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;

public class RpcServerScript {
    public static void main(String[] args) throws IOException {
        RPC.Builder builder = new RPC.Builder(new Configuration());
        builder.setBindAddress("127.0.0.1");
        builder.setPort(1300);
        builder.setProtocol(LoginServerInterface.class);
        builder.setInstance(new LoginServerImp());
        RPC.Server server = builder.build();
        server.start();
    }
}

服务器B对抽象类具体实现:

package com.sy.rpc.service.imp;

import com.sy.rpc.service.LoginServerInterface;

public class LoginServerImp implements LoginServerInterface {
    @Override
    public String login(String username, String password) {
        return username+" logged in successfully!";
    }
}
发布了70 篇原创文章 · 获赞 18 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40325734/article/details/88387015