RPC/代理机制分析
在hadoop的通信机制中不得不提到rpc通信机制,Client与namenode,namenode与datanode,datanode之间很多通信都是基于rpc机制。
提到RPC机制,其实根据我的理解,他就是一种代理,只不过它和我们平常的代理不同的地方是它是一种远程代理!首先介绍一下代理机制!
一、代理机制
提到代理机制又不得不提到Java中的一个非常重要的概念,反射机制!
那么什么是反射呢?
简单的说就是应用程序在运行是通过JavaReflection api取得一个类名的class信息。请看代码示例:
public interface people{
public void study();
}
//内部类;
public static class Student implements people{
private String name;//名字;
private int age;
//构造方法;
public Student(){}
//构造方法2;
public Student(String name,int age){
this.name=name;
this.age=age;
}
//set和get方法;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study(){
System.out.println("学生在学习");
}
}
//程序的主方法;
public static void main(String[] args) {
Student stu=new Student("陆亮",20);
Class<? extends Student> tmp=stu.getClass();
String cName=tmp.getName();
System.out.println("类的名字是"+cName);
try {
Class c=Class.forName(cName);
//得到类中的方法;
java.lang.reflect.Method[] ms=c.getMethods();
for(java.lang.reflect.Method m:ms){
System.out.println("方法的名字是"+m.getName());
System.out.println("方法的返回值类型是"+
m.getReturnType().toString());
System.out.println("方法的参数类型是 "
+m.getParameterTypes());
}
//得到属性;
java.lang.reflect.Field[] fields=c.getFields();
for(java.lang.reflect.Field f:fields){
System.out.println("参数类型是"+f.getType());
}
//得到父接口
Class[] is=c.getInterfaces();
for(Class s:is){
System.out.println("父接口的名字是"+s.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
部分结果如下:
下面介绍代理机制:
其实代理机制我的理解就是一个对象代替另外一个对象实现某项功能!其中前一个对象我们称之为代理对象,后面一个对象才是我们的真实对象!
对于代理类我们必须实现InvocationHandler接口,必须实现它的invoke(Object proxy, Method method, Object[] args)方法;在这个方法中我们调用真实对象的方法。
public class TestProxy implements java.lang.reflect.InvocationHandler{
//被代理对象
private Object obj;
//构造方法
public TestProxy(Object obj){
this.obj=obj;
}
/**
* 得到被代理对象;
* @param obj
* @return
*/
public static Object getProxy(Object obj){
//return调用此方法;
return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new TestProxy(obj));
}
/**
* 调用此方法执行
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//结果参数;
Object result;
try{
System.out.println("代理对象"+proxy.getClass().getName());
System.out.println("代理方法"+method.getName());
//调用对象的实际方法;
result=method.invoke(obj, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("代理 : " + e.getMessage());
} finally {
System.out.println("代理结束:" + method.getName());
}
return result;
}
}
真实的对象中的那个方法,
//构造方法重载;
public SumInt(Integer a,Integer b){
this.a=a;
this.b=b;
}
其调用关系如下:
二、RPC(远程方法调用)
RPC的本质也是代理,但是RPC是一种远程代理,在我们的代理类的实现方法中我们不是直接invoke调用真实类的方法,而是通过socket或是其他向server发送信息,server接受信息,调用方法然后返回结果:在客户端看来就好像真的调用了代理对象的方法一样!神奇吧。。。
请看示例,在这里我们实现了一个简单的演示,客户端发送一条消息给server,server端调用方法返回另外一条消息。
public class Client {
//客户端和服务器建立socket连接
private java.net.Socket sc;
//输入输出流;
private java.io.InputStream ins;
private java.io.OutputStream ous;
//字符缓冲输出流和输入流
private java.io.BufferedReader br;
private java.io.BufferedWriter bw;
//代理对象;
ProxyClient pc;
//测试方法;
public void test(){
System.out.println("开始测试");
//建立socket连接;
try {
sc=new Socket("localhost",9090);
System.out.println("建立了连接!");
//得到输出流;
ins=sc.getInputStream();
ous=sc.getOutputStream();
br=new java.io.BufferedReader(new java.io.InputStreamReader(ins));
bw=new java.io.BufferedWriter(new java.io.OutputStreamWriter(ous));
//构造代理对象;
pc=new ProxyClient(br,bw);
ifconfig ic=(ifconfig) java.lang.reflect.Proxy.newProxyInstance(ifconfig.class.getClassLoader(),
new Class[] {ifconfig.class}, pc);
String result=ic.sayWord("hello");
System.out.println("返回的结果是"+result);
try {
br.close();
bw.flush();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnknownHostException e) {
System.out.println("连接错误!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IO错误");
e.printStackTrace();
}
}
}
在代理类的invoke方法中我们发送信息,然后等待结果:
//代理方法;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//再次发送类名,方法名,参数列表;
Object result;
//写入类名;
bw.write("cn.luliang.rpc.rpcServer.ProxyServer"+"\r\n");
//写入方法名;
bw.write(method.getName()+"\r\n");
//写入参数名;
for(Object obj:args){
if(obj instanceof String){//如果是String对象的示例
String str=(String)obj;
bw.write(str+"\r\n");
}
}
bw.flush();
//阻塞式读取结果;
result=br.readLine();
System.out.println("返回了结果");
return result;
}
再来看看server端的实现代码:
public void readMsg(){
String s=null;
String result="";
try {
//读取类名;
String cName=br.readLine();
//读取方法名;
String fName=br.readLine();
s=br.readLine();
Class c;
ProxyServer ts;
Method m;
try {
c=Class.forName(cName);
//产生示例;
try {
ts=(ProxyServer) c.newInstance();
Method[] ms=c.getMethods();
for(Method mt:ms){
if(mt.getName().equals(fName)){
m=mt;
try {
result=(String) mt.invoke(ts, result);
System.out.println("服务器返回结果"+result);
bw.write(result+"\r\n");
bw.flush();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
System.out.println("类没有找到!");
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
结果如下:
<!--EndFragment-->
- 大小: 11.1 KB
- 大小: 1.9 KB
- 大小: 12.5 KB
- 大小: 13.6 KB
分享到:
相关推荐
Hadoop学习笔记,自己总结的一些Hadoop学习笔记,比较简单。
Hadoop 学习笔记.md
本文将深入探讨Hadoop的RPC机制,解析其工作原理,并结合源码分析其内部实现。 一、RPC简介 RPC是一种让程序能够调用运行在其他地址空间(通常在另一台机器上)的程序的方法。在Hadoop中,RPC被广泛用于NameNode、...
**Hadoop学习笔记详解** Hadoop是一个开源的分布式计算框架,由Apache基金会开发,主要用于处理和存储海量数据。它的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce,两者构成了大数据处理的基础...
本文将根据提供的Hadoop学习笔记,深入解析Hadoop的关键概念和实战技巧,帮助读者构建扎实的Hadoop知识体系。 一、Hadoop简介 Hadoop的核心思想源于Google的两篇论文——“GFS”(Google File System)和...
在本篇"Hadoop学习笔记(三)"中,我们将探讨如何使用Hadoop的MapReduce框架来解决一个常见的问题——从大量数据中找出最大值。这个问题与SQL中的`SELECT MAX(NUMBER) FROM TABLE`查询相似,但在这里我们通过编程...
云计算,hadoop,学习笔记, dd
【HADOOP学习笔记】 Hadoop是Apache基金会开发的一个开源分布式计算框架,是云计算领域的重要组成部分,尤其在大数据处理方面有着广泛的应用。本学习笔记将深入探讨Hadoop的核心组件、架构以及如何搭建云计算平台。...
在初学者的角度,理解Hadoop的组成部分以及其架构设计是学习Hadoop的基础。 首先,Hadoop的分布式文件系统(HDFS)是其核心组件之一,它具有高吞吐量的数据访问能力,非常适合大规模数据集的存储和处理。HDFS的设计...
在IT行业中,Hadoop分布式文件系统(Hadoop Distributed File System, 简称HDFS)是一种广泛应用于大...这个压缩包提供了一个实践和学习的平台,通过实际操作,你可以更好地理解HDFS的工作机制,提升自己的编程能力。
### Hadoop分布式文件系统(HDFS):关键技术与实践 #### 摘要 Hadoop分布式文件系统(HDFS)是Hadoop项目的核心组件之一,旨在为大规模数据集提供高效可靠的存储解决方案。HDFS的设计原则强调了数据的分布式存储与...
"Hadoop学习笔记整理" 本篇笔记对Hadoop进行了系统的介绍和总结,从大数据的基本流程到Hadoop的发展史、特性、集群整体概述、配置文件、HDFS分布式文件系统等方面都进行了详细的讲解。 一、大数据分析的基本流程 ...
### Talend学习笔记2——mysql文件导入到HDFS #### 关键知识点概览 - **Talend Data Integration** - **MySQL 数据库** - **Hadoop 和 HDFS(Hadoop Distributed File System)** #### 详细知识点说明 ##### 1. ...
Hadoop和Hive是大数据处理和分析领域的重要工具。Hadoop是一个分布式系统基础架构,由Apache基金会开发。它通过在计算机集群之间分布式存储大量数据并允许应用程序在这些集群上并行处理大量数据,来实现高可靠性和...