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 :