Explicação detalhada da série IO (2) dos componentes netty e modelo de rosca


Introdução: Netty é uma estrutura cliente-servidor NIO que pode desenvolver aplicativos de rede de forma rápida e fácil, como servidores de protocolo e clientes. Ele simplifica e simplifica muito a programação de rede, como servidores de soquete TCP e UDP.

Cenários de uso de Netty:

Setor de Internet: Em um sistema distribuído, chamadas de serviço remoto são necessárias entre vários nós, e uma estrutura RPC de alto desempenho é indispensável. Como uma estrutura de comunicação assíncrona de alto desempenho, o Netty é frequentemente usado por essas estruturas RPC como um componente básico de comunicação. As aplicações típicas são: Estrutura de serviço distribuído de Ali A estrutura RPC de Dubbo usa o protocolo Dubbo para comunicação entre nós, e o protocolo Dubbo usa Netty como o componente básico de comunicação por padrão para implementação. Comunicação interna entre nós de processo. A camada inferior do Rocketmq também usa Netty como o componente básico de comunicação.
Indústria de jogos: seja um servidor de jogos para dispositivos móveis ou um jogo online em grande escala, a linguagem Java tem sido cada vez mais usada. Como um componente de comunicação básico de alto desempenho, o próprio Netty fornece pilhas de protocolos TCP / UDP e HTTP.

Explicação detalhada do modelo netty:

  1. O Netty abstrai dois grupos de pools de threads, BossGroup e WorkerGroup. BossGroup é responsável por receber conexões de clientes e WorkerGroup é responsável por leituras e gravações na rede.
  2. Os tipos BossGroup e WorkerGroup são NioEventLoopGroup
  3. NioEventLoopGroup é equivalente a um grupo de thread de loop de evento, este grupo contém vários threads de loop de evento, cada thread de loop de evento é NioEventLoop
  4. Cada NioEventLoop possui um seletor, que serve para monitorar a comunicação da rede do socketChannel nele cadastrado
  5. Existem 3 etapas em cada execução do loop interno do thread Boss NioEventLoop
  • Processe o evento de aceitação, estabeleça uma conexão com o cliente e gere um NioSocketChannel
  • Registre o NioSocketChannel para o seletor em um NIOEventLoop de trabalho para processar as tarefas da fila de tarefas, ou seja, runAllTasks
  1. Etapas executadas por cada loop de thread NIOEventLoop do trabalhador
  • Pesquisa de eventos de leitura e gravação de todos os NioSocketChannels registrados em seu seletor
  • Eventos de I / O de processo, ou seja, eventos de leitura e gravação e negócios de processo no NioSocketChannel correspondente
  • runAllTasks lida com as tarefas da fila de tarefas TaskQueue, e algum processamento de negócios demorado geralmente pode ser colocado em TaskQueue para ser processado lentamente, de modo a não afetar o fluxo de dados no pipeline.
  1. Quando cada trabalhador NIOEventLoop processa o negócio NioSocketChannel, ele usa o pipeline (pipeline), e muitos processadores manipuladores são mantidos no pipeline para processar os dados no canal

Componentes do módulo central Netty

1. Bootstrap 、 ServerBootstrap

Bootstrap significa boot. Um aplicativo Netty geralmente começa com um Bootstrap. Sua função principal é configurar todo o programa Netty e conectar vários componentes em série. A classe Bootstrap no Netty é a classe de boot de inicialização do programa cliente e ServerBootstrap é o servidor classe de inicialização de inicialização.

2. Futuro 、 ChannelFuture

Todas as operações de E / S no Netty são assíncronas e não se sabe imediatamente se a mensagem foi processada corretamente. Mas você pode esperar que ele termine de executar ou registrar um ouvinte diretamente. A implementação específica é por meio de Future e ChannelFutures. Eles podem registrar um ouvinte. Quando a operação é executada com êxito ou falha, o ouvinte aciona automaticamente o evento de ouvinte registrado.

3. Canal

Um componente de comunicação de rede Netty que pode ser usado para realizar operações de E / S de rede. O canal fornece aos usuários:

  1. O status do canal de conexão de rede atual (por exemplo, está aberto? Está conectado?)
  2. Parâmetros de configuração da conexão de rede (por exemplo, o tamanho do buffer de recebimento)
  3. Fornece operações de E / S de rede assíncronas (como estabelecer uma conexão, ler e gravar e vincular portas). As chamadas assíncronas significam que qualquer chamada de E / S retornará imediatamente e não há garantia de que a operação de E / S solicitada foi concluído no final da chamada. realizar
  4. A chamada retorna imediatamente uma instância de ChannelFuture. Ao registrar um ouvinte no ChannelFuture, o chamador pode ser chamado de volta para notificá-lo quando a operação de E / S for bem-sucedida, falhar ou for cancelada.
  5. Suporta operações de I / O associadas e manipuladores correspondentes.
    Diferentes protocolos e conexões de diferentes tipos de bloqueio têm diferentes tipos de canais correspondentes a eles
1 NioSocketChannel,异步的客户端TCP Socket 连接。
2 NioServerSocketChannel,异步的服务器端TCP Socket 连接。
3 NioDatagramChannel,异步的UDP连接。
4NioSctpChannel,异步的客户端 Sctp 连接。
5 NioSctpServerChannel,异步的 Sctp 服务器端连接,这些通道涵盖了UDP和TCP网络IO以及文件IO。

4. Seletor

Netty implementa multiplexação de E / S com base no objeto Selector.Através do Seletor, um thread pode monitorar os eventos de Canal de múltiplas conexões. Quando um canal é registrado em um Seletor, o mecanismo interno do Seletor pode consultar automática e continuamente (Selecionar) se esses canais registrados têm eventos de I / O prontos (como legível, gravável, conexão de rede completa, etc.) programa pode simplesmente usar um thread para gerenciar de forma eficiente vários canais

5. NioEventLoop

NioEventLoop mantém um thread e uma fila de tarefas, que suporta o envio assíncrono de tarefas de execução. Quando o thread é iniciado, o método run de NioEventLoop é chamado para executar tarefas I / O e tarefas não I / O: tarefas I / O, isto é, o evento pronto na selectionKey, como aceitar, conectar, ler, escrever, etc., disparado pelo método processSelectedKeys.
Tarefas não-IO, tarefas adicionadas a taskQueue, como register0, bind0 e outras tarefas, são acionadas pelo método runAllTasks.

6. NioEventLoopGroup

NioEventLoopGroup, que gerencia principalmente o ciclo de vida do eventLoop, pode ser entendido como um pool de threads, um conjunto de threads é mantido internamente. Cada thread (NioEventLoop) é responsável pelo processamento de eventos em vários canais, e um canal corresponde a apenas uma thread.

7. ChannelHandler

ChannelHandler é uma interface que processa eventos de I / O ou intercepta operações de I / O e encaminha para o próximo manipulador em seu ChannelPipeline (cadeia de processamento de negócios)

8. ChannelPipline

Salve a lista de ChannelHandler, que é usada para processar ou interceptar eventos de entrada e operações de saída do Canal. ChannelPipeline implementa uma forma avançada de modo de filtro de interceptação, permitindo aos usuários controlar totalmente como os eventos são tratados e como cada ChannelHandler no Canal interage entre si. No Netty, cada Canal tem e apenas um ChannelPipeline correspondente a ele. Um Canal contém um ChannelPipeline, e o ChannelPipeline mantém uma lista duplamente vinculada composta de ChannelHandlerContext, e cada ChannelHandlerContext está associado a um ChannelHandler. O evento de leitura (evento de entrada) e o evento de gravação (evento de saída) estão em uma lista duplamente vinculada. O evento de entrada será passado do cabeçalho da lista para o último manipulador de entrada, e o evento de saída será passado do cauda para o início da lista vinculada. O primeiro gerenciador de saída, os dois tipos de gerenciador não interferem um com o outro

Site de referência:

Site oficial: https://netty.io/

Manual do usuário: https://netty.io/wiki/user-guide.html

《Escalável IO em Java》 :http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

Acho que você gosta

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