Nodejs est une plateforme d’application libre qui nous aide à réaliser des applications réseaux. Elle est créée par Ryan Lienhart Dahl en 2009 au sien de l’entreprise Joyent. Node s’appuie sur le moteur Javascript de Google V8, l’idée est d’utiliser des IO non bloquantes pour gérer toutes les requêtes entrantes, sortantes ainsi que tout le processus lié à la requête.
Le fonctionnement d’un serveur Apache: Chaque requête HTTP entrante se voit allouer une tâche. Celui-ci est utilisé pendant toute la durée du traitement de la requête : lecture/écriture en base de données, lecture/écriture dans des fichiers de logs ou autres, exécution de code… Ainsi, si notre code côté serveur fait un accès à la base de données, celui-ci attend une réponse. De plus, durant toute la durée de la requête, le client sera bloqué, en attendant la réponse du serveur.
Node est parmis les serveurs dits non bloquants comme Netty ou Deft pour ceux qui tournent sur JVM adoptent une autre approche. Node n’utilise qu’un seul thread pour gérer les requêtes entrantes. De plus, il ne propose pas, dans ses API, de fonctions bloquantes. Ainsi, tout notre code est asynchrone. L’avantage immédiat à cela est la simplification de la gestion de la concurrence dans les applications Nodejs qui n’est plus gérée par le développeur mais directement par l’OS.
Concrètement, toutes les fonctions fournies par Node prennent en paramètre un callback. Une fois que la fonction aura terminé son traitement, le callback sera appelé avec le résultat en paramètre et une éventuelle erreur. Ainsi, pendant toute la durée du traitement, le thread sera relâché et pourra être donné à une autre requête pour effectuer un autre traitement. Nous sommes donc face à un système évènementiel. Et Javascript est un très bon choix de langage du fait que l’on peut programmer de manière fonctionnelle avec celui-ci. Les callbacks dans tous les sens, nous connaissons très bien avec des librairies comme jQuery qui nous habituent depuis déjà quelques temps à ce type de développement.
Juste pour pinailler , il y a quand même un élément de la bibliothèque Node qui est bloquant à savoir require (module compatible commonJS) qui fait un appel synchrone pour récupérer la dépendance demandée. D’ailleurs, lors d’une séance de questions/réponses donnée il y a quelques mois, Ryan Dahl (le créateur de Node) a admis qu’il serait possible de rendre cela asynchrone mais que cela n’avait pas forcément un sens puisqu’on pouvait considérer cela comme un prérequis de développement.
Ceci est un exemple d’une application Node qui permet de créer facilement un serveur web sans passer par Apache ou Lighttpd. Je vous invite à le découvrir dans le site officiel http://nodejs.org/
var http = require('http'); var server = http.createServer(function(request, response){ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Welcome to Node JS\n'); }); server.listen(3000); console.log('Adresse du serveur: http://localhost:3000/');