美文网首页
RPC框架的最简单实现

RPC框架的最简单实现

作者: zheting | 来源:发表于2018-01-13 21:58 被阅读156次

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

相关文章

  • RPC框架的最简单实现

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

  • RPC框架的最简单实现

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

  • 实现简单的RPC框架

    仅实现最基本的功能 RPC原理 实现步骤 1. 本地代理存根 使用cglib获取代理Service 在本地获取Se...

  • Netty高级篇

    本文将用netty实现一个简单的RPC框架。 一、什么叫RPC? RPC,远程调用,就是A程序部署在1号机器上,B...

  • grpc原理

    RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP ...

  • Java实现简单的RPC框架

    一、RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。...

  • Java实现简单的RPC框架

    1 RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。...

  • Java实现简单的RPC框架

    动态代理例子 使用动态代理的步骤很简单, 可以概括为如下两步: 实现 InvocationHandler 接口, ...

  • 手写类似dubbo的rpc框架第一章《自定义配置xml》

    案例介绍本案例通过三个章节来实现一共简单的rpc框架,用于深入学习rpc框架是如何通信的,当前章节主要介绍如何自定...

  • 基于Netty+动态代理+反射 实现简单的RPC调用

    前言 本文只是简单实现了一次RPC调用示例,以理解其调用原理。一些主流RPC框架的其他功能并没有实现。(如服务自动...

网友评论

      本文标题:RPC框架的最简单实现

      本文链接:https://www.haomeiwen.com/subject/lcshoxtx.html