Use jdk's dynamic proxy + socket to simulate the underlying RPC implementation of dubbo
provider
import javax.xml.transform.Result;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
public class MyProvider {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
//业务逻辑结果
System.out.println("服务端接收请求");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String clazzName = ois.readUTF();
String methodName = ois.readUTF();
Class[] parmeterTypes = (Class[]) ois.readObject();
Object[] argss = (Object[]) ois.readObject();
//服务注册
Class clazz = getService(clazzName);
Object result = null;
try {
Method method = clazz.getMethod(methodName, parmeterTypes);
result = method.invoke(clazz.newInstance(), argss);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(result);
oos.flush();
oos.close();
ois.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 服务注册
* @param clazzName 需要调用的接口类
* @return
*/
public static Class getService(String clazzName) {
Class clazz = null;
if (DemoService.class.getName().equals(clazzName)) {
clazz = DemoServiceImpl.class;
}
if (UserService.class.getName().equals(clazzName)) {
clazz = UserServiceImpl.class;
}
return clazz;
}
consumer
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;
public class MyConsumer {
public static void main(String[] args) {
//远程服务的代理 new DemoServiceImpl();动态代理 字节码技术
DemoService demoService = (DemoService) remote(DemoService.class);
String result = demoService.sayHello("david");
System.out.println("客户端收到结果," + result);
UserService userService = (UserService) remote(UserService.class);
User user = userService.getUserById(1);
System.out.println("客户端收到结果,userName" + user.getName() + ",age=" + user.getAge());
}
private static Object remote(final Class clazz) {
return Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Socket socket = new Socket("127.0.0.1", 8888);
//哪个class 哪个方法 方法的入参类型 方法的参数具体值
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeUTF(clazz.getName());
oos.writeUTF(method.getName());
oos.writeObject(method.getParameterTypes());
oos.writeObject(args);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object result = ois.readObject();
ois.close();
oos.close();
socket.close();
return result;
}
});
}
}