摘要: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. PowerShell~语法与运算符

    基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...

  2. Git之提交项目到远程github

    1.在分支dev下,默认本地工作区有项目project 2. git add project  [添加项目到暂存区] 3. git commit project -m "提交项目" ...

  3. redis安装(windows)

    软件环境:由于redis只有linux版,而windows版是微软自己做的,最新版只到3.2.100(linux的版本已经到5.x) 1.1.1.  redis安装 首先去官网下载安装包 得到的安装文 ...

  4. 使用cordova把h5应用打包成apk

    由于h5应用开发不是本例重点,因此直接提供一个最简单的h5应用代码,此应用使用vue-cli框架开发 此h5应用叫vue1,用webstrom打开vue1,进行npm install安装引用 vue1 ...

  5. 51nod 1267 4个数和为0

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出&qu ...

  6. SQLite概述

    SQLite概述 这个教程帮助您理解SQLite是什么,它如何不同于SQL,为什么它是必要的和它的方式处理应用程序数据库.   SQLite是一个库,实现了一个独立的软件,serverless zer ...

  7. ArrayList Vector LinkedList分析

    1.创建 ArrayList 的底层是一个数组.  ArrayList<String> list1 = new ArrayList<>(); list1.add("a ...

  8. win10使用自带虚拟机没有Hyper-V场景

    开始咯~ 1.打开控制面板-程序和功能-启用或关闭Windows功能 2.发现下面并没有Hyper-v 真难受~~~   然后百度了一下原来是家庭版的win10没有.那就只能往下面看咯~ 3.在桌面添 ...

  9. vue render {} 对象 说明文档

    Vue学习笔记进阶篇——Render函数 http://www.mamicode.com/info-detail-1906336.html 深入data object参数 有一件事要注意:正如在模板语 ...

  10. python之路——函数进阶

    阅读目录   楔子 命名空间和作用域 函数嵌套及作用域链 函数名的本质 闭包 本章小结 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x> ...