高性能网络通讯协议、传输、线程阿里巴巴-B2B-平台技术部-应用框架@Dubbo提纲Simple RPC ProblemData ProtocolHeader CodecSerializationIO Model NIOJava NIOTCP Linux KernelThreading简单远程调用(1)—客户端HelloService helloService = getProxy(HelloService.class, , 2580);System.out.println(helloService.sayHello(world));public T T getProxy(ClassT interfaceClass, String host, int port){return (T) Proxy.newProxyInstance( interfaceClass.getClassLoader(), new Class?[] {interfaceClass}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable { Socket socket = new Socket(host, port); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeUTF(method.getName()); output.writeObject(method.getParameterTypes()); output.writeObject(arguments); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); return input.readObject();} } );}简单远程调用(2)—服务端public String sysHello(String input){ return Hello + input;}HelloService serviceImpl = new HelloService();public void static main(String[] args){ ServerSocket server = new ServerSocket(port); for(;;) { final Socket socket = server.accept(); new Thread(new Runnable() { ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); String methodName = input.readUTF(); Class?[] parameterTypes = (Class?[])input.readObject(); Object[] arguments = (Object[])input.readObject(); Method method = serviceImpl.getClass().getMethod(methodName, parameterTypes); Object result = method.invoke(serviceImpl, arguments); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeObject(result); } ).start(); }}简单远程调用(3)—问题在哪里网络传输方式:BIO 序列化方式:Java 线程模型:每连接每线程JDK代理三个主题协议用什么数据格式进行传输,双方的约定传输用什么样的通道将数据发送给对方线程当接收到数据时,如何分发数据进行处理Data ProtocolData FlowHelloServiceHelloServiceImplsayHello(“hi”)getProxy and invokeDubboInvokerDubboExporterInvoke(Invocation)WaitInvoke(Invocation)FutureMapNotifyRequestorResponderReceiverReceive(Request)Send(Request)Send(Response)Sock
原创力文档

文档评论(0)