Je travaille depuis quelques jours avec la version Java de Google App Engine. Je bosse sur une idée de projet pour d’une part tester l’app-engine, et d’autre part… me faire plaisir. Comme dit Eric « Bob » Mignot : faut se faire plaisir.
Google App Engine est une plate-forme de Cloud Computing qui permet de déployer facilement une application Web Java. Voici comment cela fonctionne : vous codez votre application Java en local, vous la télechargez ensuite vers le serveur de Google, puis quelques instants plus tard votre application est déployée.
L’intérêt et la force de la solution de Cloud Computing de Google est d’offrir un serveur très puissant, dont la capacité en CPU, en mémoire, en bande passante, s‘ajuste automatiquement à l’usage, aux nombres de visiteurs. La différence avec un serveur classique sous Unix comme celui sur lequel j’héberge le blog, c’est la virtualisation totale du serveur. Chez l’hébergeur du blog le Touilleur Express, j’utilise déjà une solution de virtualisation, qui me permet de rajouter ou de retirer des CPUs ou de la bande passante. Cependant c’est à moi de régler cette capacité. Or au début je n’avais aucunes idées du nombre de processeurs nécessaires… J’ai payé pour rien jusqu’à trouver les bons réglages. Et encore, c’est empirique, il n’y a pas de console m’indiquant le taux d’usage de ma machine.
Avec la solution de Google App Engine, s’offre à vous un portail Web d’administration qui vous affiche l’utilisation de votre application. Par défaut, gae (Google App Engine) est gratuit. Si vous savez écrire une application Web simple en Java, vous pouvez donc vous inscrire et tester en quelques heures.
CanadaDry, CanadaGrails
Bref me voilà il y a quelques temps devant mon éditeur favori, IDEA IntelliJ, avec une idée de développement histoire de me faire la main. Je décide de tester Grails, un framework en Groovy qui permet d’écrire très rapidement une application. Une fois Grails installé, je récupère ensuite le plugin pour Google AppEngine afin de commencer à créer ma première application. Je décide de tester la version JDO, car après avoir vu la doc de DataNucleus, j’ai le sentiment que JPA est encore un peu trop neuf.
Si vous n’avez pas encore testé Grails, prenez 15 minutes pour suivre le Quick-Start puis ensuite lisez attentivement les différentes pages sur le plugin Google App Engine.
J’ai été vraiment emballé de pouvoir faire une application type Crud en quelques minutes. Ensuite je suis quelqu’un de curieux. Alors j’ai garé la voiture « Grails » sur le côté de la route et j’ai commencé à regarder le moteur. Premier besoin : je veux changer une des vues pour afficher un datePicker au lieu d’un champ date. Je teste avec un autre plugin d’interface utilisateur… pas très emballé. Grails vient avec un moteur de plugin qui permet d’ajouter et de retirer des fonctionnalités rapidement. Le souci est qu’il est plus difficile de trouver la raison d’une erreur, et que pour valider vos changements vous déployez beaucoup plus, par peur que ce que vous venez de faire ne marche pas.
Je rencontre ensuite un souci de namespace. Voici la solution que vous devrez aussi faire :
Message d’erreur:
Cannot find the declaration of element ‘datastore-indexes’.
Solution:
Editer le fichier $APP_HOME/target/war/WEB-INF/datastore-indexes.xml et effacer le namespace de la première ligne :
xmlns= »http://appengine.google.com/ns/datastore-indexes/1.0″
Le déploiement vers l’appengine est relativement facile, il faut simplement utiliser l’utilitaire appCfg.sh de GAE la première fois afin de spécifier son mot de passe Google. Par la suite, le plugin de Grails est capable de déployer l’application.
Jusqu’ici tout va bien.
Difficultés rencontrées
J’ai eu du mal avec Groovy et Grails. Malgré le support d’IDEA IntelliJ de Groovy, j’ai pas mal de soucis avec le côté dynamique du langage. Bref je patauge pas mal et dès la première difficulté, je peste.
Un langage dynamique, cela entraîne en fait pas mal de phase de redéploiement pour s’assurer que tout fonctionne. Je trouve un peu poussif les performances, quoique cela soit purement subjectif. Je parle de Grails + plugin Google App Engine.
Ensuite j’ai trouvé que la promesse de l’écriture rapide était bien remplie. Un create entity, un update view, oui Grails est vraiment bien fait, bravo à l’équipe de Grails. Mais la perte de certains repères, du typage fort, représente une difficulté à ne pas négliger.
Spring MVC et SpringFuse
Un peu inquiet de ne pas avancer aussi vite que cela avec Grails, je recrée un nouveau projet Java afin de tester du simple code Java.
C’est ensuite en mettant en place Spring MVC que j’ai l’idée de reprendre un projet généré avec SpringFuse. Et hop, en quelques heures j’ai transformé mon application en projet full-Java, quelques JSPs, deux controllers, un peu de JDO pour Google App Engine, bref j’avance beaucoup plus vite. Paradoxal non ? C’est grâce au code de SpringFuse, à la fois simple et en même temps bien documenté. J’ai viré pas mal de trucs pour le faire passer sur GAE, mais rien de bien difficile. J’attends le support de JPA prévu pour bientôt. Sinon Spring MVC 2.5 marche très bien sur Google App Engine, qu’on se le dise. Je n’ai pas utilisé les annotations, ni les transactions par contre.
Premier bilan
Lorsque l’on bosse seul sur son projet dans son garage, et que l’on vise une application massivement Web, paradoxalement je pense que l’on va plus vite en n’écrivant que ce qui est nécessaire.
Grails vaut vraiment le coup d’être testé. Le plugin GAE n’est pas encore parfait, et il sera plus difficile de trouver de l’aide sur Google en cas de plantage. Soit vous êtes un aventurier, soit vous êtes plutôt conservateur. A vous de voir.
Je ne parle pas sinon des tests pourtant intéressant de GTPL, une idée vraiment intéressante qui permet d’écrire des templates de page en Groovy. Cela mérite un article plus complet.
Suite des aventures dans le prochain numéro.
Nom de code du projet : GeekDay
« Un langage dynamique, cela entraîne en fait pas mal de phase de redéploiement pour s’assurer que tout fonctionne. »
Nicolas, Nicolas, Nicolas… *soupir*. Tous le secret est dans les tests (unitaires, intégrations, fonctionnels) :).