一、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 {@Overridepublic void method1() {System.out.println("************ method1  ***************");}@Overridepublic 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() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 如何处理客户端的调用if(method.getName().equals("method2")){//客户端调用了method2System.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{@Overridepublic ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {//使用versionID创建签名return new ProtocolSignature(versionID, null);}@Overridepublic long getProtocolVersion(String arg0, long arg1) throws IOException {// 返回IDreturn versionID;}@Overridepublic 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 ServerRPC.Builder builder = new RPC.Builder(new Configuration());//指定Server的地址接口builder.setBindAddress("localhost");builder.setPort(7788);//发布程序builder.setProtocol(MyBusiness.class);//定义的接口builder.setInstance(new MyBusinessImpl());//发布的接口的实现//创建RPC ServerServer 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端

转载于:https://www.cnblogs.com/lingluo2017/p/8481636.html

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

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

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

  2. Spring AOP底层实现- JDK动态代理和CGLIB动态代理

    Spring AOP是运行时织入的,那么运行时织入到底是怎么实现的呢?答案就是代理对象. 代理又可以分为静态代理和动态代理. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前, ...

  3. 好程序员大数据笔记之:Hadoop集群搭建

    好程序员大数据笔记之:Hadoop集群搭建在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天 ...

  4. 明翰的大数据笔记V0.2(持续更新)

    文章目录 前言 什么是大数据 大数据应用场景 `MapReduce` 大数据的HelloWorld 内部机制与原理 组合器Combiner Hadoop 优缺点 Hadoop版本 Hadoop V1 ...

  5. 深圳大数据培训:HDFS基本概念

    深圳大数据培训:HDFS基本概念 1.1 HDFS的介绍 源自于Google的GFS论文 发表于2003年10月 HDFS是GFS克隆版 ,HDFS的全称是Hadoop Distributed Fil ...

  6. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略

    大数据处理当中,数据储存始终是一个重要的环节,从现阶段的市场现状来说,以Hadoop为首的大数据技术框架,仍然占据主流地位,而Hadoop的HDFS,在数据存储方面,仍然得到重用.今天的大数据入门分享 ...

  7. 自学it18大数据笔记-第三阶段Spark-day04——会持续更新……

    笔记为自学时随手记录,如有错误,欢迎指正,不胜感激!现已广州转移至上海,欢迎小伙伴们加qq或微博沟通交流(QQ,微博和博客同名) 笔记分享:自学it18大数据笔记-第三阶段Spark-day04--会 ...

  8. 自学it18大数据笔记-第三阶段Scala-day06——会持续更新……

    笔记为自学时随手记录,如有错误,欢迎指正,不胜感激!现已广州转移至上海,欢迎小伙伴们加qq或微博沟通交流(QQ,微博和博客同名) 笔记分享:自学it18大数据笔记-第三阶段Scala-day06--会 ...

  9. 自学it18大数据笔记-第二阶段hadoop-day11——会持续更新……

    笔记为自学时随手记录,如有错误,欢迎指正,不胜感激!现已广州转移至上海,欢迎小伙伴们加qq或微博沟通交流(QQ,微博和博客同名) 笔记分享:自学it18大数据笔记-第二阶段hadoop-day11-- ...

最新文章

  1. poj2289二分图多重匹配
  2. centos 6.5 安装 lamp 后mysql不能启动_CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境...
  3. 基于javascript的asp数据库操作类,含分页、字符串截取、用户登陆验证[原创]
  4. php判断是否是文件_PHP判断文件是否为图片文件的方法总结
  5. 泡泡玛特通过港交所聆讯 上半年总收益8.18亿元
  6. C++中STL-queue使用方法
  7. React 开发常见报错解决方法
  8. 基于java的药品管理系统_基于Java药品管理系统
  9. 计算机硬件毕业论文题目,最新计算机硬件论文选题参考 计算机硬件论文题目哪个好...
  10. 【零基础】量子纠缠图像问世,简单解读实验原理
  11. gitbub上传代码
  12. 细粒度图像分类(FGVC)--- 综述
  13. Renesas CS+ for ca cx入门(一)
  14. 图像处理与机器视觉行业分析
  15. 爱创课堂分享web前端学习路线自学如何找到工作
  16. MySQL-InnoDB的索引原理及优化技术
  17. ionic2 中的网络监测功能
  18. 如何使用S32DS开发KEA系列的LIN功能(二)
  19. 钣金材料是通信产品结构设计中最常用的材料
  20. React-mentions 库介绍

热门文章

  1. Java中的关于static的解释和应用
  2. Mysql存储过程中的事务回滚
  3. 《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?...
  4. tomcat的JK和JK2
  5. flutter AppBar
  6. [School Life - Study] 有哪些每天坚持效果显著的高中学习习惯?
  7. Python——反射
  8. vue的Virtual Dom实现- snabbdom解密
  9. 冷知识 —— 成语与典故
  10. C#笔记2__Char类、String类、StringBuilder类 / 正则表达式 /