Conception de conteneurs Web
Le développement d'un conteneur Web implique de nombreuses technologies à différents niveaux, tels que la connaissance de la couche de communication, la connaissance du niveau de langue du programme, etc., et un conteneur Web disponible est un système relativement important, et il faut beaucoup de temps pour l'expliquer clairement. Cet article vise à présenter comment concevoir un conteneur Web, à discuter uniquement des idées d'implémentation et n'implique pas trop d'implémentations spécifiques. Cassez-le en plusieurs modules et composants. Chaque module de composant est responsable de différentes fonctions. La figure suivante répertorie certains composants de base et introduit chaque composant.
Connectez-vous au récepteur
La responsabilité principale est d'écouter s'il existe une connexion de socket client et de recevoir la prise, puis de remettre la prise à l'exécuteur de la tâche (pool de threads) pour l'exécution. Lisez en continu les prises du bas du système, effectuez le moins de traitement possible, puis jetez-les dans le pool de threads. Pourquoi souligner la nécessité de gérer le moins possible? Ceci est lié aux problèmes de performances du système, et un traitement excessif affectera sérieusement le débit. Étant donné qu'il n'y a généralement qu'un seul récepteur (un thread est responsable de la réception du socket), il aura probablement un impact sur la durée de chaque processus de réception. Par conséquent, le récepteur fait très peu et simple, conservant uniquement quelques variables d'état, le fonctionnement d'accumulation de la porte de commande de débit, le fonctionnement de réception de Serversocket, définissant certaines propriétés de la prise reçue, plaçant la prise reçue dans le pool de threads et la manipulation des exceptions. Une autre logique qui prend beaucoup de temps à traiter est remise au pool de threads, comme lire les données sous-jacentes de la prise, analyser les paquets de protocole HTTP et répondre à certaines opérations du client, etc.
Contrôleur de numéro de connexion
Pour une machine, le trafic total des demandes d'accès a une période de pointe et le serveur a une limite physique. Afin de s'assurer que le serveur Web n'est pas emporté, nous devons prendre certaines mesures pour le protéger et la prévenir. Le trafic ici doit être expliqué un peu plus sur le nombre de connexions de socket, qui contrôle le trafic en contrôlant le nombre de connexions de socket. Une méthode efficace consiste à adopter le contrôle du flux, qui est comme l'ajout d'une porte à l'entrée de l'écoulement. La taille de la porte détermine la taille de l'écoulement. Une fois le débit maximal atteint, la porte sera fermée et cessa de recevoir jusqu'à ce qu'il y ait un canal inactif. Les compteurs peuvent être implémentés à l'aide du cadre AQS de JDK.
Socket usine
Différentes occasions d'utilisation peuvent nécessiter des niveaux de sécurité différents. Par exemple, lorsque les transactions liées au paiement, les informations doivent être cryptées avant l'envoi, ce qui implique également le processus de négociation clé, tandis que dans d'autres occasions ordinaires, il n'est pas nécessaire de crypter le paquet. Réfléchir à la couche d'application est un problème d'utilisation de HTTP et HTTPS.
Autrement dit, le protocole TLS / SSL fournit des services d'authentification pour chaque communication ① pour authentifier la légalité de l'identité de l'entité de cette session. ② Fournir des services de chiffrement et le fort mécanisme de chiffrement peut garantir que les messages pendant la communication ne seront pas déchiffrés. ③ Fournir des services à l'épreuve des infréments, utiliser l'algorithme de hachage pour signer des messages et vous assurer que le contenu de communication n'est pas falsifié par vérification des signatures.
Le protocole HTTP correspond à Socket, tandis que HTTPS correspond à SSLSocket. Comment générer des sockets et SSLSOCKET est remis à l'usine de socket.
Tâche définie - tâche
Définissez les tâches à exécuter et indiquez au pool de thread quel type de tâches à exécuter. La tâche est principalement divisée en trois points: traitement des prises et répondre aux clients, diminuer le compteur de comptage de connexion et fermer la prise. Parmi eux, le traitement de la prise est le plus important et le plus complexe. Il comprend la lecture du flux d'octets de socket sous-jacent, l'analyse du message de demande du protocole HTTP (analyse de la ligne de demande, de l'en-tête de demande, du corps de la demande et d'autres informations), d'obtenir le chemin en fonction de l'analyse de la ligne de demande pour trouver les ressources du projet Web sur l'hôte correspondant, et assembler le message de réponse du protocole HTTP en fonction des résultats du traitement et la sortie au client.
Exécuteur de tâche
Un pool de threads avec un nombre maximum et minimum de threads est appelé un "exécuteur de tâches" car le pool de threads peut être considéré comme démarrant plusieurs threads pour détecter en continu une file d'attente de tâches, et une fois qu'une tâche doit être exécutée est trouvée, elle sera exécutée. Le nombre maximum et minimum de filetages limite, la limite de temps de récupération de filetage redondante, l'action de rejet effectuée par le pool de filetages lorsque le nombre maximum de threads dépasse, etc.
Lecture de messages
Utilisé pour lire les paquets du client au système d'exploitation sous-jacent et fournir un mécanisme tampon. Copiez le message à Desbuf.
Sortie du message
Utilisé pour écrire des paquets traités par des conteneurs Web au système d'exploitation et fournir un mécanisme tampon. Écrivez le message OutputBuf sur le système d'exploitation via le tampon.
Filtre d'entrée
Dans ce processus de lecture, un traitement supplémentaire est souhaité et ces traitements supplémentaires peuvent être effectués différemment en fonction des différentes conditions. Compte tenu du découplage et de l'extension du programme, des filtres sont introduits. Ce n'est qu'après les opérations de filtrage que nous pouvons atteindre DESBUF à travers des couches de filtres. Ce processus revient à ajouter des niveaux de traitement. Les opérations correspondantes seront effectuées après avoir traversé les niveaux, et enfin les données source aux données de destination seront terminées.
Filtre de sortie
Il est similaire à la fonction de filtre d'entrée et est utilisé lors de la sortie du message.
Analyseur de message
Offre la possibilité d'analyser diverses parties du protocole HTTP.
Demander un générateur
Selon l'idée orientée objet, les champs d'attributs et de protocole liés à la demande dans chaque processus de demande sont abstraits en un objet de demande. Il comprend trois parties: la ligne de demande, l'en-tête de demande et le corps de demande. Les valeurs nécessaires pendant le traitement peuvent être directement obtenues à partir de l'objet de demande. Fournit une commodité pour la mise en œuvre des normes de servlet.
Générateur de réponse
Correspondant à la demande, un générateur d'objets de réponse est requis. Il comprend trois parties: ligne de réponse, en-tête de réponse et corps de réponse. Les valeurs pertinentes dans le résultat de traitement peuvent être directement définies sur l'objet de réponse. Fournit une commodité pour la mise en œuvre des normes de servlet.
Adresse
Un mappeur d'adresse est un routeur qui demande et les ressources. Un accès demandé est mappé en fonction du chemin pour trouver la ressource de la réponse au client demandeur.
cycle de vie
Afin de modulariser davantage, l'ensemble du conteneur a de nombreux composants, ce qui peut nécessiter différents événements à différents moments et nécessiter un cycle de vie pour gérer tous les composants de manière unifiée. Par exemple, le démarrage, l'arrêt et l'arrêt de tous les composants sont séparés de la gestion unifiée des cycles de vie, ce qui peut faciliter la gestion du cycle de vie de ces composants. J'espère faire quelque chose avant et après que quelque chose se passe dans un certain état? Ajoutez un auditeur de cycle de vie pour réaliser gracieusement.
Manager JMX
Surveillance et gestion de l'état du fonctionnement du système, performances du serveur, collection de paramètres liés au serveur, chargement JVM, numéro de connexion Web, pool de threads, pool de connexions de base de données, gestion de cache, rechargement des fichiers de configuration, etc. Il peut fournir une gestion visuelle distante, avec des performances élevées en temps réel. Il fournit également une solution pour la gestion des systèmes distribués.
Chargeur Web
WeBloader est utilisé pour charger des projets d'application Web. Un conteneur Web peut contenir plusieurs applications Web. Afin d'atteindre l'isolement entre la LIB et le servlet, un chargeur de classe différent, Classloader, doit être utilisé pour chaque application Web, et ces chargeurs de classe ne sont pas des relations parent-enfant, afin d'atteindre l'effet d'isolement de classe, c'est-à-dire que la lib d'une application Web ne sera pas utilisée par d'autres applications Web.
Directeur de session
Le gestionnaire de session gère principalement les sessions, notamment: ① générer des sessionides. Généralement, les cookies ou les URL n'ont pas de valeurs JSessionID, et le SessionID doit être régénéré en tant que sessionID. ② De nombreuses sessions clients sont enregistrées sur le serveur. Pour les séances de délai d'expiration, vous devez nettoyer régulièrement pour vous assurer que la mémoire du serveur n'est pas gaspillée. ③ Pour certaines sessions importantes, elles peuvent être persistées sur le disque et peuvent être rechargées dans la mémoire pour une utilisation en cas de besoin.
Journal d'exécution
Enregistrez certains avertissements, exceptions et erreurs lors de l'exécution.
Journal d'accès
Le journal d'accès enregistre généralement les informations liées à l'accès du client, y compris l'IP du client, la demande de demande, le protocole de demande, la méthode de la demande, le numéro d'octet de demande, le code de réponse, l'identification de la session, le temps de traitement, etc.
Responsable de la sécurité
Un projet Web s'exécute sur une plate-forme de conteneur Web, qui ressemble à l'intégration d'une application sur une plate-forme à exécuter. Pour faire fonctionner le programme intégré normalement, la plate-forme doit être en mesure d'exécuter en toute sécurité et normalement. Et pour s'assurer que la plate-forme n'est pas affectée par les applications intégrées dans la plus grande mesure, les deux atteignent l'effet de l'isolement dans une certaine mesure. Au démarrage, le fichier de stratégie est spécifié par -djava.security.manager -djava.security.policy == web.policy, qui définit diverses autorisations.
Surveillance des opérations et gestion à distance
Fournit une plate-forme qui peut surveiller l'état exécuté des conteneurs Web en temps réel et peut être géré à distance.
Grappe
Il existe généralement deux types de clusters: ① Clusters d'équilibrage de charge, qui utilisent généralement un certain algorithme de distribution pour distribuer uniformément le trafic d'accès à chaque machine dans le cluster pour le traitement. ② Clusters à haute disponibilité, la communication de cluster relie plusieurs machines. Ce type de cluster se concentre davantage sur la garantie de la disponibilité externe de l'ensemble du cluster grâce à la commutation automatique ou au transfert de trafic après que une machine dans le cluster échoue.
Généralement, les demandes Web sont apatrides et peuvent être directement regroupées, mais la session implique l'état de l'état et nécessite l'utilisation de la technologie de communication en cluster pour copier des sessions. Les technologies connexes incluent la multidiffusion et unicast.
Moteur de serviette
Le servlet utilise la réflexion pour générer des objets dans le servlet et JSP dans l'application Web et les mettre dans le pool d'objets servlet, et appelle les méthodes correspondantes en fonction de la situation réelle. L'application Web place le traitement de la logique métier dans la méthode DoPost ou Dog. Lorsque le conteneur Web traite la demande, il le traitera en fonction de la logique de traitement définie ici, et le client de réponse sera répondu.
Compilateur JSP
Selon la spécification, JSP est finalement compilé dans l'exécution du servlet, donc le fichier JSP doit être compilé en fonction de la spécification. Le compilateur JSP traduit en fait la syntaxe JSP et le traite en fonction de la syntaxe JSP.
Un conteneur Web contient essentiellement les fonctions des composants introduits ci-dessus. Vous pouvez créer un conteneur Web qui permet à votre Web de l'exécuter en fonction de l'implémentation de chaque module de composant.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!