The dynamic proxy + socket of dubbo-jdk simulates the underlying implementation of dubbo

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;
            }
        });
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325889714&siteId=291194637