由浅入深写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
- 由浅入深写java分布式(1)动态代理
- 动态代理由浅入深
- 由浅入深写java分布式(2) spring boot + dubbo + zookeeper详解
- 由浅入深写java分布式(3) dubbo admin监控dubbo 以及外网consumer找不到provider的问题
- 分布式Web应用----Java动态代理技术实现原理分析
- Java 代理,动态代理
- Java代理模式1 - 静态代理、动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- HALL开关介绍
- Unity资源加载发布到移动端iphone/ipad
- BaseActivity与BaseFragment的封装
- Android中播放声音的两种方法
- Android框架之Greendao 3.0的使用
- 由浅入深写java分布式(1)动态代理
- java基础面试(收藏下)
- 简单工厂模式
- 带小三角的提示框
- Android studio运行java程序时一直报错
- ERwin导出DB2数据库表结构
- Job 存储和持久化 (第二部分)
- org.hibernate.hql.internal.ast.QuerySyntaxException: USER is not mapped 报错解决
- Android框架之ormlite的使用