一个最最简易的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 }