[Devoxx FR 2014] Spring 4 débarque : mise en oeuvre dans une stack Web réactive

double_xx_texte

Considérant deux conférences étroitement liées : « Spring 4 TW » et « Des applications réactives avec Spring 4, AngularDart et Websocket », j’ai trouvé pertinent de rédiger quelques lignes pour vous les faire (re)vivre.

Spring 4 TW (‘Four The Win’ … ou ‘The Web’ ?)

WP_20140417_007

La conférence, par Joshua Long : @starbuxman

http://www.joshlong.com/

Le Framework Spring 4, présent depuis les fêtes de fin d’année, a dans sa hotte quelques nouveautés bien situées dans les tendances actuelles, parmi celles-ci l’aide au développement d’applications réactives en Java. Et pour nous les présenter, Josh Long, évangéliste et fervent commiteur sur Spring Source, est intervenu le 17 avril dernier à Devoxx FR.

De nouvelles annotations pour l’inversion de contrôle

Car pour Spring, les injections sont toujours le nerf de la guerre !

Comme l’on souhaite…

  • @Lazy sur un point d’injection ou un bean annoté permet d’indiquer que l’instanciation ne sera réalisée qu’au tout dernier moment. Donc un apport de flexibilité et en performances.

  • @Ordered sur des beans voués à peupler une collection annotée @Autowired définira l’ordre de priorité lors de leur injection dans cette collection.

… mais pas n’importe comment !

@Conditional régit les pré-requis pour enregistrer un bean, et fournit par rapport à @Profile la possibilité de définir un ensemble de conditions à satisfaire. Par conséquent davantage de flexibilité. Ces conditions sont décrites par programmation, en implémentant l’interface éponyme.

En phase avec Java, bien sûr !

Tout spécialement avec JEE 7, cette API ayant évolué pour JCache, JMS, JPA, JTA … Mais aussi avec Java 8 fraîchement disponible : Spring 4 compile avec la dernière mouture du langage, sans toutefois la rendre obligatoire : les versions 5.0 à 7.0 sont toujours supportées.

Orienté Web réactif, assurément

Support des WebSockets par la Messaging API

Les WebSockets ont été introduites avec HTML5 pour faciliter le “push” d’informations vers le client en réutilisant l’architecture réseau d’HTTP. Spring 4 est compatible avec la librairie cliente JavaScript SockJS. Cette dernière sait faire transiter les messages  via STOMP, protocole de messagerie simplifié. Pour acheminer et traiter de tels messages, un broker par défaut est fourni. A noter qu’il peut tout à fait être remplacé par un plus complet, tel RabbitMQ.

Sur le serveur, des annotations supplémentaires font leur apparition au niveau du code d’un contrôleur :

  • @MessageMapping, qui établit  le lien entre un message et la méthode devant le traiter.

  • @SendToUser qui, positionné sur une méthode, indique la destination du message contenant la valeur de retour de cette méthode.

Mais ceci n’est que la partie immergée de l’iceberg…

Le support WebSockets n’est qu’une facette de la Messaging API, qui a une vocation plus large : celle de mettre en place des architectures orientées message. Dans cette optique une abstraction de messagerie a été mise en place ; une de ses extensions concrètes est d’ailleurs la SimpMessagingTemplate et ses SimpMessageReceiving/SendingOperations, pré-intégrées.

Let’s get it started : Spring Boot

Spring Boot nous a été présenté comme un nouveau framework permettant de bâtir et d’exécuter avec Spring un large panel de solutions, d’applications Web aux applications d’entreprise. Il s’adresse à un public à qui Roo et Grails n’auraient pas paru adaptés.

Le paradigme “Convention Over Configuration” est poussé ici jusqu’à donner la possibilité d’annoter par @EnableAutoConfiguration afin que Spring injecte les beans les plus pertinents. Pour rester dans le domaine “magique”, @RestController met en place un réel contrôleur REST, simplifiant sa mise en place et nécessitant donc d’écrire moins de lignes de code.

En sus, une application tournant avec Spring Boot peut se voir automatiquement affublée d’end-points REST permettant de la monitorer via HTTP : /metrics, /beans, /health … et d’un shell intégré.

Ce sujet ayant fait l’objet d’une mini-conférence ou “quickie” je ne peux que vous conseiller de lire l’article dédié à celle-ci, sur ce même blog.

Mais encore ?

Ce tour d’horizon sur Spring 4 étant bouclé, je nous propose d’enchaîner sur du concret, par une de ses mises en application.

Une stack Web Reactive

Une conférence animée par Sébastien Deleuze : @sdeleuze

Devoxx est logiquement l’occasion de présenter des projets mettant en oeuvre les dernières technologies en date. C’est le cas du projet OpenSnap, réalisé par Sébastien Deleuze, qui fait la part belle à Spring 4 et au langage Dart.

Le projet OpenSnap

Cette application Web HTML5 vise à reproduire le fonctionnement de l’application pour smartphone SnapChat, dont le but est de partager des images via messagerie instantanée, qui sont automatiquement supprimées quelques secondes après visualisation. Initiée et motorisée par Spring Boot, elle est actuellement opérationnelle en beta (navigateur chrome seulement) et peut être accédée via ce lien.

opensnap_1

OpenSnap : on capture, on envoie !

Les paragraphes qui suivent vont détailler la stack technique mise en oeuvre.

Les outils de développement

Build

Le cycle de vie de l’application est confié à Gradle, équipé des plugins Spring-Boot, Java pour traiter la partie back et sa gestion de dépendances. Côté front, Gradle pilote les commandes du SDK Dart : pub (gestionnaire de paquets) et dart2js (générateur de code Javascript à partir de code Dart).

Edition du code source, refactoring et plus encore

On retrouve ici IntelliJ de JetBrains, totalement opérationnel en version communautaire sur ce projet. Le support de Gradle s’effectue en natif, celui du langage Dart peut être ajouté par le biais d’un plugin.

Front

Comme annoncé en préambule, OpenSnap côté client repose sur le langage Dart, poussé par Google. Disponible aujourd’hui en version 1.3, il  vise à pallier les lacunes de JavaScript en termes de performances et de respect du paradigme objet. Une de ses caractéristiques est de pouvoir être exécuté en natif sur un navigateur Web compatible : Dartium et prochainement Chrome ; mais aussi d’être “transpilé” (ou converti) en JavaScript pour adresser tous les autres navigateurs. Concrètement, les fichiers .dart et les .js générés à partir d’eux sont portés simultanément par le serveur.

Parmi les apports de Dart, on peut citer la fonctionnalité native de routing, permettant d’adresser des traitements spécifiques selon l’URL demandée.

dart_routes

Routage : les chemins sont associés à des vues, pages HTML.

Dart est ici accompagné du framework Angular.dart, qui au départ était un portage d’Angular.js mais qui est devenu en quelque sorte sa vitrine, incluant les fonctionnalités en avance de phase. Ce qui est le cas pour les prochaines évolutions du framework en version 2.0 : il y a une forte probabilité pour qu’une partie atterrisse rapidement dans Angular.dart.

Back

La partie back-end repose sur Java 8 et le framework Spring 4 bien sûr pour son support des WebSockets ; Spring Security est quant à lui en version 3.2. Spring Boot, sur lequel l’application a été  générée, fournit pour sa part un serveur Tomcat embarqué, un shell intégré et l’interface de contrôle REST Actuator.

La version de démonstration OpenSnap ne dispose pas de mécanisme de persistance.

Quid du middleware ?

Les images prises par l’appareil photo ou webcam du client sont transférées au serveur, qui va les pousser sous forme de messages vers le destinataire, utilisateur également enregistré sur le système.

La communication entre les deux parties est assurée par échange de messages à travers WebSockets avec la librairie cliente SockJS (le client Dart en l’occurrence). Le traitement et l’acheminement des messages fait intervenir un SimpleBrokerMessageHandler, le broker intégré à Spring 4.

Mes impressions à la sortie

Techniquement, les apports de Spring 4  sans être révolutionnaires, permettent d’envisager plus sereinement l’émergence de nouvelles applications web sur nos terminaux. Ces applications, non plus seulement dynamiques mais réactives, sont multi-plateformes et programmables en une seule fois pour toutes les adresser. Visons l’efficacité et le plaisir de travailler, ne nous gênons surtout pas !

Et plus généralement, l’introduction de nouveautés du front-end au back-end sans oublier dans leurs moyens de communication,  motivent à développer des projets web avec le tandem de langages Dart + Java. Mises bout à bout, elles constituent une stack relativement facile à mettre en place et à utiliser; sans mettre les performances de côté. Pour qu’au final le développeur puisse concentrer son énergie sur les fonctionnalités du projet, sa valeur ajoutée.

Pour aller plus loin :

Nombre de vue : 137

COMMENTAIRES 2 commentaires

  1. Karim dit :

    Bonjour,
    Avez-vous des liens vers des tutos assez complets sur Spring Framework 4 ?

    Je trouve un peu tout et n’importe quoi sur le web, souvent on a juste le code avec aucune explication donc on fini par faire du copié collé, sans comprendre.

    Merci

  2. Bertrand Lehurt dit :

    Bonjour,

    vous trouverez un tuto complet sur Spring 4 sur developpez.com à cette adresse : http://tahe.developpez.com/angularjs-spring4.
    Sur le site de Spring, vous avez un ensemble de guide en anglais : http://spring.io/guides

AJOUTER UN COMMENTAIRE