一、概念
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调用了。
网友评论