摘要: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  

  

可以看到已经收到消息:登录失败。再次发送请求:

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

在服务端可以看到客户端依次发来的请求。

RPC实现的底层原理及应用的更多相关文章

  1. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  2. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  3. spring框架的IOC的底层原理

    1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...

  4. 深入研究Sphinx的底层原理和高级使用

    深入研究Sphinx的底层原理和高级使用

  5. 深入研究Node.js的底层原理和高级使用

    深入研究Node.js的底层原理和高级使用

  6. HashMap的底层原理

    简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...

  7. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

  8. Servlet底层原理、Servlet实现方式、Servlet生命周期

    Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...

  9. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

随机推荐

  1. 微服务dubbo面试题

    dubbo的工作原理? dubbo支持的序列化协议? dubbo的负载均衡和高可用策略?动态代理策略? dubbo的SPI思想? 如何基于dubbo进行服务治理.服务降级.失败重试以及超时重试? du ...

  2. ios学习笔记 UITableView(纯代码) (一)

    参考 “https://www.cnblogs.com/ai-developers/p/4557487.html” UITableViewCell 有一个代码重用 减少资源的浪费 参考  https: ...

  3. AJPFX对选择和冒泡两种排序的理解

    冒泡排序和直接选择排序都是排序中比较简单和容易实现的算法,先简单说说两者的区别:先以按照元素从小到大为:冒泡排序:将相邻元素两两比较,如果有比较大的,就把比较大的放在右边,这样的结果就是一轮排序完毕后 ...

  4. 【转】android技术栈

    android技术栈-现有使用的进行一个汇总(初稿) 2017年04月24日 16:19:40 阅读数:2004 android技术栈 开发工具 Android studio 开发语言 Java 自动 ...

  5. 初识Vivado

    Vivado 设计套件包括高度集成的设计环境和新一代从系统到 IC 级的工具,这些均建立在共享的可扩展数据模型和通用调试环境基础上.这也是一个基于 AMBA AXI4 互联规范.IP-XACT IP ...

  6. js toString() 方法 Number() 方法 等 类型转换

    1.1 数字类型转字符串 String() 变量.toString() toString() 方法 toString() 方法可把一个逻辑值转换为字符串,并返回结果. 1.2 字符串转数字类型 Num ...

  7. delphi中使用自定义资源的方法

    如果要在delphi中使用自定义资源文件*.res文件,比如一个光标,此时可以采用下列步骤: 1,创建包含相应的资源文件,这里是创建一个包含自定义光标的res文件. 2,在主窗体的pas文件中加入编译 ...

  8. POJ-1200-Crazy Search(字符串Hash)

    Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33142 Accepted: 9079 Descrip ...

  9. OpenJudge-百练-2755-动规

    动态规划的话,我们中心思想就是,设一个num数组,num[ i ][ j ] 代表从i的大小中,取出 j 种物品的方法数. 当不取j种物品的时候,我们就让num[ i ][ j ] =num[ i ] ...

  10. [CF] 37 E. Trial for Chief

    如果固定了一个中心,那么只需要考虑从它开始最远染到的那些点究竟染了几次. 上下左右不同的点连1边,相同的连0边,跑单源最短路就可以啦. lyd讲的是统计到最远黑点+1的最小值,但是#58数据全是白点, ...