Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

MEAN, votre nouveau stack préféré

Par Nicolas BONZOM Publié le 27/10/2015 à 08:04:20 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Je suis fan de Node.JS. C'est un fait.

Il y a 3 ans, quand je ne connaissais pas encore cette technologie, plusieurs personnes m'en ont parlé comme si c'était mieux que tout. On m'a dit que Node.JS allait dominer le monde du Web. Que les plus grands allaient passer sur Node.JS. J'ai fini par me dire "Ok, voyons voir de quoi ils parlent !". J'ai donc lu des articles, j'ai appris, je me suis amélioré, j'ai pris du recul, et aujourd'hui je vous écris cet article pour vous partager mon expérience.

Mes amis me posent souvent la grande question : "Pourquoi Node.JS ?". Ainsi que "Et MongoDB, tu en parles beaucoup aussi ! Le NoSQL est donc mieux que le SQL pour toi ?". Et j'en passe, croyez-moi.

Pour être honnête, je n'ai jamais su répondre à ces questions. Comment dire qu'un langage ou qu'un stack est mieux qu'un autre ? Ils ont chacun leurs spécificités. Je vais donc tenter de vous expliquer pourquoi vous pourriez au moins vous y intéresser.

Et sans vouloir vous dévoiler la fin du film : Dans ce que l'on m'avait dit il y a trois ans... Il y avait du vrai. Et du faux.

MEAN, ça veut dire quoi ?

Vous connaissez peut être WAMP (aussi LAMP / MAMP) ? C'est un stack, qui est composé d'Apache, MySQL et PHP.

MEAN est également un stack. C'est un ensemble de technologies qui forment un environnement complet pour une application. Ici, MEAN signifie "MongoDB Express Angular Node". Ce sont tous les éléments qui le composent (ou presque). Détaillons les rapidement.

MongoDB

C'est la Base de Donnée. Elle est de type NoSQL. Et non, ce n'est pas du SQL. On peut dire que c'est une grosse collection remplie de propriétés clé-valeur.

Node.js

Ce sera ici un serveur Web (bien qu'il peut être bien plus que ça). Il va s'occuper de recevoir les requêtes HTTP, de les traiter et de renvoyer un résultat. C'est donc l'équivalent d'Apache par exemple. On écrit le code en Javascript (équivalent de PHP ici).

Express.js

C'est un framework web pour Node.js et écrit en Node.js. C'est son framework le plus célèbre. Il vous simplifie grandement la vie à l'aide de fonctions vous évitant de nombreuses lignes répétitives de code.

J'ai personnellement appris Node.JS avec ce framework. Certains diront que j'aurais mieux fait d'apprendre Node.js de manière brute avant d'utiliser une quelconque sur-couche. Je leur répondrais que c'est vrai d'une manière générale mais que cela m'a grandement aidé en évitant de rentrer directement dans des rouages bas-niveau qui m'auraient certainement dégoûté du langage. Car oui, Node.JS est bas niveau. Si vous ne savez pas ce que cela signifie ou que vous ne comprenez pas ce que je veux expliquer, nous y reviendrons plus tard en détail.

Angular.JS

Réalisé par Google, c'est un framework front-end. Ce qui signifie qu'il est utilisé côté client, et non sur votre serveur. C'est lui qui va gérer ce qui s'affiche sur la page de l'utilisateur. Nous y reviendrons également plus tard.

Pourquoi ces technologies ?

Si vous êtes comme moi, vous serez effrayé par le fait de devoir apprendre quatre nouvelles technologies, alors que vous savez déjà utiliser le stack WAMP, par exemple. En un mot : Javascript. TOUTES ces technologies utilisent le Javascript ! Un langage pour les gouverner tous.

Node.JS est scripté en Javascript, Express.js l'est donc naturellement aussi. Angular.JS est juste une sur-couche de Javascript. Et enfin MongoDB utilise du Javascript ! Vous faites vos appels à la base de donnée en Javascript, et il vous retourne du Javascript (JSON).

Donc si vous connaissez déjà le Javascript (j'utiliserai le raccourci JS par moment), vous n'avez aucun langage à apprendre, seulement les fonctions proposées à découvrir. Simplement.

Je parle essentiellement du point de vue Développeur, mais pour une entreprise, ceci est complètement novateur. Les développeurs front-end (côté client) peuvent aisément comprendre le back-end (côté serveur), et vice-versa. Les employés connaissent déjà le langage. Plus besoin de chercher un spécialiste sénior PHP/PERL/etc, puis un spécialiste sénior Javascript.

De plus, Node.JS est "Production Ready" à l'heure où je vous parle. C'est-à-dire qu'il peut être utilisé pour de gros projets sans risque de bugs, et que ses performances ne sont en aucun cas derrière. Créé en 2009, Node.js a pris suffisamment de maturité, si bien qu'il peut désormais être utilisé de manière sereine. De grosses sociétés ont d'ailleurs franchis le cap tel que Paypal, Netflix, LinkedIn et bien d'autres. Pour ce qui est du "Production Ready" je vous invite à lire cet article (en Anglais) qui détaillera bien mieux que moi.

Paypal a d'ailleurs édité un excellent article pour expliquer leurs motivations d'abandonner Java au profit de Node.js. En voici un extrait :

"Historically, our engineering teams have been segmented into those who code for the browser (using HTML, CSS and JavaScript) and those who code for the application layer (using Java). Imagine an HTML developer who has to ask a Java developer to link together page “A” and “B”. That’s where we were. This model has fallen behind with the introduction of full-stack engineers, those capable of creating an awesome user interface and then building the application backing it."

Traduit par :

"Historiquement, nos équipes d'ingénieurs ont été séparés entre ceux qui codent pour le navigateur (en utilisant du HTML, CSS, et JavaScript) et ceux qui codent pour la couche application (en utilisant du Java). Imaginez un développeur HTML qui demande à un développeur Java de relier les pages "A" et "B" ensemble. Nous en étions là. Ce modèle est du passé suite à l'introduction d'ingénieurs "full-stack", ceux qui sont capable de créer une interface utilisateur géniale, et de créer l'application qui gère tout cela ensuite."

Ces technologies ont donc Javascript comme fil rouge. Elles interagissent parfaitement entre elles avec leur langage commun, et c'est une joie à débugger. Détaillons donc chaque élément de ce stack pour vous donner envie de créer votre premier "Helloworld" par la suite.

Pourquoi Node.js ?

Node.js a des capacités énormes

Node.js repose sur le moteur Javascript V8 de Google. Sans entrer dans des détails que vous pouvez trouver dans cet excellent article (en Anglais), c'est une machine virtuelle dans laquelle notre code va être exécuté. Cependant, le code est compilé (et non interprété) en langage machine sans intermédiaire (pas de bytecode), ce qui rend notre application extrêmement performante.

Aussi, Node.js est non bloquant, basé sur des événements et singlethread. Pour appréhender ces concept, on m'avait donné l'analogie que voici : Imaginez que votre code est le Roi. Son serviteur en chef va venir le consulter pour connaître les tache à effectuer. Le roi va donc les lui lister et se rendormir. Le serviteur en chef va alors répartir les tâches à l'ensemble des autres serviteurs. Quand un serviteur a fini son travail, il vient faire la queue pour faire son rapport au roi, qui ne prend qu'une seule personne à la fois. Quand c'est son tour, il va exposer ce qu'il a fait, et le roi peut lui donner d'autres tâches à accomplir.

Traduisons cela. Vu que Node.js n'utilise qu'un seul thread, son code ne peut être lu qu'une seule fois en même temps (Le roi ne voit qu'un seul serviteur à la fois). Au lieu de traiter chaque tâche directement puis de passer à la suivante, il va la donner à un serviteur qui va la faire de son côté. Pendant ce temps le roi peut continuer de travailler de son côté. C'est le concept de non-bloquant. Ainsi, dès que le serviteur a fini, il va dire "Hé, j'ai fini mon boulot !" (C'est le principe d'évènement), et dès que ça sera son tour, le roi pourra lui donner la suite à effectuer.

Cette architecture est donc extrêmement performante. PHP est par exemple bloquant. Ce qui signifie que si il y a une tâche qui lui prend 3 secondes, tout le monde sera bloqué 3 secondes avant qu'il passe à la suite. Pour parer à ce problème, PHP est multithread, pouvant provoquer une grosse charge mémoire et un traitement plus long.

Ainsi, Node.js s'est rapidement crée une place importante dans le monde de l'informatique. Ce qui provoque le dernier point fort de ma liste : Son énorme communauté. De très nombreux packages ont vu le jour sur NPM, répondant à presque tout les problèmes. De nombreux articles, tutoriaux ont également été créés partout sur le web. Et si vous bloquez sur un problème, Stackoverflow trouvera votre solution en un rien de temps si ça n'a pas déjà été fait.

Il n'a donc aucune faiblesse ?

Node.js est extrêmement puissant. Il n'empêche qu'il n'est pas optimisé pour toutes les tâches. En effet, du fait qu'il repose sur une base singlethread (un seul coeur qui s'occupe de tout), il n'est pas adapté pour des tâches demandant un traitement CPU important. L'avantage de Node réside dans sa capacité à répondre à un important nombre de requêtes par secondes. Toutes les requêtes sont traitées en même temps en parallèle. Donc même si la tâche lourde est placée en arrière plan, le serviteur mettra beaucoup de temps pour la terminer car il reste sur le même système singlethread.

Il existe cependant une méthode de contrer ce problème. Node.js fournit un module nommé "cluster" permettant de mieux tirer profit des serveurs multi coeurs. Cependant cette technologie est encore mal gérée, et le travail d'assigner telle tâche à tel worker est encore réaliser par le système d'exploitation et non par Node.js (bien qu'au moment où j'écris ces ligne, il a été annoncé il y a peu qu'il travaillent dur sur le sujet pour intégrer l'assignation de tâches à Node lui même).

Vous pouvez aussi créer plusieurs instance de Node.js en lançant Node plusieurs fois, et en mettant le tout derrière un serveur Nginx par exemple.

Et niveau statistiques ?

Tout ça c'est bien beau, mais j'imagine que vous voulez du concret, des chiffres ! Laissez moi donc vous donner plusieurs benchmark qui ont été réalisé par des tiers.

-Un million de connexions concurrentes avec 15Go de RAM ! C'est la performance incroyable qu'a constaté un bloggeur. Voici le lien de l'article présentant son test. http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

-Paypal qui a abandonné Java pour Node.js relatent a travers un billet leur motivations. Je vous en ai parlé plus haut, mais ils ont également réalisé des tests qu'ils présentent dans leur billet. Je vous invite donc à voir le résumé du combat Node.js VS Java qui s'est déroulé chez eux. Spoiler : Node.js gagne ! https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

-Si vous venez du monde PHP, voici un autre article faisant état de plusieurs tests que ce bloggeur a réalisé. Je vous laisse découvrir le résultat. http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/

Express.js, le Framework Web

Express.js va vous simplifier la création d'un serveur HTTP. Il apporte bon nombre de fonctions qui vous permettent de vous concentrer sur la logique de votre application plutôt que sur ses rouages bas niveau. Car oui, nous l'avons dit, Node.js est bas niveau. Vous pouvez aisément créer un serveur HTTP, UDP, SMTP et autres. C'est donc un gain de temps (et donc d'argent) énorme. Node.js dispose de nombreuses fonctions, mais pour la création d'un serveur HTTP, vous devriez par exemple réaliser le routeur vous même (décoder les url etc). C'est ici qu'Express intervient. Il vous apporte des fonctions permettant de gérer le routage, les sessions, les téléchargements et bien d'autres. Il est alors devenu rapidement le framework numéro un pour Node.js.

Un autre point très important chez Express : Les Middlewares. Pour être simple, ce sont des fonctions ayant accès à la requête et à la réponse et qui sont appelées avant le routeur par exemple. Il y a des milliers d'utilisations possible, mais imaginez par exemple réaliser une fonction vérifiant si l'utilisateur est bien connecté. Vous pouvez alors faire en sorte que ce middleware soit appelé pour toutes les pages le nécessitant.

Le site d'Express.js étant très bien documenté et expliqué, je vous invite à y faire un tour pour découvrir ce qu'il a dans le ventre.

MongoDB donne de la clarté

MongoDB est une base de donnée de type NoSQL. Outre ses performances et sa simplicité d'utilisation et de compréhension, il s'adapte parfaitement à MEAN en stockant tout en JSON. C'est un vrai bonheur à utiliser. Tout est stocké sous la forme clé-valeur dans des collections (des objets JSON). Bien que très simple à utiliser, il existe un excellent module souvent proposé avec ce stack nommé Mongoose.js.

Mongoose est un ODM (Object Document Mapper). Peut-être que vous connaissez le terme ORM (Object Relational Mapper) qui est utilisé en SQL. Et bien c'est la même chose pour le NoSQL (du moins pour les base de données NoSQL de type documents). Mongoose va vous simplifier diverses tâches de MongoDB, et va aussi apporter des fonctionnalités comme la population ou les Schémas. Imaginons que vous souhaitiez gérer des utilisateurs. Vous allez créer un schéma utilisateur et indiquer ses propriétés et types qu'il doit recevoir (Nom, Prénom, etc). Par la suite, vous allez créer un Modèle basé sur ce schéma, que vous pourrez manipuler comme un objet. Cela permet une régularité dans l'architecture de vos données et vous donne une abstraction complète de la base de donnée. Vous ne manipulez que vos Modèles et tout le monde est content ! Surtout vous en fait.. Et le développeur qui passera après vous.

Angular.JS

Angular.js a réalisé un buzz incroyable. Réalisé en 2009 par Google, cet outil est très bien réalisé, complet et dispose d'un énorme support. Je pourrai passer un article entier à vous en parler. Décrivons le rapidement.

Angular.js est un framework Javascript côté client. Il dispose de nombreuses fonctionnalités tel que le Data Binding, les Directives, le Scope Management, la validation des formulaires, les animations, la traduction i18n, le Routing, les filtres et bien d'autres. C'est un des framework les plus complet et cohérent de sa génération.

Enfin, Angular s'intégre parfaitement à MEAN. En effet, lorsque l'utilisateur souhaite charger une nouvelle page, Angular va seulement recharger les éléments qui changent en recevant du JSON depuis le serveur. Cela va donc accélérer le chargement des pages.

Conclusion

Revenons à ce que l'on m'avait dit sur Node.js, ainsi qu'aux questions que l'on ne cesse de me poser.

Pourquoi Node.JS ?

De part sa communauté, sa puissance, sa maturité et son langage.

Node.JS va-t-il dominer le monde du Web ?

Non bien entendu. Mais il a un très bel avenir devant lui c'est certain. Il ne va pas devenir la technologie qui surpasse toutes les autres. Le Web ne sera pas entièrement fait en Node.js. C'est seulement un atout en plus dans le large choix que nous avons déjà. Et je vous conseille sincèrement de l'ajouter à votre panel de connaissances.

Les plus grands vont-ils passer à Node.JS ?

C'est déjà le cas pour certain. On peut dire que Paypal fait parti des sites qui se doivent d'être le plus sécurisé, fiable et robuste au monde et il est passé sous Node.js. Est-ce que tous les grands s'y mettront également ? Non, bien sur. Les autres technologies marchent parfaitement aussi, et une migration peut être très coûteuse. Mais c'est par choix de l'entreprise, et ce n'est pas par non fiabilité de la technologie.

MongoDB est-il mieux que MySQL ?

Chacun ont leur spécificités. La question à poser serait plutôt "Est-il préférable d'utiliser du SQL ou du NoSQL pour ce que je vais réaliser ?". Cependant, MongoDB s'intégre parfaitement avec le reste du stack MEAN.

Recommanderais-tu MEAN ?

On ne m'a pas posé cette question, mais je vous donne tout de même la réponse : OUI. Sur tous les points de vu, je vous dirais n'hésitez pas. Si vous en avez la possibilité (et vous l'avez ;) ), intéressez-vous à ce stack. Il existe d'excellents tutoriaux pour bien débuter et vous ne serez, objectivement et sincèrement, pas déçu.

Pour terminer

J'espère vous avoir donné envie de vous intéresser à MEAN ! J'ai moi-même pris plaisir à rédiger cet article, et j'espère qu'il vous aura plus. N'hésitez pas à me contacter par mail à nicolas.bonzom(a)supinfo.com pour échanger avec moi et m'exposer votre point de vue par exemple ! J'en serais honoré. Je vous souhaite donc un bon apprentissage !

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels