Projet final : construction d’un serveur web multitâches
Ce fut un long voyage, mais nous avons atteint la fin de ce livre. Dans ce chapitre, nous allons construire un nouveau projet ensemble pour mettre en application certains concepts que nous avons vus dans les derniers chapitres, et aussi pour récapituler quelques leçons précédentes.
Pour notre projet final, nous allons construire un serveur web qui dit “Salutations !” et qui, dans un navigateur web, ressemble à l’illustration 21-1.
Voici notre plan pour la construction du serveur web :
- en savoir plus sur TCP et HTTP ;
- écouter les connections TCP sur un port ;
- interpréter une petite quantité de requêtes HTTP ;
- créer une réponse HTTP adéquate ;
- augmenter le débit de notre serveur avec un groupe de tâches.
Illustration 21-1 : Notre dernier projet en commun
Avant de commencer, nous devons mentionner deux points. D’abord, la méthode que nous allons utiliser n’est pas la meilleure pour construire un serveur web avec Rust. Des membres de la communauté ont publié un certain nombre de crates éprouvées en production, disponibles sur crates.io, qui proposent des implémentations de serveurs web et de groupe de fils d’exécution plus complets que ce que nous allons construire. Toutefois, notre intention dans ce chapitre est de vous aider à apprendre, et non pas de se laisser aller à la facilité. Comme Rust est un langage de programmation système, nous pouvons choisir le niveau d’abstraction avec lequel nous souhaitons travailler et nous pouvons descendre à un niveau plus bas que ce qu’il est possible ou pratique de faire dans d’autres langages.
Deuxièmement, nous n’allons pas utiliser ici async ni await. Construire un groupe de fils d’exécution est un défi suffisamment important en lui-même, sans y ajouter en plus la création d’un environnement d’exécution asynchrone ! Toutefois, nous prendrons note de la manière dont async et await pourraient s’appliquer à certains des problèmes que nous rencontrerons au fil de ce chapitre. En fin de compte, comme nous l’avions noté dans le chapitre 17, de nombreux environnements d’exécution asynchrones utilisent des groupes de fils d’exécution pour gérer leur travail.
Nous allons écrire manuellement le serveur HTTP basique et le groupe de fils d’exécution, afin que vous puissiez apprendre les idées et techniques générales qui se cachent derrière les crates que vous serez peut-être amenés à utiliser à l’avenir.