• 一个最最简易的RPC框架雏形---转载自梁飞的博客


    查阅RPC与HTTP区别的时候, 无意间发现一篇博客,内容是一个简易的RPC服务框架, 仔细一看, 不得了,博主竟然就是阿里dubbo的作者.

    原文链接在此:

    http://javatar.iteye.com/blog/1123915?page=2#comments;

    在这里冒昧粘下代码:

      1 package com.alibaba.study.rpc.framework;  
      2   
      3 import java.io.ObjectInputStream;  
      4 import java.io.ObjectOutputStream;  
      5 import java.lang.reflect.InvocationHandler;  
      6 import java.lang.reflect.Method;  
      7 import java.lang.reflect.Proxy;  
      8 import java.net.ServerSocket;  
      9 import java.net.Socket;  
     10   
     11 /** 
     12  * RpcFramework 
     13  *  
     14  * @author william.liangf 
     15  */  
     16 public class RpcFramework {  
     17   
     18     /** 
     19      * 暴露服务 
     20      *  
     21      * @param service 服务实现 
     22      * @param port 服务端口 
     23      * @throws Exception 
     24      */  
     25     public static void export(final Object service, int port) throws Exception {  
     26         if (service == null)  
     27             throw new IllegalArgumentException("service instance == null");  
     28         if (port <= 0 || port > 65535)  
     29             throw new IllegalArgumentException("Invalid port " + port);  
     30         System.out.println("Export service " + service.getClass().getName() + " on port " + port);  
     31         ServerSocket server = new ServerSocket(port);  
     32         for(;;) {  
     33             try {  
     34                 final Socket socket = server.accept();  
     35                 new Thread(new Runnable() {  
     36                     @Override  
     37                     public void run() {  
     38                         try {  
     39                             try {  
     40                                 ObjectInputStream input = new ObjectInputStream(socket.getInputStream());  
     41                                 try {  
     42                                     String methodName = input.readUTF();  
     43                                     Class<?>[] parameterTypes = (Class<?>[])input.readObject();  
     44                                     Object[] arguments = (Object[])input.readObject();  
     45                                     ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());  
     46                                     try {  
     47                                         Method method = service.getClass().getMethod(methodName, parameterTypes);  
     48                                         Object result = method.invoke(service, arguments);  
     49                                         output.writeObject(result);  
     50                                     } catch (Throwable t) {  
     51                                         output.writeObject(t);  
     52                                     } finally {  
     53                                         output.close();  
     54                                     }  
     55                                 } finally {  
     56                                     input.close();  
     57                                 }  
     58                             } finally {  
     59                                 socket.close();  
     60                             }  
     61                         } catch (Exception e) {  
     62                             e.printStackTrace();  
     63                         }  
     64                     }  
     65                 }).start();  
     66             } catch (Exception e) {  
     67                 e.printStackTrace();  
     68             }  
     69         }  
     70     }  
     71   
     72     /** 
     73      * 引用服务 
     74      *  
     75      * @param <T> 接口泛型 
     76      * @param interfaceClass 接口类型 
     77      * @param host 服务器主机名 
     78      * @param port 服务器端口 
     79      * @return 远程服务 
     80      * @throws Exception 
     81      */  
     82     @SuppressWarnings("unchecked")  
     83     public static <T> T refer(final Class<T> interfaceClass, final String host, final int port) throws Exception {  
     84         if (interfaceClass == null)  
     85             throw new IllegalArgumentException("Interface class == null");  
     86         if (! interfaceClass.isInterface())  
     87             throw new IllegalArgumentException("The " + interfaceClass.getName() + " must be interface class!");  
     88         if (host == null || host.length() == 0)  
     89             throw new IllegalArgumentException("Host == null!");  
     90         if (port <= 0 || port > 65535)  
     91             throw new IllegalArgumentException("Invalid port " + port);  
     92         System.out.println("Get remote service " + interfaceClass.getName() + " from server " + host + ":" + port);  
     93         return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] {interfaceClass}, new InvocationHandler() {  
     94             public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {  
     95                 Socket socket = new Socket(host, port);  
     96                 try {  
     97                     ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());  
     98                     try {  
     99                         output.writeUTF(method.getName());  
    100                         output.writeObject(method.getParameterTypes());  
    101                         output.writeObject(arguments);  
    102                         ObjectInputStream input = new ObjectInputStream(socket.getInputStream());  
    103                         try {  
    104                             Object result = input.readObject();  
    105                             if (result instanceof Throwable) {  
    106                                 throw (Throwable) result;  
    107                             }  
    108                             return result;  
    109                         } finally {  
    110                             input.close();  
    111                         }  
    112                     } finally {  
    113                         output.close();  
    114                     }  
    115                 } finally {  
    116                     socket.close();  
    117                 }  
    118             }  
    119         });  
    120     }  
    121   
    122 }  
  • 相关阅读:
    centos 无线网卡安装,网卡rtl8188ee
    centos mysqldb 安装
    centos 安装gcc时,出错:Found 10 pre-existing rpmdb problem(s), 'yum check' output follows:
    peewee 字段属性help_text的支持问题
    mysql查看字段注释(帮助信息)指令
    centos mysql 大量数据导入时1153 错误:1153
    php在centos下的脚本没有解析的问题
    [转]mysql分布式方案-分库拆表
    [转]Mysql海量数据存储和解决方案之一—分布式DB方案
    mysql 数据库字符集的指定
  • 原文地址:https://www.cnblogs.com/wyisprogramming/p/6867172.html
Copyright © 2020-2023  润新知