RPC实现的底层原理及应用
2024-09-02 05:31:18
摘要:RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode之间,Jobtracker与Tasktracker之间等。可以说:Hadoop的运行就是建立在RPC基础之上的。
1.hadoop下载文件流程
hadoop下载文件时,先请求NameNode,返回数据块与位置信息,再从DataNode对应位置取数据拼成完整文件。大致流程如下图:
上图中,可以将Socket程序封装成一个工具框架,可以在任何地方调用,就不用为每个场景单独写程序了。这就是RPC机制。
2.RPC具体过程
RPC通信的过程如下:
如上图,中间部分的细节经过封装,可以不用关心具体实现,服务端启动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
可以看到已经收到消息:登录失败。再次发送请求:
这里看到接收消息,登录成功。服务端接收消息如下:
在服务端可以看到客户端依次发来的请求。
最新文章
- VS2013 - 自定义新建文件模版
- ActiveMQ 复杂类型的发布与订阅
- PowerShell全自动分配CPU
- iOS App 转移
- MongoDB (九) MongoDB 投影
- [转]Ubuntu 常用快捷键10个
- iis认证方式
- 关于nginx架构探究(2)
- java 无法割符日期字符串转yyyy-MM-dd hh:mm:ss
- Girl Develop It Chapter Leaders at 2015 Annual Leadership Summit
- [转载] KAFKA分布式消息系统
- Spring系列之装配Bean
- java中使用hashSet的特性,判断数组是否有重复值
- Centos7源码安装mariadb
- Python开发技术详解PDF
- 学会学习:高效学习方式(使用vscode-snippet有感)
- Python开发——15.协程与I/O模型
- Navicat导入sql server数据库
- 几个经典的css技巧
- Meta referrer标签的简要介绍