RPC,全称为Remote Procedure Call(远程过程调用)。通俗一点讲就是在本地调用远程服务器上的功能。实现远程调用需要满足以下几个条件:
1.网络通信
2.序列化与反序列化
3.反射
远程通信是远程调用的前题,只有经过序列化后的数据才能在网络上传输,传输到服务器端后需要反序列化成对象,然后通过反射机制调用服务器上客户端指定的服务,再将结果返回给客户端,用一张图表示:
服务器每收到一次客户端的请求,就启动一个线程处理,调用具体的服务对象相应的方法,并将返回结果返回给客户端。
基于此原理,下面写一个示例实现RPC功能:
项目结构图如下:分别有客户端、服务器、服务以及请求与响应。
首先抽象出请求类与响应类:
请求类:属性有请求的类名、方法名、输入参数类型、输入数据。
package cn.yang.common; import java.io.Serializable; //请求 public class Request implements Serializable { private String className;//类名 private String methodName;//方法名 private Class[] inType;//输入参数类型 private Object[] inData;//输入数据 public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public Class[] getInType() { return inType; } public void setInType(Class[] inType) { this.inType = inType; } public Object[] getInData() { return inData; } public void setInData(Object[] inData) { this.inData = inData; } }