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
可以看到已经收到消息:登录失败。再次发送请求:

这里看到接收消息,登录成功。服务端接收消息如下:

在服务端可以看到客户端依次发来的请求。
RPC实现的底层原理及应用的更多相关文章
- Neo4j图数据库简介和底层原理
现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- spring框架的IOC的底层原理
1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...
- 深入研究Sphinx的底层原理和高级使用
深入研究Sphinx的底层原理和高级使用
- 深入研究Node.js的底层原理和高级使用
深入研究Node.js的底层原理和高级使用
- HashMap的底层原理
简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...
- 操作系统底层原理与Python中socket解读
目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...
- Servlet底层原理、Servlet实现方式、Servlet生命周期
Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...
- Spring Aop底层原理详解
Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)
随机推荐
- JAVA字符串转日期或日期转字符串【转】
JAVA字符串转日期或日期转字符串[转] 文章中,用的API是SimpleDateFormat,它是属于java.text.SimpleDateFormat,所以请记得import进 来! 用法: S ...
- archsummit_bj2016
http://bj2016.archsummit.com/schedule 大会日程 2016年12月02日,星期五 7:45-9:00 签到 8:45-9:00 开始入场 9:00-9:30 开场致 ...
- 基于Java实现的冒泡排序算法
冒泡排序是一种简单基础的排序算法,相信在大学课堂里老师已经讲过了,现在我基于Java来实现一遍. 简述 冒泡排序正如其关键词一样,杂乱的气泡经过浮动,最后大的气泡飘到了上面而小的气泡在下面,无序的元素 ...
- 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...
- Android自定义zxing扫描界面的实现
首先,我们需要导入zxing的jar文件,其次复制所需要的资源文件以及放入自己需要添加的资源文件,复制出源码的必要相关类文件.对布局文件进行一定的修改,再修改CaptureActivity与Viewf ...
- javaee 第14周
1.web server Web Server中文名称叫网页服务器或web服务器.WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务.Web服务器可以解析( ...
- const函数的使用
const知道吗?解释其作用. 1.const 修饰类的成员变量,表示成员常量,不能被修改. 2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数. 3. ...
- Linux内核网络数据包处理流程
Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...
- git 超时 时长 设置?
[Pipeline] { (Checkout) [Pipeline] checkout > git.exe rev-parse --is-inside-work-tree # timeout=1 ...
- 从零实现一个http服务器
我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多“科班”往往不如后天努力的“非科班”.所以,我们需要重新给“专业”和“专家”下一个定义:所谓专业,就是别人搞你不搞,这就是你的“专业” ...