Node.JS, un peu de JavaScript… coté serveur.

Voilà quelques mois que l’on croise Node.JS un peu partout. Entre le What’s Next Paris la semaine dernière et le Paris Node Meeting de la semaine prochaine (trop tard, c’est plein !) il était temps de s’y mettre !

Node.JS, pour quoi faire ?

Le but est de développer des systèmes hautement disponibles. Partant du constat qu’un thread prend beaucoup de mémoire et de ressource pour une seule connexion, il faut trouver des alternatives.

Node.JS, créé par Ryan Dahl, propose une solution pour que les services web de nos rêves puissent répondre à des dizaines de milliers de requêtes simultanées.

On fait ça comment ?

Pour être si efficace, Node.JS travaille en bonne intelligence avec l’OS. Il n’y a pas d’opération bloquante, et tout est géré grâce à l’utilisation d’évènements et de callbacks. Grâce à cela, il devient possible de dormir coté serveur en attendant que la réponse revienne. On compte ensuite sur l’OS pour nous réveiller lors d’une nouvelle connexion.

L’API est développée autour de JavaScript (exécuté sur V8) qui est pour son créateur, le langage le plus adapté à la programmation évènementielle. C’est vrai qu’on est de plus en plus habitué à travailler avec des callbacks en JS, avec Jquery et les requêtes en Ajax.

Ok, un exemple ce serait sympa !

Pour développer des applications Node.JS (ou au moins essayer de bidouiller facilement) je vous conseille Cloud9 IDE. Cet IDE est développé en JavaScript et permet de créer des applications Node.JS sans avoir à installer quoi que ce soit ! Allez-donc vous créer un compte :)

Autour de Node.JS se développent énormément de modules, qui permettent la prise en charge des sockets, des sessions, des erreurs et plein d’autre choses qui rendent le code plus lisible et le développement plus rapide. Pour ce tout petit exemple, j’utilise socket.io, un incontournable lorsqu’il s’agit de créer des application temps réel. Socket.io gère aussi automatiquement le protocole utilisé pour les échanges (websocket, ajax, flash, …).

On va créer un serveur ultra-simple, qui renvoi “Bonjour prenom” au client qui lui passe la requête :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*Les valeurs à utiliser avec cloud9Ide*/
var PORT = process.env.C9_PORT;
var HOST = "0.0.0.0";

/* Import des librairies dont j'ai besoin.
* Sous Cloud9IDE, utilisez npm dans la console
* e.g. npm install socket.io
*/

var sys = require("sys"),
http = require("http"),
io = require("socket.io");

/* On crée un serveur simple que l'on va utiliser via
* l'extension socket.io
*/

var server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.end("Allo oui j'ecoute ?\n");
});
server.listen(PORT, HOST);

var socket = io.listen(server);
socket.on('connection', function(client){
/* Chaque nouvelle connexion, un object client est créé
* Il va falloir penser au suivi de session (regarder du coté d'express)
*/

//Actions à l'ouverture d'une connexion
client.on('message', function(data){
client.send("Bonjour "+ data);
console.log("Je dis bonjour à "+data);
});
client.on('disconnect', function(){
//Actions à la fermeture d'une connexion
});
});

 

On crée ensuite une page cliente, qui utilise socket.io :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>Node.JS Test</title>
<!-- J'avoue que charger tout jquery pour ça c'est un peu beaucoup -->
<script src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<!-- Le client lui aussi a besoin de socket.io qui gère pour nous les échanges -->
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<div>
<label for="nom">Mon nom est </label>
<input id="nom" placeholder="Marcelin">
<button id="valider">Dis-moi bonjour !</button>
</div><br \>
<span id="result"></span>
</body>
<script src="client.js"></script>
</html>

Et le script qui va avec :

1
2
3
4
5
6
7
8
9
10
11
12
//Mon host chez cloud9
var HOST = "essainodej.hugocrd.c9.io";
$(document).ready(function () {
var socket = new io.Socket(HOST);
//Lorsque je reçois un message sur le socket, je l'affiche
socket.on('message', function (data) {
$("#result").text(data);
});
socket.connect();
//Au click sur le bouton, j'envoi les données sur le socket
$("#valider").click(function() { socket.send($('#nom').val()); });
});

Je n’ai pas trouvé plus simple exemple. Sachez qu’on peut faire beaucoup plus. Je vais essayer de vous faire quelques petites choses plus complexes dans l’avenir. Ce qui serais bien maintenant, c’est de faire des tests de performance, pour comparer avec les autres solutions.

Il y a beaucoup d’articles sur le sujet, je vous conseille pour commencer de faire un tour par là :

De bons articles sur webtambouille.fr (lisez les 4 parties, c’est très complet !)

Le site du module socket.io

Plein de liens sur scoopt.it

Edit : Voici une introduction très complète peut-être faudrait-il commencer par là.

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share

À propos de Hugo Cordier

Suivez moi sur Twitter @HugoCrd
Ce contenu a été publié dans Non classé, avec comme mot(s)-clef(s) , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Node.JS, un peu de JavaScript… coté serveur.

  1. Il serait effectivement intéressant d’effectuer un benchmark.
    Côté concurrent en Java, je vois JBoss Netty et Apache Mina.

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Hugo Cordier dit :

    Netty a l’air de bien s’en sortir dans ce genre d’application, cf http://blog.ippon.fr/2011/06/15/netty-et-cassandra-en-finale-du-challenge-usi-2011/

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)

Laisser un commentaire