概述
背景:使用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"));
}
}
最后
以上就是自然可乐为你收集整理的HDFS各个节点间的通信协议-RPC解析的全部内容,希望文章能够帮你解决HDFS各个节点间的通信协议-RPC解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复