一、Java的动态代理对象

实现代码如下:

  1.接口类MyService

package hdfs.proxy;

public interface MyService {

    public void method1();

    public void method2();
}

  2.接口实现类MyServiceImpl

package hdfs.proxy;

public class MyServiceImpl implements MyService {

    @Override
public void method1() {
System.out.println("************ method1 ***************");
} @Override
public void method2() {
System.out.println("************ method2 ***************"); } }

  3.测试类TestMain

package hdfs.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class TestMain { public static void main(String[] args) {
//创建真正的对象
MyService obj = new MyServiceImpl(); //obj.method1(); ---> 都是直接调用真正对象
//obj.method2(); ---> 都是直接调用真正对象 /*
* Object Proxy.newProxyInstance(ClassLoader loader, 类加载器,代理对象跟真正对象是同一个类加载器
Class<?>[] interfaces, 真正对象实现的接口
InvocationHandler h) 如何处理客户端的调用
返回一个代理对象 */
//生成obj的代理对象,并且重新method2的逻辑
MyService proxy = (MyService) Proxy.newProxyInstance(TestMain.class.getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 如何处理客户端的调用
if(method.getName().equals("method2")){
//客户端调用了method2
System.out.println("in proxy method2");
return null;
}else{
//其他方法不感兴趣
return method.invoke(obj, args);
}
}
}); //通过代理对象进行调用
proxy.method1();
proxy.method2(); } }

console:

二、RPC:远程过程调用

1.服务端:发布一个接口(MyBusiness)到RPC Server上

    实现类:MyBusinessImpl

    如果要把程序发布到Hadoop的RPC Server上,必须实现一个接口VersionedProtocol

2.客户端:调用服务器端的功能

    得到一个签名必须与服务器发布的签名的一样

得到服务器端的对象(代理对象)

实现代码如下: 

 3.MyBusiness

package demo.proxy.rpc.server;

import org.apache.hadoop.ipc.VersionedProtocol;

public interface MyBusiness extends VersionedProtocol{
//指定一个版本号,使用这个版本号来创建签名
public static long versionID = 1l; //定义自己的业务方法
public String sayHello(String name);
}

  4.MyBusinessImpl

package demo.proxy.rpc.server;

import java.io.IOException;

import org.apache.hadoop.ipc.ProtocolSignature;

public class MyBusinessImpl implements MyBusiness{

    @Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {
//使用versionID创建签名
return new ProtocolSignature(versionID, null);
} @Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
// 返回ID
return versionID;
} @Override
public String sayHello(String name) {
System.out.println("*****调用Server端的方法******");
//业务方法
return "Hello" + name;
} }

  5.MyRPCServer

package demo.proxy.rpc.server;

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.Server; public class MyRPCServer {
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
//ʹ创建一个RPC Server
RPC.Builder builder = new RPC.Builder(new Configuration());
//指定Server的地址接口
builder.setBindAddress("localhost");
builder.setPort(7788); //发布程序
builder.setProtocol(MyBusiness.class);//定义的接口
builder.setInstance(new MyBusinessImpl());//发布的接口的实现 //创建RPC Server
Server server = builder.build();
server.start();
}
}

6.MyRPCClient

package demo.proxy.rpc.client;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC; import demo.proxy.rpc.server.MyBusiness; public class MyRPCClient { public static void main(String[] args) throws Exception {
//调用Server的功能
MyBusiness proxy = RPC.getProxy(MyBusiness.class,//调用的接口
MyBusiness.versionID,//版本的ID,必须跟服务器一致
new InetSocketAddress("localhost", 7788), //服务器的地址ַ
new Configuration()); //调用服务器端的方法
System.out.println(proxy.sayHello("梦里南柯")); } }

先启动Server端,再启动Client端

大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC的更多相关文章

  1. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  2. 大数据 --> 分布式文件系统HDFS的工作原理

    分布式文件系统HDFS的工作原理 Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数 ...

  3. 最近整理出了有关大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互等1.7G的学习资料,有视频教程,源码,课件,工具,面试题等等。这里将珍藏多年的资源免费分享给各位小伙伴们

    大数据,微服务,分布式,Java,Python,Web前端,产品运营,交互 领取方式在篇尾!!! 基础篇.互联网架构,高级程序员必备视频,Linux系统.JVM.大型分布式电商项目实战视频...... ...

  4. jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

    代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...

  5. 大数据笔记(四)——操作HDFS

    一.Web Console:端口50070 二.HDFS的命令行操作 (一)普通操作命令 HDFS 操作命令帮助信息: hdfs dfs + Enter键 常见命令 1.  -mkdir 在HDFS上 ...

  6. 大数据入门第六天——HDFS详解

    一.概述 1.HDFS中的角色 Block数据: HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是 ...

  7. 大数据小白系列——HDFS(2)

    这里是大数据小白系列,这是本系列的第二篇,介绍一下HDFS中SecondaryNameNode.单点失败(SPOF).以及高可用(HA)等概念. 上一篇我们说到了大数据.分布式存储,以及HDFS中的一 ...

  8. 大数据小白系列——HDFS(1)

    [注1:结尾有大福利!] [注2:想写一个大数据小白系列,介绍大数据生态系统中的主要成员,理解其原理,明白其用途,万一有用呢,对不对.] 大数据是什么?抛开那些高大上但笼统的说法,其实大数据说的是两件 ...

  9. 大数据开发实战:MapReduce内部原理实践

    下面结合具体的例子详述MapReduce的工作原理和过程. 以统计一个大文件中各个单词的出现次数为例来讲述,假设本文用到输入文件有以下两个: 文件1: big data offline data on ...

随机推荐

  1. JAVA基础面向对象分析

    面向对象内存的分析: 一:内存的分类 1:栈(tack) 2:堆(heop) 3: 静态区 4:代码区 二:引用数据类型内存特点 三:引用数据类型传值的特点 四:引用数据类型在作为参数时的特点 面向对 ...

  2. babel版本问题

    在运行webpack命令的时候总是报错,原来是因为babel版本的问题 我安装的webpack3  babel版本是6 babel-loader是8 后来把babel改成7就可以了

  3. Widget代码讲解

    参考:https://zhuanlan.zhihu.com/p/28225011 QT版本为5.12.4 1.main.cpp #include "widget.h" #inclu ...

  4. HDU 1594 find the max

    数序问题. 题意是说 一个数列 a1,a2,--ai,--an;  x=i , y = ai:找两个点斜率绝对值.!最大. 第一次没找绝对值,--认真读题. .. x 每次加1 . 仅仅须要找 相邻的 ...

  5. dajngo ORM查询中select_related的作用,博客主题的定制,从数据库中按照年月筛选时间

    1.dajngo ORM查询中select_related的作用 select_related()方法一次性的把数据库关联的对象都查询出来放入对象中,再次查询时就不需要再连接数据库,节省了后面查询数据 ...

  6. 基于ELK进行邮箱访问日志的分析

    公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...

  7. 关于ES6的新特性

    1  let声明变量 01    let声明的变量,不可重复声明,比如 let   a=1  : let   a=2 :这样申明会报错 02    let声明的变量,有块级作用域,比如  if( ){ ...

  8. scrollIntoView 与平滑滚动

    经常有这样的需求:点击一个链接(内链)跳转到当前页面中间某个部分.对于这样的需求,很容易想到使用锚点实现.但有一个问题:滚动一步到位,太生硬了. 我还是比较喜欢平滑滚动.HTML5 中提供了 CSS ...

  9. 北京太速科技股份有限公司产品手册V201903020

    如果您无法正常查看,请点击在线浏览                                           如果您无法正常查看,请点击在线浏览 了解更多产品信息,请扫描二维码,期待您的关注 ...

  10. c/c++基础篇之数据类型转换

    C/C++常见的数据类型转换 1.      常见的单类基本类型转换 (1)强制类型转换 如: int a=(int)(9.87)  结果a=9 char c=(char)(97)  结果为c=’a’ ...