美文网首页
分布式基础之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