前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RPC框架的最简单实现

RPC框架的最简单实现

作者头像
JavaQ
发布2018-04-04 17:49:46
8410
发布2018-04-04 17:49:46
举报
文章被收录于专栏:JavaQJavaQ

一个最简单的RPC框架实现包含暴露服务、引用服务、Socket通讯三部分。

RPC框架简易实现

public class RpcFramework { public static void exportService(final Object service, int port) throws Exception { ServerSocket serverSocket = new ServerSocket(port); while (true) { final Socket socket = serverSocket.accept(); new Thread(new Runnable() { @Override public void run() { ObjectInputStream reader = null; ObjectOutputStream writer = null; try { reader = new ObjectInputStream(socket.getInputStream()); String methodName = reader.readUTF(); Class[] argumentsType = (Class[]) reader.readObject(); Object[] arguments = (Object[]) reader.readObject(); Method method = service.getClass().getMethod(methodName, argumentsType); Object result = method.invoke(service, arguments); writer = new ObjectOutputStream(socket.getOutputStream()); writer.writeObject(result); } catch (Exception e) { if (null != writer) { try { writer.writeObject(e); } catch (IOException e1) { e1.printStackTrace(); } } } finally { if (null != writer) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != reader) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); } } public static <T> T referenceService(Class<T> interfaceClass, final String host, final int port) { return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Socket socket = new Socket(host, port); ObjectOutputStream writer = null; ObjectInputStream reader = null; try { writer = new ObjectOutputStream(socket.getOutputStream()); writer.writeUTF(method.getName()); writer.writeObject(method.getParameterTypes()); writer.writeObject(args); reader = new ObjectInputStream(socket.getInputStream()); return reader.readObject(); } finally { if (null != writer) { writer.close(); } if (null != reader) { reader.close(); } } } }); } }

接口

public interface HelloService { String sayHello(String name); } public interface ByeService { String sayBye(String name); }

接口实现

public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return name + " say hello"; } } public class ByeServiceImpl implements ByeService { @Override public String sayBye(String name) { return name +" bye bye"; } }

服务提供方

public class Provider { public static void main(String[] args) throws Exception { final HelloService helloService = new HelloServiceImpl(); new Thread(new Runnable() { @Override public void run() { try { RpcFramework.exportService(helloService, 20880); } catch (Exception e) { e.printStackTrace(); } } }).start(); final ByeService byeService = new ByeServiceImpl(); new Thread(new Runnable() { @Override public void run() { try { RpcFramework.exportService(byeService, 20881); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }

服务消费方

public class Consumer { public static void main(String[] args) { HelloService helloService = RpcFramework.referenceService(HelloService.class, "127.0.0.1", 20880); System.out.println(helloService.sayHello("tom")); ByeService byeService = RpcFramework.referenceService(ByeService.class, "127.0.0.1", 20881); System.out.println(byeService.sayBye("jack")); } }

输出

tom say hello jack bye bye

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档