Démystifier Netty - la conception et l'utilisation du pipeline

Je crois que tout le monde connaît le modèle de la chaîne de responsabilité. Il est largement utilisé dans divers produits open source tels que tomcat et spring.

Abstraction du modèle de conception de la chaîne de responsabilité

Comme le montre la figure ci-dessus, dans l'implémentation du projet de chaîne de responsabilité, une liste chaînée ou un tableau est essentiellement maintenu, ainsi que l'index currentIndex de l'emplacement d'exécution actuel. Chaque fois que la méthode doFilter() de la chaîne de responsabilité est appelée, le filtre suivant sera exécuté en fonction de l'index actuel.

Conception de PipeLine à Netty

Grâce à ce diagramme de classes, nous pouvons voir à peu près que la conception du pipeline dans netty adopte également le modèle de chaîne de responsabilité. ChannelHandler enveloppe une couche de ChannelHandlerContext. ChannelHandlerContext peut former une liste chaînée grâce à la conception de tête et de queue. Les appels externes utilisent ChannelPipeLine comme entrée. nelHandler.

Le pseudocode de l'ensemble de l'implémentation est présenté ci-dessous.

——>ChannelHandlerContext#fireChannelActive
——>Handler#channelActive(ChannelHandlerContext context){
    
    doSth();
    ctx#next()
}

Interprétation de ChannelHandler

Le channelHandler dans Netty est divisé en outboundHandler et inboundHandler. Le ChannelHandler entier est exécuté dans l'ordre d'écriture d'abord, puis de lecture, outboundHandler—>write—read—>inboundHandler.

Par exemple, lorsqu'un pipeline ajoute un gestionnaire comme suit, alors

L'ordre d'exécution pour l'inbound est : 1, 2, 3, 4, 5

L'ordre d'exécution pour les sorties est : 5, 4, 3, 2, 1

p.addLast("1", new InboundHandlerA());
p.addLast("2", new InboundHandlerB());
p.addLast("3", new OutboundHandlerA());
p.addLast("4", new OutboundHandlerB());
p.addLast("5", new InboundOutboundHandlerX());

Lorsqu'un channelHandler est ajouté au channelPipeline, la méthode handlerAdded du gestionnaire sera exécutée automatiquement. handlerAdded est la première méthode exécutée après l'ajout du gestionnaire, et c'est aussi la première méthode qui doit être exécutée. Si handlerAdded n'est pas exécuté, les autres méthodes de handler ne peuvent pas être exécutées. Lorsque la chaîne d'appels arrive, le gestionnaire sera automatiquement ignoré et le gestionnaire suivant sera exécuté. L'ensemble du flux d'exécution est le suivant.

Ajouter ChannelHandler --> Exécuter ChannelHandler#handlerAdded --> ChannelHandler#doSth --> fireNextChannelHandler -->

ChannelHandler couramment utilisé

1) ChannelInitializer : il est utilisé pour initialiser rapidement le canal après l'enregistrement du canal dans l'EventLoop. Le principe est que le ChannelInitializer lui-même est également un ChannelHandler. Lorsque le ChannelInitializer déclenche la méthode HandlerAdded, il appellera la méthode initChannel. La méthode initChannel peut être réécrite et l'utilisateur peut personnaliser divers gestionnaires.

2) ServerBootstrapAcceptor : ce gestionnaire est principalement utilisé du côté ServerChannel pour accepter de nouvelles connexions client et enregistrer le childChannel nouvellement créé dans ChildEventLoop

3) SimpleChannelInboundHandler : En héritant de cette classe, vous pouvez implémenter rapidement le traitement de certains types de messages, comme implémenter rapidement le traitement des messages de type String, etc.

Pour résumer, dans le processus de programmation netty, le processus principal consiste à créer un canal --> configurer le pipeline du canal --> enregistrer le canal sur eventloop --> établir une connexion et démarrer l'opération IO


Contenu plus excitant, bienvenue pour faire attention

Zhihu : https://www.zhihu.com/people/mei-an-63

RPSC:https://blog.csdn.net/qq_42672856​

WeChat :

Je suppose que tu aimes

Origine blog.csdn.net/qq_42672856/article/details/115878018
conseillé
Classement