大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC
生活随笔
收集整理的這篇文章主要介紹了
大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
一、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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ 4555】[Tjoi2016
- 下一篇: node-express-1