RPC 实现的底层原理及应用

rpc

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。Hadoop 的进程间交互都是通过 RPC 来进行的,比如 Namenode 与 Datanode 之间,Jobtracker 与 Tasktracker 之间等。可以说:Hadoop 的运行就是建立在 RPC 基础之上的。

1.hadoop下载文件流程

hadoop 下载文件时,先请求 NameNode,返回数据块与位置信息,再从 DataNode 对应位置取数据拼成完整文件。大致流程如下图:

rpc-1.png

上图中,可以将 Socket 程序封装成一个工具框架,可以在任何地方调用,就不用为每个场景单独写程序了。这就是RPC机制。

2.RPC具体过程

RPC 通信的过程如下:

rpc-2.png

如上图,中间部分的细节经过封装,可以不用关心具体实现,服务端启动 rpc server,客户端调用 rpc get,如此两个业务类之间调用像本地一样,数据的封装用 Socket 协议直接封装在 TCP 报文中,效率更高

3.程序实现 RPC 调用

定义通讯接口,在服务断和客户端进行通讯时必须同时实现这个接口,接口类代码如下:

package WL.LearnHadoop.rpc;

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

服务端实现接口的类,代码如下:

package WL.LearnHadoop.rpc;
 
public class LoginServiceImpl implements LoginServiceInterface {
    @Override
    public String login(String username, String password) {
        System.out.println("recept info:[username]:" + username + "[password]:" + password);     
        if(username.equals("test") && password.equals("123"))
            return "login in:" + username;
        else
            return "login error:" + username ;
    }
}

服务端发布服务供客户端调用,代码如下:

package WL.LearnHadoop.rpc;
 
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;
import org.apache.hadoop.ipc.RPC.Server;
 
public class ServerStart {
    public static void main(String[] args)
        throws HadoopIllegalArgumentException, IOException {
        Configuration conf=new Configuration();
        Builder builder= new RPC.Builder(conf);
        builder.setInstance(new LoginServiceImpl())
            .setBindAddress("192.168.10.11")
            .setPort(10000)
            .setProtocol(LoginServiceInterface.class);
        Server server=builder.build();
        server.start();  
   }
}

客户端向服务端发送请求并获取响应,代码如下:

package WL.LearnHadoop.rpc;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
 
public class LoginController {
    public static void main(String[] args) throws IOException {
        Configuration conf=new Configuration();
        LoginServiceInterface proxy = RPC.getProxy(LoginServiceInterface.class, 1L,
            new InetSocketAddress("hadoop1", 10000), conf);
        String res=proxy.login("test", "123");
        System.out.println(res);
    }
}

代码中需引入 hadoop 的相关包,common 包即可。将服务端代码打包 RPCServer.jar,放到集群节点上,执行命令开启服务:

java -jar RPCServer.jar

客户端发送请求,这里在 windows 系统的 eclipse 启动程序,服务端类中判断用户名为 test,密码为 123 才为成功:

请求参数为: test 1234

rpc-3.png

可以看到已经收到消息:登录失败。再次发送请求:

rpc-4.png

这里看到接收消息,登录成功。服务端接收消息如下:

rpc-5.png

在服务端可以看到客户端依次发来的请求。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论