Serie IO (2) explicación detallada de los componentes netty y el modelo de hilo


Introducción: Netty es un marco de trabajo de servidor cliente NIO que puede desarrollar rápida y fácilmente aplicaciones de red, como servidores de protocolo y clientes. Simplifica y simplifica enormemente la programación de redes, como los servidores de socket TCP y UDP.

Escenarios de uso de Netty:

Industria de Internet: en un sistema distribuido, se requieren llamadas de servicio remotas entre varios nodos, y un marco RPC de alto rendimiento es indispensable. Como marco de comunicación asíncrono de alto rendimiento, estos marcos RPC a menudo utilizan Netty como un componente básico de comunicación. Las aplicaciones típicas son: Marco de servicio distribuido de Ali El marco RPC de Dubbo usa el protocolo Dubbo para la comunicación entre nodos, y el protocolo Dubbo usa Netty como el componente de comunicación básico por defecto para la implementación. Comunicación interna entre nodos de proceso. La capa inferior de Rocketmq también utiliza Netty como componente de comunicación básico.
Industria de los juegos: ya sea un servidor de juegos para dispositivos móviles o un juego en línea a gran escala, el lenguaje Java se ha utilizado cada vez más. Como componente de comunicación básico de alto rendimiento, la propia Netty proporciona pilas de protocolos TCP / UDP y HTTP.

Explicación detallada del modelo netty:

  1. Netty abstrae dos grupos de grupos de subprocesos, BossGroup y WorkerGroup. BossGroup es responsable de recibir las conexiones de los clientes y WorkerGroup es responsable de las lecturas y escrituras de la red.
  2. Tanto los tipos BossGroup como WorkerGroup son NioEventLoopGroup
  3. NioEventLoopGroup es equivalente a un grupo de subprocesos de bucle de eventos, este grupo contiene varios subprocesos de bucle de eventos, cada subproceso de bucle de eventos es NioEventLoop
  4. Cada NioEventLoop tiene un selector, que se utiliza para monitorear la comunicación de red del socketChannel registrado en él
  5. Hay 3 pasos en cada ejecución del bucle interno del hilo Boss NioEventLoop
  • Procese el evento de aceptación, establezca una conexión con el cliente y genere un NioSocketChannel
  • Registre el NioSocketChannel en el selector en un trabajador NIOEventLoop para procesar las tareas de la cola de tareas, es decir, runAllTasks
  1. Pasos ejecutados por cada bucle de hilo NIOEventLoop de trabajador
  • Sondeo de los eventos de lectura y escritura de todos los NioSocketChannels registrados en su selector
  • Procesar eventos de E / S, es decir, eventos de lectura y escritura, y procesar negocios en el NioSocketChannel correspondiente
  • runAllTasks maneja las tareas de TaskQueue en cola de tareas y, por lo general, se puede colocar en TaskQueue algunos procesos comerciales que consumen mucho tiempo para que se procesen lentamente, a fin de no afectar el flujo de datos en la canalización.
  1. Cuando cada trabajador NIOEventLoop procesa el negocio NioSocketChannel, utiliza la canalización (canalización) y muchos procesadores de controladores se mantienen en la canalización para procesar los datos en el canal.

Componentes del módulo principal de Netty

1. Bootstrap 、 ServerBootstrap

Bootstrap significa arranque. Una aplicación Netty generalmente comienza con Bootstrap. Su función principal es configurar todo el programa Netty y conectar varios componentes en serie. La clase Bootstrap en Netty es la clase de arranque de inicio del programa cliente y ServerBootstrap es el servidor clase de arranque de inicio.

2. Futuro 、 ChannelFuture

Todas las operaciones de IO en Netty son asincrónicas y no se sabe de inmediato si el mensaje se procesa correctamente. Pero puedes esperar a que termine de ejecutarse o registrar un oyente directamente. La implementación específica es a través de Future y ChannelFutures. Pueden registrar un oyente. Cuando la operación se ejecuta con éxito o falla, el oyente activará automáticamente el evento de oyente registrado.

3. Canal

Un componente de la comunicación de red de Netty que se puede utilizar para realizar operaciones de E / S de red. El canal proporciona a los usuarios:

  1. El estado del canal de conexión de red actual (por ejemplo, ¿está abierto? ¿Está conectado?)
  2. Parámetros de configuración de la conexión de red (por ejemplo, el tamaño del búfer de recepción)
  3. Proporciona operaciones de E / S de red asincrónicas (como establecer una conexión, leer y escribir y vincular puertos). Las llamadas asincrónicas significan que cualquier llamada de E / S volverá inmediatamente y no hay garantía de que la operación de E / S solicitada se haya realizado. completado al final de la llamada.
  4. La llamada devuelve inmediatamente una instancia de ChannelFuture. Al registrar un oyente en ChannelFuture, se puede volver a llamar a la persona que llama para notificar a la persona que llama cuando la operación de E / S tiene éxito, falla o se cancela.
  5. Admite operaciones de E / S asociadas y controladores correspondientes. Los
    diferentes protocolos y conexiones de diferentes tipos de bloqueo tienen diferentes tipos de canales correspondientes a ellos
1 NioSocketChannel,异步的客户端TCP Socket 连接。
2 NioServerSocketChannel,异步的服务器端TCP Socket 连接。
3 NioDatagramChannel,异步的UDP连接。
4NioSctpChannel,异步的客户端 Sctp 连接。
5 NioSctpServerChannel,异步的 Sctp 服务器端连接,这些通道涵盖了UDP和TCP网络IO以及文件IO。

4. Selector

Netty implementa la multiplexación de E / S basada en el objeto Selector. A través del Selector, un hilo puede monitorear los eventos de canal de múltiples conexiones. Cuando un canal se registra en un Selector, el mecanismo interno del Selector puede consultar (Seleccionar) automática y continuamente si estos Canales registrados tienen eventos de E / S listos (como lectura, escritura, conexión de red completa, etc.), por lo que El El programa puede simplemente usar un hilo para administrar de manera eficiente múltiples canales.

5. NioEventLoop

NioEventLoop mantiene un hilo y una cola de tareas, que admite el envío asincrónico de tareas de ejecución. Cuando el hilo se inicia, se llama al método de ejecución de NioEventLoop para ejecutar tareas de E / S y tareas que no son de E / S: tareas de E / S, es decir el evento ready en selectionKey, como accept, connect, read, write, etc., desencadenado por el método processSelectedKeys.
Las tareas que no son de E / S, las tareas agregadas a taskQueue, como register0, bind0 y otras tareas, se activan mediante el método runAllTasks.

6. NioEventLoopGroup

NioEventLoopGroup, que gestiona principalmente el ciclo de vida de eventLoop, puede entenderse como un grupo de subprocesos. Un conjunto de subprocesos se mantiene internamente. Cada subproceso (NioEventLoop) es responsable de procesar eventos en múltiples canales, y un canal corresponde a un solo subproceso.

7. ChannelHandler

ChannelHandler es una interfaz que procesa eventos de E / S o intercepta operaciones de E / S y las reenvía al siguiente controlador en su ChannelPipeline (cadena de procesamiento empresarial)

8. ChannelPipline

Guarde la lista de ChannelHandler, que se utiliza para procesar o interceptar los eventos entrantes y las operaciones salientes de Channel. ChannelPipeline implementa una forma avanzada de modo de filtro de interceptación, lo que permite a los usuarios controlar completamente cómo se manejan los eventos y cómo cada ChannelHandler en el canal interactúa entre sí. En Netty, cada canal tiene y solo un ChannelPipeline correspondiente a él. Un canal contiene un ChannelPipeline, y el ChannelPipeline mantiene una lista doblemente enlazada compuesta de ChannelHandlerContext, y cada ChannelHandlerContext está asociado con un ChannelHandler. El evento de lectura (evento de entrada) y el evento de escritura (evento de salida) están en una lista doblemente enlazada. El evento de entrada se pasará del encabezado de la lista enlazada al último controlador de entrada y el evento de salida se pasará del cola al principio de la lista vinculada. El primer controlador de salida, los dos tipos de controladores no interfieren entre sí

Sitio web de referencia:

Sitio web oficial: https://netty.io/

Manual de usuario: https://netty.io/wiki/user-guide.html

《E / S escalable en Java》 :http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

Supongo que te gusta

Origin blog.csdn.net/qq_38130094/article/details/104789790
Recomendado
Clasificación