美文网首页
分布式基础之RPC

分布式基础之RPC

作者: SuperMarry | 来源:发表于2019-02-18 13:06 被阅读0次

    一、概念

            RPC(Remote Procedure Call),即远程调用。当我们的单个系统承受的压力越来越大,我们很自然地就想到拆分我们的系统,解决单台服务器性能不可能无限制提升的缺陷,RPC将原来调用本地方法变为调用服务端的方法,提高了本地系统的吞吐量。

    下面我们基于TCP协议,利用Java的socke实现一个简单的rpc调用,来探究下怎么通过一个接口调用到服务端的方法。

    接下来上代码

    接口:HelloWorld 

    public interface HelloWorld  { public String hello(String a);}

    客户端、服务端中的接口是一样的.

    接口实现类:HelloWorldImpl

    public class HelloWorldImpl implements HelloWorld {

    public String hello(String a){

    System.out.println("传入的参数为"+a);

    return "success";

    }

    customer

    String interfaceName=HelloWorld.class.getName();

    try {

    Method method=HelloWorld.class.getMethod("hello", java.lang.String.class);

    Object [] arguments={"hello rpc"};

    Socket socket=new Socket("127.0.0.1", 10086);

    ObjectOutputStream ops=new ObjectOutputStream(socket.getOutputStream());

    ops.writeUTF(interfaceName);

    ops.writeUTF(method.getName());

    ops.writeObject(arguments);

    //从服务提供方读取结果

    ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());

    Object result=ois.readObject();

    System.out.println(result);

    } catch (NoSuchMethodException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (SecurityException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    server

    ServerSocket ss=new ServerSocket(10086);

    Map <String ,String> serviceMap=new HashMap<String, String>();

    serviceMap.put(HelloWorld.class.getName(), HelloWorldImpl.class.getName());

    while(true){

    Socket sc=ss.accept();//阻塞至至少有一个连接

    ObjectInputStream ois= new ObjectInputStream(sc.getInputStream());

    String interfaceName=ois.readUTF();

    String methodName=ois.readUTF();

    Object [] arguments=(Object[]) ois.readObject();

    //反射创建调用本地方法

    Class serviceClass=Class.forName(serviceMap.get(interfaceName));

    Method method=serviceClass.getMethod(methodName, java.lang.String.class);

    Object serviceObj=serviceClass.getConstructor().newInstance();

    Object result=method.invoke(serviceObj, arguments);

    //返回结果给客户端

    ObjectOutputStream ops=new ObjectOutputStream(sc.getOutputStream());

    ops.writeObject(result);

    }

    先启动server端,再启动customer·,我们就自己完成了一次简单的RPC调用了。

    相关文章

      网友评论

          本文标题:分布式基础之RPC

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