由浅入深写java分布式(1)动态代理

来源:互联网 发布:知敬畏守规矩 编辑:程序博客网 时间:2024/05/29 15:34

注:关于动态代理和dubbo的例子,代码参考了   点击打开链接的博客和文章

public interface HelloService {      String hello(String name);  } 

public class HelloServiceImpl implements HelloService {    public String hello(String name) {      return Util.format("os={},path={},msg={}", System.getProperty("os.name"), System.getProperty("user.dir"), name);    }  }

ublic class RpcFramework {        /**      * 暴露服务      * @param service 服务实现      * @param port 服务端口      * @throws Exception      */      public static void export(final Object service, int port) throws Exception {          if (service == null)              throw new IllegalArgumentException("service instance == null");          if (port <= 0 || port > 65535)              throw new IllegalArgumentException("Invalid port " + port);          LogCore.CORE.info("Export service={}, port={}", service.getClass().getName(),  port);                    for(ServerSocket server = new ServerSocket(port);;) {              try {                  final Socket socket = server.accept();                  new Thread(new Runnable() {                      @Override                      public void run() {                          try {                              try {                                  ObjectInputStream input = new ObjectInputStream(socket.getInputStream());                                  try {                                      String methodName = input.readUTF();                                      Class<?>[] parameterTypes = (Class<?>[])input.readObject();                                      Object[] arguments = (Object[])input.readObject();                                      ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());                                      try {                                          Method method = service.getClass().getMethod(methodName, parameterTypes);                                          Object result = method.invoke(service, arguments);                                          output.writeObject(result);                                      } catch (Throwable t) {                                          output.writeObject(t);                                      } finally {                                          output.close();                                      }                                  } finally {                                      input.close();                                  }                              } finally {                                  socket.close();                              }                          } catch (Exception e) {                              e.printStackTrace();                          }                      }                  }).start();              } catch (Exception e) {                  e.printStackTrace();              }          }      }        /**      * 引用服务      * @param <T> 接口泛型      * @param interfaceClass 接口类型      * @param host 服务器主机名      * @param port 服务器端口      * @return 远程服务      * @throws Exception      */      @SuppressWarnings("unchecked")      public static <T> T refer(final Class<T> interfaceClass, final String host, final int port){          if (interfaceClass == null)              throw new IllegalArgumentException("Interface class == null");          if (! interfaceClass.isInterface())              throw new IllegalArgumentException("The " + interfaceClass.getName() + " must be interface class!");          if (host == null || host.length() == 0)              throw new IllegalArgumentException("Host == null!");          if (port <= 0 || port > 65535)              throw new IllegalArgumentException("Invalid port " + port);          LogCore.RPC.info("Get remote service {} from server {}:{}", interfaceClass.getName() , host , port);          return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] {interfaceClass}, new InvocationHandler() {              public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {                  Socket socket = new Socket(host, port);                  try {                      ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());                      try {                          output.writeUTF(method.getName());                          output.writeObject(method.getParameterTypes());                          output.writeObject(arguments);                          ObjectInputStream input = new ObjectInputStream(socket.getInputStream());                          try {                              Object result = input.readObject();                              if (result instanceof Throwable) {                                  throw (Throwable) result;                              }                              return result;                          } finally {                              input.close();                          }                      } finally {                          output.close();                      }                  } finally {                      socket.close();                  }              }          });      }    }  

开始测试:

public class RpcTest {  public static void main(String args[]){ new Thread(()->testServer()).start();        testClient();      }public static void testClient(){try {HelloService service = RpcFramework.refer(HelloService.class, "127.0.0.1", 1234); for (int i = 0; i < Integer.MAX_VALUE; i ++) {  String hello = service.hello("World" + i);  System.out.println(hello);  Thread.sleep(1000);  }}catch (Exception e) {e.printStackTrace();}  }public static void testServer(){HelloService service = new HelloServiceImpl();          try {RpcFramework.export(service, 1234);} catch (Exception e) {e.printStackTrace();}}  }


0 0
原创粉丝点击