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"));
}
}
相关文章推荐
- java通信协议初步解析
- HDFS中的SecondaryNameNode节点解析
- 常见通信协议区别——tcp、udp、rpc、http、socket
- 轻量级跨平台消息传递协议XML-RPC深度解析
- iOS远程真机之iTunes与iPhone的通信协议usbmuxd解析
- 服务端使用c++实现websocket协议解析及通信
- Android 蓝牙通信及自定义消息协议的解析和生成
- Ubuntu下GCC之libpcap库数据库通信协议解析基础框架代码
- HTTP(二)http协议通信步骤及数据解析
- HDQ单线通信协议时序解析
- MAVLink协议通信分析——(三)消息解析
- Hadoop学习<四>--HDFS的RPC通信原理总结
- [置顶] 通信协议中多字节数据的解析
- 字符串通信协议解析函数
- Http与RPC通信协议的 比较
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(四) 数据解析
- Android java层与C层通过localsocket通信、通信协议制定与解析。
- 【C#串口编程计划】通信协议解析 -- byte[]与常用类型的转换
- Http与RPC通信协议的比较
- Hadoop源码解析之 rpc通信 client到server通信