Crea tu propio marco de comunicación IV - Construcción de NettyServer
Enviar un mensaje desde el cliente al servidor, recibir y procesar el mensaje se puede dividir aproximadamente en los siguientes procesos:
La parte amarilla es la lógica del cliente y la parte azul es la Transmisión de red. El rojo es la lógica del lado del servidor. Este artículo se centra en la lógica del lado del servidor.
Decodificar binarios a un formato específico y encapsular protobuf en un formato personalizado son unidades en esta cadena de procesamiento.
En Netty, ChannelHandler actúa como una unidad y ChannelPipeline actúa como una cadena de procesamiento. La estructura de la cadena de procesamiento es la siguiente
Las marcas 1, 2 y 3 son la lógica a la que debemos prestar atención: 1. Decodificar datos binarios en protobuf -> 2. Codificar protobuf en Solicitud -> 3 Distribuir la solicitud de ejecución
Lo siguiente corresponde a los tres puntos clave en una implementación específica
A continuación explicaremos estos tres procesos en detalle
En este paso, nosotros binario Los datos se convierten a la Base previamente definida. Solicitud
Los dos ChannelHandlers utilizados aquí los proporciona Netty, por lo que no entraré en detalles.
En este paso, MessageFactory.createRequest() encontrará el específico según moduleId y CommandId Solicite y use el objeto proto para completarlo con datos. El AbstractMessage creado se pasa al siguiente nivel
(MessageRegistry se explicará más adelante).
Este paso convierte el canal en un usuario y entrega la responsabilidad de reenvío a RequestDispatchService
channel2SessionMap registra la correspondencia entre el canal y el usuario. Este es el identificador único del cliente y registra. la información del cliente y transporta mensajes serializados de forma asincrónica y no divulgables. Alberga una funcionalidad asíncrona sin bloqueo en serie, cuya implementación se analizará más adelante.
RequestDispatchService también es muy simple. Solo necesita encontrar el método correspondiente a AbstractRequest y luego llamar al método mediante reflexión para ejecutarlo.
user.execute(...) coloca este mensaje en la cola de mensajes del usuario para su ejecución
La lógica del lado del servidor termina aquí
Hagámoslo. siguiente Eche un vistazo al centro de registro de mensajes como el núcleo del proceso
El centro de registro de mensajes tiene dos funciones
Por ejemplo
Todas las implementaciones específicas de AbstractMessage se llevan a cabo usando @MessageWrapper Anotación para asociar un mensaje específico con moduleId + commandId, por ejemplo
El centro de registro de mensajes escaneará la información de la clase y registrará la relación de asociación.
Un mensaje debe tener un método correspondiente y la anotación @MessageHandler identifica un método en la interfaz que está asociado con el mensaje.
Luego, MessageRegistry encapsulará el método y lo combinará. con Correlación de mensajes
Este mecanismo permite un conjunto completo de lógica desde la recepción del mensaje hasta su ejecución.