您的位置:首页 > 大数据 > Hadoop

HDFS各个节点间的通信协议-RPC解析

2018-03-06 21:00 246 查看

背景:使用Java IDE访问服务器的时候对节点之间的相互通信一头雾水,客户端是如何传递数据给服务端,服务端又是怎样向客户端返回结果的。mark下RPC做个学习记录。

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

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

public interface MyBusiness extends VersionedProtocol {

//定义ID号
//定义一个签名,通过这个ID,就能区分在客户端调用的时候,具体调用哪个实现
//要求:名称必须叫versionID
public static long versionID = 1l;

//定义自己的方法
public String sayHello(String name);
}
服务端方法实现import java.io.IOException;

import org.apache.hadoop.ipc.ProtocolSignature;

public class MyBusinessImpl implements MyBusiness {

@Override
public String sayHello(String name) {
System.out.println("*************服务端被调用了***************");
return "Hello " + name;
}

@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {
// 通过ID构造一个签名
return new ProtocolSignature(MyBusiness.versionID,null);
}

@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
//直接返回ID
return MyBusiness.versionID;
}

}服务端
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.Server;

public class MyRPCServer {

public static void main(String[] args) throws Exception {
// 创建一个Hadoop的RPC Server,并把我们的程序部署上来

RPC.Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("localhost");//设置Server的地址
builder.setPort(7788);// Server运行的端口

//将自己的程序部署到RPC Server上
builder.setProtocol(MyBusiness.class);
//将接口的实现部署上来
builder.setInstance(new MyBusinessImpl());//是真正对象

//通过Builder创建一个RPC Server
Server server =  builder.build();

//启动Server
server.start();
}

}
客户端import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import demo.rpc.server.MyBusiness;

public class MyRPCClient {

public static void main(String[] args) throws Exception {
// 创建一个RPC的客户端,调用Server的功能
//通过RPC调用Server端的功能,拿到是一个代理对象

MyBusiness proxy = RPC.getProxy(MyBusiness.class, //在服务器部署的接口
MyBusiness.versionID, //在服务器端部署的ID号
new InetSocketAddress("localhost", 7788), //服务器端的地址
new Configuration());

//通过proxy的代理对象去调用服务器端的功能
System.out.println(proxy.sayHello("Tom"));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: