背景:使用Java IDE访问服务器的时候对节点之间的相互通信一头雾水,客户端是如何传递数据给服务端,服务端又是怎样向客户端返回结果的。mark下RPC做个学习记录。
百科下RPC的概念
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
服务端方法接口
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13import org.apache.hadoop.ipc.VersionedProtocol; public interface MyBusiness extends VersionedProtocol { //定义ID号 //定义一个签名,通过这个ID,就能区分在客户端调用的时候,具体调用哪个实现 //要求:名称必须叫versionID public static long versionID = 1l; //定义自己的方法 public String sayHello(String name); }
服务端方法实现
复制代码
服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import 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; } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import 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(); } }
客户端
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import 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各个节点间内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复