marco actual RPC aprendizaje Netty

  Primero conecte GitHub Dirección: https://github.com/kosamino/netty-root/tree/master/ym-netty-rpc

  implementación de RPC es un servicio remoto de llamadas locales a través del objeto proxy remoto. escenarios de aplicación de Internet, el servicio de monómero extrema falta de escalabilidad flexibilidad, el equipo de desarrollo a gran escala no es fácil desarrollar la gestión. Muy a menudo el servicio se dividirá según el módulo vertical, es decir, estamos hablando de SOA como un servicio. Después de que el sistema de división de sistemas de interacción directa de servicios de negocios a menudo se basan en el marco de RPC para la comunicación.

  El servidor de RPC habitual proporciona un paquete de tarro interfaz correspondiente, el cliente a través de la función de marco ejemplo proxy RPC para obtener la interfaz correspondiente , la llamada el tratamiento de datos de embalaje y las comunicaciones son transparentes.

En primer lugar, el flujo de llamadas

  En primer lugar, en primer lugar para analizar la próxima RPC Cuál es el proceso, tal como se muestra a continuación:

        

  Se incluye tres partes, usuarios, clientes Netty, Netty servidor:

  1. El usuario inicia una llamada;
  2. Embalaje solicitudes de los clientes Netty;
  3. Las peticiones de los clientes se serializan (objeto-ByteBuf);
  4. Después de que el servidor envía un mensaje a la secuencia de;
  5. El servidor solicitará deserializar objetos en específico decodificado;
  6. El servidor analiza la solicitud enviada por un cliente y devuelve el resultado de preparar;
  7. El servidor devuelve un resultado serializado como ByteBuf;
  8. El cliente recibe la información de la declaración;
  9. Devolver información a la columna de cliente de la información obtenida contra objetos;
  10. El cliente devuelve los resultados a la persona que llama el usuario, para completar la solicitud.

En segundo lugar, incluyendo la técnica

  Como se muestra arriba, todo el proceso es RPC marco sencillo en el que esta tecnología de proceso necesaria para usarla?

  • Agente dinámica: obtener el objeto de representación a través de la tecnología de proxy de Java, el protocolo invocationHandler para comunicaciones de datos y embalajes.
  • Serialización, deserialización
  • Red de comunicación: La comunicación puede conseguir buenos del cliente y el servidor Netty basados ​​en el rendimiento IO
  • Reflexión: El parámetro de la petición del cliente correspondiente a la instancia del servidor del método se logra mediante la técnica llamada de reflexión

  A continuación, análisis de fragmentos de código en el uso de parte de la tecnología.

  1, proxies dinámicos

// TODO代理对象 
QueryStudentClient cliente = (QueryStudentClient) rpcProxyFactory. factoryRemoteInvoker ( "localhost", 8080, QueryStudentClient. clase ); 

público  de clase RpcProxyFactory <T> { 

    pública T factoryRemoteInvoker (String host, int puerto, interfaces de clase) {
         // 动态代理
        de retorno (T) Proxy.newProxyInstance (interfaces.getClassLoader (), nueva Clase [] {} las interfaces,
                 nueva RemoteInvocationHandler ( host, el puerto, las interfaces)); 
    } 
} 

Pública  de clase RemoteInvocationHandler implementosInvocationHandler {
     privado String host;
    privada  int puerto;
    privadas interfaces de clase; 

    público RemoteInvocationHandler (host String, int puerto, interfaces de clase) {
         este .host = anfitrión;
        este .port = puerto;
        esta .interfaces = Interfaces; 
    } 

    Pública objeto de invocación (proxy de objeto, método Método, Object [] args) lanza Throwable {
         // TODO封装消息 
        RpcContext rpcContext = nueva RpcContext ();
        rpcContext.setClassName (interfaces.getName ()); 
        rpcContext.setMethodName (method.getName ()); 
        rpcContext.setTypes (method.getParameterTypes ()); 
        rpcContext.setParams (args); 

        tratar {
             // 通讯 
            cliente NettyClient = nueva NettyClient (host, puerto); 
            cliente. conectar ();
            volver cliente. sendData (rpcContext); 
        } Catch (Exception e) { 

        } 
        retorno  nula ; 
    } 
}

  2, la serialización, deserialización

    @ Override
     protegida  vacío initchannel (SocketChannel sc) lanza la excepción { 
        manejador =   nueva NettyClientHandler (cierre); 

        HessianEncode hessionEncodeHandler = nuevo HessianEncode (); 
        HessianDecode hessionDecodeHandler = nuevo HessianDecode (); 

        LengthFieldPrepender fieldEncoder = nuevo LengthFieldPrepender (2 );
//         LengthFieldBasedFrameDecoder fieldDecoder = new LengthFieldBasedFrameDecoder (65535, 0, 2, 0, 2); 

//         出站
        sc.pipeline () addLast (. fieldEncoder ); 
        . sc.pipeline () addLast ( hessionEncodeHandler ); 

        // inseguro LengthFieldBasedFrameDecoder entrante multiproceso, utilizando así nuevo nuevo 
        sc.pipeline () addLast (. nuevo nuevo  LengthFieldBasedFrameDecoder (65535 , 0 , 2, 0, 2 )); 
        sc.pipeline () addLast (. hessionDecodeHandler ); 
        sc.pipeline () addLast (Handler) ;. 
    }

  Puede ser visto en la tubería se ha agregado: la longitud del paquete se establece en función de la viscosidad del paquete semi-header procesamiento Handler, herramienta de secuencia, herramienta deserializado, se utiliza en el presente documento serialización de Hesse.

  3, la técnica de la reflexión

    pública  vacío channelRead (ChannelHandlerContext CTX, msg Objeto) lanza la excepción { 
        modelo RpcContext = msg (RpcContext); 

        Clase clazz = nulo ;
        si (Registry.map.containsKey (model.getClassName ())) {
             clazz = Registry.map.get ( model.getClassName () ); 
        } 

        Resultado Object = nulo ;
        tratar {
             método Método = clazz.getMethod (model.getMethodName (), model.getTypes ()); 
            result =method.invoke (clazz.newInstance (), model.getParams ()); 
        }Catch(Exception e) {
            e.printStackTrace (); 
        }

        Ctx.channel () writeAndFlush (resultado).; 
    }

  Se puede ver el servidor de nombres de clase basada en el cliente vino, obtener el mapa Registro de la clase registrada, y luego llamar a la reflexión de acuerdo con el tipo de retorno, nombre del método, el parámetro.

Tres, Netty asíncrono de problemas en colaboración subproceso de llamada

  Uso NETTY lograr el cliente envía un punto a la nota:

  canal de datos de escritura llamando writeAndFlush de Netty escrita después del evento y el evento channelRead recibirá una respuesta se ejecuta de forma asíncrona , por lo que la necesidad de la cooperación hilo de prestar atención. Countdowlacth puede ser utilizado para lograr el hilo principal después de ejecutar la espera channelread antes de ir a conseguir el objeto respuesta recibida.

    / ** 
     * La transmisión de los datos del cliente método 
     * @param rpcRequest 
     * @return 
     * @throws InterruptedException
      * / 
    público objeto de la sendData (RpcContext rpcRequest) lanza InterruptedException { 
        ChannelFuture CF2 = el presente .getChannelFuture (); // Singleton objetos adquiridos ChannelFuture 
        si (! cf.channel () = nulo && . cf.channel () isActive ()) { 
            LATCH = nuevo nuevo un CountDownLatch (1. ); 
            clientInitializer.reLatch (LATCH);
            cf.channel () writeAndFlush (rpcRequest) ;. latch.await (); 
        } 
            

        retorno clientInitializer.getServerResult (); 
    } 
} 

  // cliente lee los datos desde el servidor al completo 
    @ Override
     pública  vacío channelRead (ChannelHandlerContext CTX, MSG Objeto) lanza la excepción {
         Súper .channelRead (CTX, MSG); 
        Resultado = MSG; 
        System.out.println ( "datos de retorno ha sido leído" );
         latch.countDown (); 
    }

  consiguiendo de este modo un hilo de la cooperación, de lo contrario el resultado obtenido no puede ser devuelto. El resto de detalles, ver el código completo.

Supongo que te gusta

Origin www.cnblogs.com/jing99/p/12571961.html
Recomendado
Clasificación