1.RPC简介

Remote Procedure Call 远程过程调用协议

  RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

  RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

  hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)

RPC类似于webservice,将服务发布为一个service。RPC与hadoop没有关系,如果需要我们可以在普通的项目中使用RPC机制,RPC存在commons包中。

2.首先了解Socket通信过程:(以webservice为例)

3.RPC机制(以登录为例介绍)

用到的技术:动态代理+反射+socket通信

4.RPC的例子,按照上面的思路实现登录

登录的Service部署在linux虚拟机中,以服务的形式发布(RPC发布),登录的Controller在windows中生成代理对象然后进行登录。

1.Linux中利用RPC机制发布server(发布service作为server)

LoginService .java  (需要定义一个Long型的版本号)

package cn.qlq.rpc;

import java.sql.SQLException;

public interface LoginService {

    /**
* service's verionID
*/
public static final long versionID=1L;
/**
* login method
* @param username
* @param password
* @return
* @throws SQLException
*/
public abstract String login(String username,String password)throws SQLException;
}

LoginServiceImpl .java 实现类

package cn.qlq.rpc;

import java.sql.SQLException;

public class LoginServiceImpl implements LoginService {

    @Override
public String login(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return username+" logged successfully ";
} }

发布一个service作为server的类。

  1.创建builder

  2.绑定地址,端口,需要发布的类的接口,类的实例对象

  3.用builder.build()获取server

  4.用server.start()发布server

package cn.qlq.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.Server; /**
* publish loginService
*
* @author root
*
*/
public class Publisher { public static void main(String[] a) throws HadoopIllegalArgumentException, IOException {
Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("192.168.2.130").setPort(888).setProtocol(LoginService.class)
.setInstance(new LoginServiceImpl()); // create server and publish service
Server server = builder.build();
server.start(); } }

2.Windows利用RPC机制生成代理对象然后访问上面发布的server

1.需要将接口复制到windows中;(注意,这里的LoginService 接口所在包必须与linux中一样,否则会报协议异常)

package cn.qlq.rpc;

import java.sql.SQLException;

/**
* 登录的Service接口
* @author liqiang
*
*/
public interface LoginService { /**
* service's verionID
*/
public static final long versionID=1L;
/**
* login method
* @param username
* @param password
* @return
* @throws SQLException
*/
public abstract String login(String username,String password)throws SQLException;
}

2.生成代理对象,访问server进行登录:

package cn.qlq.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.sql.SQLException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC; /**
* 登录的controller,调用hadoop的RPC生成代理对象然后访问server
*
* @author liqiang
*
*/
public class LoginController { public static void main(String[] args) throws IOException, SQLException {
//1.生成代理对象
LoginService proxy = RPC.getProxy(LoginService.class, 1L, new InetSocketAddress("192.168.2.130", 10000),new Configuration());
//2.访问server
String result = proxy.login("meinv", "111111");
System.out.println(result);
} }

结果:

meinv logged successfully 

注意:发布server的接扣的包必须与调用的接口所在包一样,否则会报未知协议异常。

总结:

  RPC机制就像webservice一样,使得程序可以运行在不同的主机上,通过socket调用,RPC更简单。发布服务与调用服务都被封装为方法。

  这样做的好处就是当我们修改了实现登录方法的代码之后不需要重新部署客户端代码,实现和接口分离。

  我们也可以在普通的web项目中利用此机制,发布server实现功能共享。

Hadoop的RPC机制及简单实现的更多相关文章

  1. hadoop的RPC机制 -源码分析

    这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...

  2. Hadoop的RPC机制源码分析

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...

  3. 源码级强力分析hadoop的RPC机制

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...

  4. 【Hadoop】HDFS笔记(一):Hadoop的RPC机制

    RPC(Remote Procedure Call, 远程过程调用)主要面对两个问题: 1.对象调用方式: 2.序列/反序列化机制. Hadoop实现的RPC组件依赖于Hadoop Writable类 ...

  5. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  6. Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  7. 每天收获一点点------Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  8. Hadoop中的RPC机制

    1.  RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI ...

  9. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...

随机推荐

  1. Domino 邮箱服务器接收不存在的邮箱账号的邮件

    背景: domino邮箱服务器需要设置多个邮件账号邮件转到同一个邮箱账号. 比如:现在没有了 abc@mail.com 的邮箱账号.但是当用户发邮件给它的时候就发给Support@mail.com 原 ...

  2. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  3. 洛谷 P2764 最小路径覆盖问题 解题报告

    P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...

  4. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  5. helm详解

    helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用. 一.基本概念1.Helm的三个基本概念Chart:Helm应用(package) ...

  6. [noip][2017]

    Day1T1 30分思路: 倒着枚举答案z,用扩展欧几里得求解,如果能找到两个非负整数x,y使得ax+by=z则继续枚举,直到无解为止 100分: 最适用与考场上的做法,根据30分思路打表找规律. 3 ...

  7. 记录一次react相关总结

    背景说明:元旦接到一个管理后台的项目,是一个关于自定义专题的项目.通过后台的配置自定义专题,前端根据专题模块进行渲染数据.由于管理后台是react做的前后分离,对于一个后端的我来说写写js也算是浅尝一 ...

  8. (java保留n位小数)precise math function 北京信息科技大学第十届ACM程序设计竞赛 第2题

    precise math function Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Othe ...

  9. 64位Ubuntu系统下ROP攻击

    64位Ubuntu系统下ROP攻击 基础知识 ROP攻击 ROP全称为Retrun-oriented Programmming(面向返回的编程)是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可 ...

  10. echarts2 饼图处理标签文字过长使之达到指定字数换行的目的

    在使用echarts2的过程中,有时会遇到标签文字过长导致显示不完整的问题.例如: 这时候就需要用到 标签里的formatter 回调函数来处理这种情况了. 方式一:  formatter : ' { ...