简单RPC

sRPC主要部件图

客户端侧代码:

public class ClientApp {

    public static void main(String[] args) {
        ServiceProxy.setZookeeperHost("127.0.0.1:2181");

        AddService addService = ServiceProxy.newServiceProxy(AddService.class);
        try {
            int c = addService.add(999, 888);
            System.out.println("计算结果是:" + c);
        } catch (Exception e){
            System.out.println(e);
        }

    }

}

服务端侧代码:

public class ServerApp {

    public static void main(String[] args) {

        RpcServer rpcServer = new RpcServerImpl(9999, 1, "127.0.0.1:2181");

        rpcServer.register(AddService.class.getName(), AddServiceImpl.class, "127.0.0.1:9999");

        rpcServer.start();

    }
}

流程(客户端发起):

  1. AddService addService = ServiceProxy.newServiceProxy(AddService.class)
  2. 上述newServiceProxy会调用Proxy.newProxyInstance(classload, interfaceList, handler)
  3. addService.add(10, 20)方法执行,此时会触发步骤2中handler的invoke方法。
  4. invoke方法:通过NettyClient将步骤3中的服务名方法名参数类型参数发送给NettyServer
  5. NettyServer收到消息:
    • 服务名,拿到 clazz
    • 方法名、参数类型, 拿到 method
  6. 然后调用method.invoke(clazz.newInstance, args),将结果写回给NettyClient
  7. NettyClient收到结果,输入,OVER.