RPC(Remote Proceduce Call 远程过程调用) 一般用来实现部署在不同机器上的系统之间的方法调用,使程序能够像访问本地系统资源一样,通过网络传输过去访问远端系统资源。
Stub 主要作用
注:ServerStub又叫Skeleton。
public interface IHello {
public String sayHello(String info);
}
public class HelloService implements IHello {
public String sayHello(String info) {
String result = "hello : " + info;
System.out.println(result);
return result;
}
}
提供服务实现的类。
public class RpcProxyServer {
private IHello hello = new HelloService();
public void publisherServer(int port) {
try (ServerSocket ss = new ServerSocket(port)) {
while (true) {
try (Socket socket = ss.accept()) {
try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
String method = ois.readUTF();
Object[] objs = (Object[]) ois.readObject();
Class<?>[] types = new Class[objs.length];
for (int i = 0; i < types.length; i++) {
types[i] = objs[i].getClass();
}
Method m = HelloService.class.getMethod(method, types);
Object obj = m.invoke(hello, objs);
try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
oos.writeObject(obj);
oos.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class RpcProxyClient<T> {
public T proxyClient(Class<T> clazz) {
return (T) clazz.cast(Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try (Socket socket = new Socket("localhost", 8000)) {
try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
oos.writeUTF(method.getName());
oos.writeObject(args);
oos.flush();
try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
return ois.readObject();
}
}
}
}
}));
}
}
public class RpcServer {
//发布服务
public static void main(String[] args) {
RpcProxyServer server = new RpcProxyServer();
server.publisherServer(8000);
}
}
public class RpcClient {
// 调用服务
public static void main(String[] args) {
RpcProxyClient<HelloService> rpcClient = new RpcProxyClient<>();
IHello hello = rpcClient.proxyClient(HelloService.class);
String s = hello.sayHello("dd");
System.out.println(s);
}
}