<?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; Exploitation</title> <atom:link href="http://blog.xebia.fr/category/exploitation/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>Mise en place d&#8217;une organisation DevOps</title><link>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/</link> <comments>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/#comments</comments> <pubDate>Mon, 09 Jan 2012 07:38:41 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[DevOps]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10219</guid> <description><![CDATA[Comme le mouvement Agile a rapproché donneurs d&#8217;ordre et équipes de réalisation autour d&#8217;une vision commune orientée &#171;&#160;produit&#160;&#187;, le mouvement DevOps rapproche aujourd&#8217;hui les équipes de développement (DEV) et d&#8217;exploitation (OPS) autour d&#8217;une vision commune orientée &#171;&#160;service&#160;&#187;, afin de mieux concilier réactivité et qualité de service. DevOps aborde le paradoxe entre des équipes projets qui [...]]]></description> <content:encoded><![CDATA[<p>Comme le mouvement Agile a rapproché donneurs d&#8217;ordre et équipes de réalisation autour d&#8217;une vision commune orientée &laquo;&nbsp;produit&nbsp;&raquo;, le mouvement DevOps rapproche aujourd&#8217;hui les équipes de développement (DEV) et d&#8217;exploitation (OPS) autour d&#8217;une vision commune orientée &laquo;&nbsp;service&nbsp;&raquo;, afin de mieux concilier réactivité et qualité de service.</p><p>DevOps aborde le paradoxe entre des équipes projets qui cherchent à livrer toujours plus fréquemment des nouvelles fonctionnalités d&#8217;une part et d&#8217;autre part des équipes d&#8217;exploitation qui cherchent à stabiliser et fiabiliser les systèmes tout en maitrisant leur coût.</p><p>On peut décrire DevOps selon trois axes :</p><ul><li><b>Aligner l&#8217;exploitation sur les enjeux métiers</b> comme l&#8217;agilité a déjà aligné le développement sur le métier.</li><li><b>Aligner le développement sur les réalités de l&#8217;exploitation</b> pour rendre possible la mise en production, la disponibilité et la fiabilité des fonctionnalités métier.</li><li>La <b>transformation du métier d&#8217;OPS</b> pour gérer des topologies chaque jour plus grosses et plus complexes avec l&#8217;adoption d&#8217;<em><a
href="http://www.agileweboperations.com/the-implications-of-infrastructure-as-code" rel="nofollow">infrastructure as code</a></em> et d&#8217;outils comme <a
href="http://www.opscode.com/chef/" rel="nofollow">Chef</a> ou <a
href="http://puppetlabs.com/puppet/puppet-enterprise/" rel="nofollow">Puppet</a>. <b>Les nouveaux OPS sont des programmeurs !</b> Ils débattent à la machine à café de <a
href="http://shop.oreilly.com/product/0636920020042.do" rel="nofollow">TDD</a>, de <a
href="http://wiki.opscode.com/display/chef/FAQ#FAQ-HowisChefdifferentthanPuppet%3F" rel="nofollow">Ruby vs. DSL</a>, <a
href="http://puppetlabs.com/blog/geppetto-a-puppet-ide/" rel="nofollow">de choix d&#8217;IDE</a>, de Git vs. SVN, &#8230;</li></ul><p>DevOps est souvent associé à la mise en place d&#8217;un processus de <a
href="http://java.dzone.com/articles/8-principles-continuous" rel="nofollow">Continuous Delivery</a> qui, dans la mouvance <em>Lean</em>, vise à déployer les fonctionnalités en production au plus vite et de maximiser les feedbacks. Nous reviendrons dans un autre billet sur les processus de Continuous Delivery.</p><p>La mise en place d&#8217;une culture DevOps touche les humains, les processus et les outils. Nous proposons une démarche englobant ces trois aspects en prenant comme point d&#8217;entrée les processus et, de proche en proche, faire évoluer les humains et les outils.</p><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Lesprocessus"></a>Les processus</h3><p>Tous les processus impliquant la collaboration des équipes de développement et d&#8217;exploitation sont sujets à la mise en place d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo;. Nous  proposons pour la première étape de nous focaliser sur les processus de livraison, de déploiement et de <em>troubleshooting</em>.</p><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processusdelivraison"></a>Processus de livraison</h4><p>Le processus de livraison (aka processus de <em>packaging</em> de la <em>release</em>) est la première interaction entre les équipes de développement et de production. Ses défauts causent l&#8217;allongement des projets et des interruptions de service. A l&#8217;inverse, <b>l&#8217;automatisation du processus de livraison concilie</b> <b><em>&laquo;&nbsp;time to market&nbsp;&raquo;</em> et diminution des risques en déployant plus fréquemment des changements au périmètre limité.</b></p><p>Nous proposons d&#8217;accorder les équipes de développement et d&#8217;exploitation sur les points suivants :</p><ul><li><b>Périmètre du</b> <b><em>package</em></b> pour éviter les transformations et manipulations de mise en production : binaires identiques sur tous les environnements, fichiers de configurations épurées, etc.</li><li><b>Rôles et responsabilités des équipes de développement et d&#8217;exploitation dans le</b> <b><em>packaging</em></b> : binaires pour les développeurs, scripts et paramètres de configuration gouvernés par l&#8217;exploitation, etc.</li><li><b>Définition des outils et techniques de</b> <b><em>packaging</em></b> : tag Subversion/Git, build Maven, <em>repository</em> Maven Nexus, etc.</li><li><b>Alignement des environnements</b> de développement, d&#8217;intégration et de production pour éviter les écarts dev/prod : on doit tester sur un environnement le plus <em>iso-prod</em> possible.</li></ul><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processus%26nbsp%3Bd%C3%A9ploiement%26nbsp%3B"></a>Processus déploiement </h4><p>Une fois le <em>packaging</em> clarifié, nous proposons d&#8217;<b>automatiser et d&#8217;unifier les processus de déploiement du</b> <b><em>dev</em></b> <b>à la</b> <b><em>prod</em></b>. Les bénéfices sont :</p><ul><li><b>L&#8217;accélération des</b> <b><em>feedbacks</em></b> des équipes de Q&amp;A par des déploiements plus fréquents sur les environnements de validation.</li><li><b>La fiabilisation des déploiements</b> en les testant avant la mise en production.</li></ul><p>L&#8217;objectif est la banalisation : <b>les déploiements deviennent des &laquo;&nbsp;non événements&nbsp;&raquo;</b>.</p><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processusdetroubleshootingetdediagnostique"></a>Processus de <em>troubleshooting</em> et de diagnostique</h4><p>Réussir l&#8217;analyse de problèmes en production nécessite une préparation et un entrainement conjoints des équipes d&#8217;exploitation et de développement.</p><p>Des répétitions impliquant à la fois OPS et DEV permettront de valider :</p><ul><li>Que les applications sont <em>debuggables</em> : clarté des messages de log, clarté des exceptions, indicateurs de monitoring (JMX), etc.</li><li>Que les outils de diagnostique sont installés : activation et collecte de logs, accès sans problèmes de firewall, disponibilité des outils sur les serveurs (curl, screen, jstat, jmap, etc.).</li><li>Que les OPS et les DEV ont les bons outils de collaboration lors de problèmes en production : accès en lecture seule pour les DEV, messagerie instantanée, partage d&#8217;écran, micro-casques, etc.</li></ul><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Am%C3%A9liorationcontinuedev%2Fprod"></a>Amélioration continue <em>dev/prod</em></h3><p>Les sujets d&#8217;amélioration continue transverse développement / exploitation sont gérés à la fois dans la continuité avec des réunions &laquo;&nbsp;dev/prod&nbsp;&raquo;, et lors d&#8217;événements particuliers sous forme de points &laquo;&nbsp;<em>post mortem</em>&nbsp;&raquo; (panne, mise en production importante, etc.). Les sujets abordés relèvent d&#8217;enjeux à court, moyen et long terme :</p><ul><li><b>Monitoring &amp; KPI</b> : mise en place d&#8217;indicateurs techniques et métiers de bonne santé des applications (choix des outils, adaptation du code métier, <em>health checks</em>, etc.).</li><li><b>Gestion des logs et des exceptions</b> : amélioration des messages, outils de concentration et d&#8217;analyse de logs.</li><li><b>Robustesse, tenue à la charge et</b> <b><em>capacity planning</em></b> : suppression des points de faiblesse, mise en place de modes dégradés et de mécanismes de protection contre les saturations (e.g. : <em>circuit breaker pattern</em>), plans d&#8217;action de test en charge, plan d&#8217;ajout de capacité.</li><li><b>Sécurité</b> : <em>patchs</em> à appliquer, règles de sécurité de l&#8217;entreprise, etc.</li><li><b>Fiabilisation des mises en production</b> : activation progressive (<em><a
href="http://martinfowler.com/bliki/FeatureToggle.html" rel="nofollow">feature toggle</a></em><em>)</em> ou partielle (<em>canary testing</em>) de fonctionnalités, etc.</li><li><b>Processus et outillage</b> : amélioration des processus dev/prod, alignement et partage des outils.</li><li><b>Suivi du schéma directeur</b> : gestion des montées de version des middlewares, migrations techniques, rationalisation des environnements.</li><li><b>Evolutions de l&#8217;application et de l&#8217;infrastructure</b> : <em>refactoring</em> de l&#8217;infrastructure, introduction de nouvelles technologies, plan de montée en compétence.</li></ul><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-L%27organisation%3AYoubuildit%2Cyourunit%3F"></a>L&#8217;organisation : <em>You build it, you run it</em> ?</h3><p>L&#8217;organisation est le sujet le plus complexe à aborder dans la mise en place d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo;. Certaines entreprises comme Amazon ont intégré les équipes de développement et de production au point d&#8217;avoir pour devise &laquo;&nbsp;You build it, you run it&nbsp;&raquo;.</p><p>Un point essentiel est de s&#8217;assurer que les objectifs des différents acteurs soient alignés vers une amélioration de la disponibilité et de l&#8217;évolutivité des applications. Si les intérêts des uns et des autres sont contradictoires et ne sont pas alignés sur ce même objectif, l&#8217;adoption d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo; touchera vite ses limites.</p><p>Nous proposons d&#8217;étudier les changement organisationnels au fur et à mesure de la mise en place des principes DevOps dans les processus que nous avons cité en veillant à prendre en compte les réalités de chaque entreprise.</p><div
class="shr-publisher-10219"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2012%2F01%2F09%2Fmise-en-place-d-une-organisation-devops%2F' data-shr_title='Mise+en+place+d%27une+organisation+DevOps'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2012%2F01%2F09%2Fmise-en-place-d-une-organisation-devops%2F' data-shr_title='Mise+en+place+d%27une+organisation+DevOps'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <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><div
class="shr-publisher-10030"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F21%2Ftroisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit%2F' data-shr_title='Troisi%C3%A8me+%C3%A9dition+de+notre+atelier+%3A+Continuous+Deployment+sur+Tomcat+avec+Jenkins%2C+Rundeck+et+DeployIt'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F21%2Ftroisieme-edition-de-notre-atelier-continuous-deployment-sur-tomcat-avec-jenkins-rundeck-et-deployit%2F' data-shr_title='Troisi%C3%A8me+%C3%A9dition+de+notre+atelier+%3A+Continuous+Deployment+sur+Tomcat+avec+Jenkins%2C+Rundeck+et+DeployIt'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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><div
class="shr-publisher-9641"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F02%2Fcontinuous-delivery-deploiement-jenkins-remote-ssh-plugin%2F' data-shr_title='Retour+Atelier+Continuous+Delivery+%E2%80%93+Partie+2+-+D%C3%A9ploiement+continu+avec+Jenkins+Remote+SSH+Plugin'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F12%2F02%2Fcontinuous-delivery-deploiement-jenkins-remote-ssh-plugin%2F' data-shr_title='Retour+Atelier+Continuous+Delivery+%E2%80%93+Partie+2+-+D%C3%A9ploiement+continu+avec+Jenkins+Remote+SSH+Plugin'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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><div
class="shr-publisher-9462"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F11%2F25%2Fcontinuous-delivery-deploiement-apache-tomcat-maven-plugin%2F' data-shr_title='Retour+Atelier+Continuous+Delivery+-+Partie+1+-+D%C3%A9ploiement+avec+Apache+Tomcat+Maven+Plugin'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F11%2F25%2Fcontinuous-delivery-deploiement-apache-tomcat-maven-plugin%2F' data-shr_title='Retour+Atelier+Continuous+Delivery+-+Partie+1+-+D%C3%A9ploiement+avec+Apache+Tomcat+Maven+Plugin'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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>Paris DevOps MeetUp chez Xebia le 4 Mai</title><link>http://blog.xebia.fr/2011/05/03/paris-devops-meetup-chez-xebia-le-4-mai/</link> <comments>http://blog.xebia.fr/2011/05/03/paris-devops-meetup-chez-xebia-le-4-mai/#comments</comments> <pubDate>Tue, 03 May 2011 04:59:42 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[DevOps]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7612</guid> <description><![CDATA[Le quatrième Paris DevOps Meetup aura lieu mercredi 4 Mai à partir de 19h00 dans les locaux de Xebia. Au programme : Un retour d’expérience sur un gros projet agile distribué (100 personnes, 10 équipes, 4 pays) orienté culture DevOps, process… et (un peu outils). Monitoring dans un cadre DevOps : infrastructure, services, business, trend monitoring, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/parisdevops.png" alt="DevOps Paris" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Le quatrième <a
href="http://lanyrd.com/2011/paris-devops-meetup-4/" title="Paris DevOps Meetup" >Paris DevOps Meetup</a> aura lieu mercredi 4 Mai à partir de 19h00 dans les locaux de Xebia.</p><p>Au programme :</p><ul><li>Un retour d’expérience sur un gros projet agile distribué (100 personnes, 10 équipes, 4 pays) orienté culture DevOps, process… et (un peu <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> outils).</li><li>Monitoring dans un cadre DevOps : infrastructure, services, business, trend monitoring, alert monitoring, dashboards, wallboards, etc.</li></ul><p>Les inscriptions se font sur lanyrd comme d’habitude : <a
href="http://lanyrd.com/2011/paris-devops-meetup-4/" title="httplanyrdcom2011parisdevopsmeetup4" >http://lanyrd.com/2011/paris-devops-meetup-4/</a></p><p>Notez bien l’adresse :<br
/> <strong>Xebia</strong><br
/> <strong>156 boulevard Haussmann à Paris</strong><br
/> <strong>Immeuble A – 7e étage</strong></p><div
class="shr-publisher-7612"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F03%2Fparis-devops-meetup-chez-xebia-le-4-mai%2F' data-shr_title='Paris+DevOps+MeetUp+chez+Xebia+le+4+Mai'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F05%2F03%2Fparis-devops-meetup-chez-xebia-le-4-mai%2F' data-shr_title='Paris+DevOps+MeetUp+chez+Xebia+le+4+Mai'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/03/paris-devops-meetup-chez-xebia-le-4-mai/feed/</wfw:commentRss> <slash:comments>5</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><div
class="shr-publisher-7555"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F27%2Fseminaire-deployit-karavel-automatise-ses-deploiements-tomcat%2F' data-shr_title='S%C3%A9minaire+Deployit%3A+Karavel+automatise+ses+d%C3%A9ploiements+Tomcat'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F27%2Fseminaire-deployit-karavel-automatise-ses-deploiements-tomcat%2F' data-shr_title='S%C3%A9minaire+Deployit%3A+Karavel+automatise+ses+d%C3%A9ploiements+Tomcat'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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>14 Avril &#8211; Soirée Monitoring Pragmatique d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics</title><link>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/</link> <comments>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/#comments</comments> <pubDate>Mon, 04 Apr 2011 11:48:30 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[AppDynamics]]></category> <category><![CDATA[java]]></category> <category><![CDATA[monitoring]]></category> <category><![CDATA[soirée]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7362</guid> <description><![CDATA[Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une &#171;&#160;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics&#160;&#187; . Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &#171;&#160;vraie vie&#160;&#187; [...]]]></description> <content:encoded><![CDATA[<p>Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une <strong>&laquo;&nbsp;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;<a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a>&nbsp;&raquo; </strong>.</p><p>Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &laquo;&nbsp;<em>vraie vie</em>&nbsp;&raquo; .</p><p>A l&#8217;heure où l&#8217;architecture des applications d&#8217;entreprise devient de plus en plus complexe et distribuée, l&#8217;outillage dans le domaine du monitoring et du troubleshooting est un élément clé du système d&#8217;information. Notre objectif est que <strong>chacun en retire des idées immédiatement applicables et se forge une vision des problématiques que les systèmes de monitoring gèrent aujourd&#8217;hui et traiteront demain</strong>.</p><p>Après avoir consulté des Dev et des Ops des secteurs Telcos, Finance, Retail et Voyage, nous avons établi un programme reprenant des cas de notre vie quotidienne illustrés dans une application transactionnelle de eCommerce &laquo;&nbsp;réaliste&nbsp;&raquo; (1) que nous avons déployée en cluster sur 5 serveurs Amazon EC2., que nous soumettrons à diverses déconvenues courantes.</p><p><u><strong>Programme</strong></u></p><ul><li>15 minutes de <strong>présentation de la nouvelle génération de systèmes de monitoring d&#8217;applications</strong> Java (AppDynamics, dynaTrace, JXInsight)</li><li>60 minutes de démonstration de <strong>cas concrets de monitoring</strong> :<ul><li>Installation et configuration : mise en place du monitoring, auto découverte, déclaration d&#8217;indicateurs applicatifs, ajout de nouveaux serveurs au cluster,</li><li>Mise en place de <strong>tableaux de bord pour les équipes d&#8217;exploitation mais aussi de marketing et de développement</strong>,</li><li><strong>Monitoring durant les situations de crise</strong> : tableaux de bord &laquo;&nbsp;sur mesure&nbsp;&raquo; temporaires pour le management, le marketing et les équipes de troubleshooting,</li><li><strong>Monitoring au service du marketing</strong> : nous simulerons la mise en place de la sécurisation <a
title="3-D Secure" href="http://fr.wikipedia.org/wiki/3-D_Secure">3-D Secure</a> des paiements carte bleue en mode <a
title="AB Testing" href="http://en.wikipedia.org/wiki/A/B_testing">A/B Testing</a>,</li></ul></li><li><strong>La place dans l&#8217;infrastructure</strong> du système de monitoring : synergies et chevauchement avec les serveurs d&#8217;application, les systèmes de gestion de logs, etc</li><li><strong>La vision de Jyoti Bansal</strong> sur les tendances du monitoring d&#8217;application, ce à quoi nous devons nous attendre</li><li><strong>Les internes des systèmes de monitoring</strong> de nouvelles génération :<ul><li>&laquo;&nbsp;java agent embarqué&nbsp;&raquo; versus &laquo;&nbsp;agent autonome&nbsp;&raquo; versus &laquo;&nbsp;sans agent&nbsp;&raquo;,</li><li>les tableaux de bords, comment faciliter leur développement et leur utilisation à l&#8217;heure des <a
title="widgets Open Social" href="http://en.wikipedia.org/wiki/OpenSocial">widgets Open Social</a> ?</li><li>scalabilité des systèmes de monitoring à l&#8217;heure où le nombre de serveurs s&#8217;envole.</li></ul></li><li><strong>Coktail avec Jyoti et son équipe.</strong></li></ul><p>N&#8217;hésitez pas à nous proposer des questions ou des cas d&#8217;utilisation que nous ajouterons à nos préparations (cleclerc@xebia.fr et plopez@xebia.fr).</p><p><strong><u>Bio</u></strong></p><p><strong><a
title="Jyoti Bansal" href="http://www.linkedin.com/in/jyotibansal">Jyoti Bansal</a></strong> est fondateur, CEO et CTO d&#8217;AppDynamics. Il a auparavant été <em>Principal Architect</em> de Wily Introscope.</p><p><strong><a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a></strong> a été fondé en 2008. Cette solution de monitoring est utilisée par des clients de la génération Internet aux infrastructures avant-gardistes comme NetFlix (1700 JVM sur Amazon EC2) mais aussi des clients plus traditionnels comme l&#8217;opérateur télécoms Swisscom, l&#8217;assureur Provinzial Insurance ou l&#8217;agence de voyage <a
title="Pricelinecom" href="http://www.priceline.com/">Priceline.com</a>.</p><p><strong><u>Organisation de la soirée</u></strong></p><p>La soirée se déroulera dans les locaux de Xebia au 156, boulevard Haussmann, 75008 Paris, à partir de 19h00.<br
/> Les inscriptions peuvent se faire :</p><ul><li>Par mail : <a
title="infoxebiatrainingfr" href="mailto:info@xebia-training.fr">info@xebia-training.fr</a></li><li>Par téléphone : 01.53.89.99.93</li></ul><p>(1) Nous avons retenu Spring Travel enrichie par les <a
title="Spring Payment Services" href="http://www.springsource.org/spring-payment">Spring Payment Services</a> et une brique &laquo;&nbsp;Anti Fraude&nbsp;&raquo; pour montrer les appels inter applications java. Le code source est disponible sous licence Apache <a
title="ici" href="http://xebia-france.googlecode.com/svn/training/production-ready-application/trunk/">ici</a> .</p><div
class="shr-publisher-7362"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F04%2F14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics%2F' data-shr_title='14+Avril+-+Soir%C3%A9e+Monitoring+Pragmatique+d%27Applications+Java+avec+le+Fondateur+et+CTO+d%27AppDynamics'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2011%2F04%2F04%2F14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics%2F' data-shr_title='14+Avril+-+Soir%C3%A9e+Monitoring+Pragmatique+d%27Applications+Java+avec+le+Fondateur+et+CTO+d%27AppDynamics'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/feed/</wfw:commentRss> <slash:comments>30</slash:comments> </item> <item><title>Choisir son outil pour automatiser les déploiements</title><link>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/</link> <comments>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/#comments</comments> <pubDate>Wed, 01 Dec 2010 07:43:01 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Automatisation]]></category> <category><![CDATA[build]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[Maven]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=6034</guid> <description><![CDATA[Depuis le traditionnel outil make, introduit en 1977 pour livrer en production un logiciel, plusieurs étapes, de la construction du logiciel au processus de livraison, ont été automatisées. En réalité, être professionnel lorsqu&#8217;on parle de développer des logiciels, c&#8217;est, a minima, savoir automatiser la compilation et les tests en intégration continue. Mais un autre sujet [...]]]></description> <content:encoded><![CDATA[<p>Depuis le traditionnel outil <a
href="http://www.gnu.org/software/make/" title="make" >make</a>, introduit en 1977 pour livrer en production un logiciel, plusieurs étapes, de la construction du logiciel au processus de livraison, ont été automatisées. En réalité, être professionnel lorsqu&#8217;on parle de développer des logiciels, c&#8217;est, a minima, savoir automatiser la compilation et les tests en <a
href="http://martinfowler.com/articles/continuousIntegration.html" title="intégration continue" >intégration continue</a>. Mais un autre sujet progresse aussi dans le domaine de la gestion du <a
href="http://en.wikipedia.org/wiki/Application_Lifecycle_Management" title="cycle de vie des applications" >cycle de vie des applications</a> (Application Lifecycle Management &#8211; ALM), il s&#8217;agit de l&#8217;automatisation des déploiements. Cette progression est en partie due à nos environnements (serveurs d&#8217;application, ESB, EAI, etc.) qui sont de plus en plus complexes et étendus. Le nombre croissant de nouvelles versions d&#8217;une application, demandées par le business moderne, et le fait que le déploiement doit être suffisamment fiable pour ne pas risquer d&#8217;interrompre un service en ligne sont deux raisons supplémentaires qui poussent à s&#8217;intéresser à cette question. Ajoutez à cela que les infrastructures en cloud gagnent un peu plus de terrain chaque jour, et vous conviendrez que l&#8217;on a encore un long chemin, à la fois motivant et intéressant, à parcourir.</p><h3><a
name="Estcequenosoutilsdepackagingac"></a>Est-ce que nos outils de packaging actuels peuvent déployer nos applications?</h3><p>Dans cet article, je souhaite comparer l&#8217;automatisation du déploiement au plus connu des processus automatiques du développement logiciel : le packaging de l&#8217;application. En simplifiant, le processus de packaging part du code source pour le transformer en code exécutable. La façon la plus simple pour créer ce code est d&#8217;utiliser un script shell qui lance le compilateur, mais ce processus a beaucoup mûri. Grâce à des outils comme Make, cité précédemment, mais aussi à <a
href="http://ant.apache.org/" title="Ant" >Ant</a> et <a
href="http://maven.apache.org/" title="Maven" >Maven</a>, l&#8217;utilisateur peut spécifier de manière très détaillée tout le processus. Prenons l&#8217;exemple de Maven, la plupart des projets n&#8217;ont plus besoin de scripter quoique soit. Le fichier <a
href="http://maven.apache.org/pom.html" title="POM" >POM</a> décrit les composants du projet, les plugins utilisés, et la façon de packager l&#8217;application. Et en ce moment même, de nouveaux outils font leur apparition, comme <a
href="http://www.gradle.org/" title="Gradle" >Gradle</a>, qui offre encore un peu plus de flexibilité.</p><p>Mais ces outils nous permettent-ils de faire du déploiement automatique? Dans un <a
href="http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole" title="billet prcdent" >billet précédent</a>, mon collègue <a
href="http://blog.xebia.com/author/rvanloghem/" title="Robert van Loghem">Robert van Loghem</a> a expliqué en quoi le déploiement est un processus complexe qui inclut un certain nombre d&#8217;étapes comme l&#8217;installation des EAR/WAR, la configuration des datasources et le redémarrage des serveurs.<br
/> Bien que Wikipedia inclut la fonction de déploiement vers des systèmes en production, lorsqu&#8217;il définit <a
href="http://en.wikipedia.org/wiki/Build_Automation" title="l'automatisation du packaging" >l&#8217;automatisation du packaging</a>, les outils actuels n&#8217;ont pas intégré ces concepts de <a
href="http://www.infoq.com/articles/dev-op-xebia" title="packages de déploiement" >packages de déploiement</a> (i.e. les livrables), les environnements cibles (test, recette, production, etc.) ou <a
href="http://blog.xebia.com/2010/07/05/customize-this-tailoring-deployment-packages-to-your-target-environments/" title="la modification des valeurs selon lenvironnement" >la modification des valeurs selon l&#8217;environnement</a>. En réalité, ils n&#8217;ont pas de connaissances liées aux middlewares sur lesquels on déploie et ne proposeront certainement jamais des scenarii de déploiement. Au final, ce qu&#8217;offrent ces outils, c&#8217;est le moyen de scripter, bien connu des développeurs, et de stocker ces scripts avec les sources à installer. Cela amène irrémédiablement à de nombreux scripts « maison » pour automatiser les déploiements.</p><p>Mais ce n&#8217;est pas tellement surprenant. Dans Wikipedia, <a
href="http://en.wikipedia.org/wiki/Build_Automation#Requirements_of_a_build_system" title="les prrequis dun systme dautomatisation" >les pré-requis d&#8217;un système d&#8217;automatisation</a> ne mentionnent pas le Déploiement. Un système de déploiement automatique a pour objectif de déployer du code exécutable sur un environnement cible, alors que le système d&#8217;automatisation du packaging ne fait que produire ce code exécutable.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/11/build_automation_to_deployment_automation.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/11/build_automation_to_deployment_automation.png" width="587" height="173" alt="build_automation_to_deployment_automation" title="build_automation_to_deployment_automation" /></a></div><h3><a
name="Lesprrequisncessairespourqueno"></a>Les pré-requis nécessaires pour que notre outil déploie</h3><p>Voici une liste de pré-requis que devrait satisfaire un outil de déploiement automatique :</p><ul><li>Avoir nativement les concepts de base du déploiement : packages, environnements, lien entre les middlewares, etc.</li><li>Support inclus pour les middlewares principaux avec une possibilité de l&#8217;étendre.</li><li>Support inclus pour les scenarii courants de déploiement avec un moyen de les personnaliser.</li><li>Proposer une séparation des rôles : les développeurs livrent le projet, un groupe d&#8217;administrateur définit les environnements et un autre groupe déploie l&#8217;application, etc.</li><li>Supporter une charge croissante d&#8217;environnements avec plusieurs applications et de nombreux utilisateurs.</li><li>Être capable de faire des déploiements multi-plateformes : des environnements complexes peuvent s&#8217;étendre sur de multiples systèmes d&#8217;opération et versions.</li></ul><p>Les outils d&#8217;automatisation de packaging ne répondent pas à ces pré-requis et vouloir les étendre ne fera que complexifier leur utilisation sans pour autant faciliter convenablement les déploiements.<br
/> Cela explique l&#8217;émergence d&#8217;outils de déploiement automatique, qui ont dépassé les anciens outils de scripts « maison ».</p><p>Que l&#8217;on soit bien d&#8217;accord, les outils de déploiement automatique ne remplacent pas les outils d&#8217;automatisation des packages. Mais les deux ont leur place dans le paysage des livraisons d&#8217;applications. Les outils de packaging produisent le code exécutable et les outils de déploiements s&#8217;assurent de rendre ce code disponible pour les utilisateurs finaux !</p><p><em>Dans le prochain article de cette série, nous expliquerons en quoi le déploiement automatique est différent du mécanisme de gestion des livraisons de nouvelles versions.</em></p><hr
/> <em>Traduction libre du billet <a
href="http://blog.xebia.com/2010/10/12/deployment-automation-vs-build-automation/" title=""Deployment automation vs. build automation"" >&laquo;&nbsp;Deployment automation vs. build automation&nbsp;&raquo;</a> publié par <a
href="http://blog.xebia.com/author/vpartington/" title="Vincent Partington" >Vincent Partington</a> sur <a
href="http://blog.xebia.com" title="blogxebiacom" >blog.xebia.com</a>.</em></p><div
class="shr-publisher-6034"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F01%2Fchoisir-son-outil-pour-automatiser-les-deploiements%2F' data-shr_title='Choisir+son+outil+pour+automatiser+les+d%C3%A9ploiements'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F12%2F01%2Fchoisir-son-outil-pour-automatiser-les-deploiements%2F' data-shr_title='Choisir+son+outil+pour+automatiser+les+d%C3%A9ploiements'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/12/01/choisir-son-outil-pour-automatiser-les-deploiements/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Déploiement incrémental ou redéploiement complet</title><link>http://blog.xebia.fr/2010/10/28/deploiement-incremental-ou-redeploiement-complet/</link> <comments>http://blog.xebia.fr/2010/10/28/deploiement-incremental-ou-redeploiement-complet/#comments</comments> <pubDate>Thu, 28 Oct 2010 09:39:00 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[livraison]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5752</guid> <description><![CDATA[Dans un précédent article sur le déploiement, j&#8217;ai présenté l&#8217;ensemble des tâches à mettre en œuvre pour déployer une application Java dans un environnement d&#8217;entreprise. Le scénario décrivait étape après étape la configuration de chaque composant comme les serveurs web, les pare-feux, la base de données et les ressources externes JEE. Le point clé à [...]]]></description> <content:encoded><![CDATA[<p>Dans <a
href="http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole" title="un prcdent article" >un précédent article</a> sur le déploiement, j&#8217;ai présenté l&#8217;ensemble des tâches à mettre en œuvre pour déployer une application Java dans un environnement d&#8217;entreprise. Le scénario décrivait étape après étape la configuration de chaque composant comme les serveurs web, les pare-feux, la base de données et les ressources externes JEE. Le point clé à retenir était que ces différentes configurations de composants avaient autant d&#8217;importance dans un déploiement que l&#8217;installation d&#8217;un fichier EAR ou WAR.</p><p>Mais voilà, comme on l&#8217;avait rapidement suggéré précédemment, il existe un scénario légèrement plus compliqué que celui décrit ci-dessus ; il s&#8217;agit du cas de mise à jour d&#8217;une application vers une nouvelle version. Bien que le déploiement initial d&#8217;une application soit forcément important, un certain nombre de raisons me fait penser que le déploiement d&#8217;une nouvelle version l&#8217;est encore plus.</p><h3><a
name="Livrerunenouvelleversionestplu"></a>Livrer une nouvelle version est plus important que le premier déploiement !</h3><p>Voici quelques raisons qui peuvent vous convaincre de porter plus d&#8217;attention à une nouvelle livraison:</p><ul><li>Les mises à jour sont plus fréquentes qu&#8217;un déploiement initial. ;-)</li><li>Les mises à jour en production ont lieu alors que les utilisateurs sont déjà en train d&#8217;utiliser l&#8217;application ; il est préférable que cette dernière reste accessible pendant le déploiement ou, au pire, que la coupure soit la plus brève possible.</li><li>Si une mise à jour échoue, l&#8217;ancienne version doit toujours être réinstallable.</li><li>Et le fait qu&#8217;une mise à jour soit « routinière », peut tromper la vigilance des différentes personnes, responsables du déploiement. Il faut se méfier de l&#8217;excès de confiance. Lorsqu&#8217;une application est déployée pour la première fois, chacun est très attentif : les développeurs, les administrateurs des différents composants, les architectes, les responsables de projet, les utilisateurs, etc. Donc, quand un problème arrive, il est traité très rapidement. En revanche, si on souhaite déployer la version 2.1.54 un vendredi après-midi, c&#8217;est là que tout peut aller de travers.</li></ul><p>En résumé, la mise à jour d&#8217;une application est complexe, et être concentré permet de diminuer les risques d&#8217;échec.</p><p>A présent, partons du scénario initial lorsque l&#8217;application est déployée. Ce scénario comprenait un fichier EAR, quelques fichiers statiques (images, css, etc.) et des scripts SQL.<br
/> Comment allons-nous mettre à jour cette application pour passer en v1.1 ? Pour simplifier, nous imaginons qu&#8217;il n&#8217;y a pas eu de changements sur le schéma de base de données entre v1.0 et v1.1.<br
/> Deux solutions sont possibles : soit nous mettons à jour juste ce qui est nécessaire, il s&#8217;agit alors d&#8217;un <strong>déploiement incrémental</strong>, soit nous supprimons la totalité de v1.0 et déployons proprement v1.1, et dans ce cas on fait un <strong>redéploiement complet</strong>.</p><h3><a
name="Etapesncessaireschaquescnario"></a>Etapes nécessaires à chaque scénario</h3><p>Si on choisit de simplement mettre à jour, voici les tâches à accomplir :</p><ol><li>Supprimer le contenu statique v1.0 du serveur web.</li><li>Arrêter l&#8217;application v1.0.</li><li>Supprimer l&#8217;application v1.0.</li><li>Déployer l&#8217;application v1.1 à partir du fichier EAR.</li><li>Démarrer l&#8217;application v1.1.</li><li>Copier le contenu statique v1.1 sur le serveur web.</li></ol><p>Et un redéploiement complet ressemble à ceci :</p><ol><li><strong>Arrêter le serveur web</strong>.</li><li>Supprimer le contenu statique v1.0 du serveur web.</li><li><strong>Supprimer la configuration v1.0 du serveur web</strong>.</li><li><strong>Arrêter le serveur d&#8217;applications</strong>.</li><li>Supprimer l&#8217;application v1.0.</li><li><strong>Supprimer la configuration du serveur d&#8217;applications nécessaire à v1.0 (source de données, queues, etc.)</strong>.</li><li><strong>Créer la configuration du serveur d&#8217;applications pour v1.1</strong>.</li><li>Déployer l&#8217;application v1.1 à partir du fichier EAR.</li><li><strong>Démarrer le serveur d&#8217;applications</strong>.</li><li><strong>Créer la configuration v1.1 du serveur web</strong>.</li><li>Copier le contenu statique v1.1 sur le serveur web.</li><li><strong>Démarrer le serveur web</strong>.</li></ol><p>Si on compare les deux scénarii, on note aisément le nombre de différences :</p><ul><li>Le serveur web est arrêté au début et démarré seulement à la toute fin (étape 1 et 12).</li><li>La configuration du serveur web est supprimée avant d&#8217;être recréée (étape 3 et 10).</li><li>Au lieu de simplement arrêter puis démarrer l&#8217;application, le serveur d&#8217;applications complet est arrêté et démarré (étape 4 et 9).</li><li>La configuration du serveur d&#8217;applications est elle aussi supprimée puis recréée (étape 6 et 7).</li></ul><p>En supprimant puis recréant la configuration du serveur web et du serveur d&#8217;applications, nous avons la certitude de connaitre exactement le résultat qu&#8217;on obtiendra. En effet, si des changements ont eu lieu dans la configuration qui n&#8217;ont pas été notés, ils seront supprimés et non recréés. Pour ce faire, il faut arrêter les serveurs avant de les redémarrer à la toute fin du déploiement. Par contre, cela rend l&#8217;application indisponible, mais vous savez de toutes façons qu&#8217;il faudra <em>bientôt</em> mettre en place un cluster pour avoir une haute disponibilité, n&#8217;est-ce pas ? ;-)</p><p>L&#8217;autre point intéressant de ce scénario se trouve entre les étapes 7 et 12. Vous aurez certainement noté qu&#8217;elles correspondent exactement au scénario du déploiement initial de votre application. La petite différence se situe au niveau des étapes de création du schéma de la base de données. On peut enfin noter que les étapes 1 à 6 permettent de désinstaller complètement l&#8217;application.</p><p>Résumons maintenant les avantages et inconvénients des deux scénarii.</p><h3><a
name="Dupouretducontre"></a>Du pour et du contre</h3><p>Dans le cas du <strong>déploiement incrémental</strong>, on peut retenir les points suivants :</p><ul><li><em
style="color:green;">Pour</em> : Le déploiement incrémental s&#8217;exécute très vite car il fait le strict minimum.</li><li><em
style="color:red;">Contre</em> : Le déploiement incrémental laisse éventuellement des traces de modifications manuelles. Ce point est problématique car la configuration a pu être changée de manière « magique » et sûrement non documentée pour que l&#8217;application fonctionne. Si vous décidez de migrer sur un autre serveur, vous oublierez probablement ces petites retouches. Et par-dessus tout, nous pouvons imaginer que si cela a été fait sur un des serveurs, et bien &#8230; je vous laisse compléter la phrase. :-)</li><li><em
style="color:green;">Pour</em> : Le déploiement incrémental ne touche pas aux systèmes qui sont <em>normalement</em> OK. Mais encore une fois, si vous craignez de toucher votre système parce que ça pourrait ne plus fonctionner du tout, vous avez du travail. Il faut avoir suffisamment confiance dans les composants de votre environnement pour ne pas avoir peur de faire un changement, de redémarrer le serveur et enfin de prier pour que ça re-fonctionne correctement.</li><li><em
style="color:red;">Contre</em> : Il est plus difficile de faire un retour arrière avec un déploiement incrémental. Pour chaque déploiement incrémental, il est nécessaire de décrire le scénario de retour arrière. En effet, comme le précédent déploiement était aussi incrémental, on ne peut donc pas le relancer. Sans scénario de retour arrière, la seule façon de revenir à v1.3 est de faire un déploiement &laquo;&nbsp;propre&nbsp;&raquo; de v1.0 est de déployer successivement v1.1, v1.2 et enfin v1.3.</li></ul><p>A présent, voyons un peu ce que le <strong>redéploiement complet</strong> apporte comme solutions mais aussi comme difficultés :</p><ul><li><em
style="color:green;">Pour</em> : Le redéploiement complet efface toutes modifications manuelles, ne laissant que la configuration « bien » documentée en place.</li><li><em
style="color:green;">Pour</em> : Le redéploiement complet est reproductible et prévisible. Grâce aux procédures qui sont systématiquement les mêmes, il n&#8217;y a aucune importance à connaitre ni la partie du produit qui a changé, ni l&#8217;état actuel de l&#8217;environnement cible. Ca sera toujours le même résultat.</li><li><em
style="color:green;">Pour</em> : Le redéploiement complet permet d&#8217;avoir une stratégie de retour arrière extrêmement simple. Quand le déploiement d&#8217;une nouvelle version échoue, ou que la nouvelle application ne fonctionne pas, il suffit de déployer la version précédente.</li><li><em
style="color:red;">Contre</em> : Conserver l&#8217;application disponible pendant le déroulement d&#8217;un redéploiement complet est une affaire plus délicate que pour un déploiement incrémental. Pour avoir une application en haute disponibilité, il est indispensable de configurer un cluster.</li><li><em
style="color:red;">Contre</em> : Un redéploiement complet peut s&#8217;exécuter lentement si l&#8217;environnement cible n&#8217;est pas assez rapide, car le nombre d&#8217;opérations de configuration est important.</li></ul><h3><a
name="Dploiementincrmentalplussrquel"></a>Déploiement incrémental, plus sûr que le redéploiement complet ?</h3><p>Pour ma part, même si le redéploiement complet est parfois plus difficile et plus long à mettre en œuvre, le fait qu&#8217;il soit prévisible et reproductible est un avantage décisif qui fait passer les inconvénients au second plan. Le déploiement incrémental peut sembler être une approche plus simple et plus rapide pour déployer des mises à jour, mais vous sacrifiez ce qui est essentiel pour un scénario de déploiement, le processus de retour arrière. L&#8217;unique cas où le déploiement incrémental est indispensable, c&#8217;est lorsqu&#8217;on met à jour une base de données. Dans tous les autres, il est recommandé d&#8217;utiliser le redéploiement complet pour appliquer des changements.</p><p><em>Traduction libre du billet <a
href="http://blog.xebia.com/2009/08/05/incremental-deployments-vs-full-redeployments/" title="Incremental deployments vs full redeployments" >&laquo;&nbsp;Incremental deployments vs. full redeployments&nbsp;&raquo;</a> publié par <a
href="http://blog.xebia.com/author/vpartington/">Vincent Partington</a> sur <a
href="http://blog.xebia.com">blog.xebia.com</a>.</em></p><div
class="shr-publisher-5752"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F10%2F28%2Fdeploiement-incremental-ou-redeploiement-complet%2F' data-shr_title='D%C3%A9ploiement+incr%C3%A9mental+ou+red%C3%A9ploiement+complet'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F10%2F28%2Fdeploiement-incremental-ou-redeploiement-complet%2F' data-shr_title='D%C3%A9ploiement+incr%C3%A9mental+ou+red%C3%A9ploiement+complet'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/10/28/deploiement-incremental-ou-redeploiement-complet/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Java en Production &#8211; L&#8217;audit</title><link>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/</link> <comments>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/#comments</comments> <pubDate>Wed, 25 Aug 2010 11:40:04 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[aspect]]></category> <category><![CDATA[audit]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5252</guid> <description><![CDATA[Après avoir abordé la gestion des fichiers de logs, nous continuons aujourd&#8217;hui la série &#171;&#160;Applications Java prêtes pour la Production&#160;&#187; avec l&#8217;audit. Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application. Pourquoi auditer ? Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples [...]]]></description> <content:encoded><![CDATA[<p>Après avoir abordé la gestion des <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="fichiers de logs" >fichiers de logs</a>, nous continuons aujourd&#8217;hui la série &laquo;&nbsp;Applications Java prêtes pour la Production&nbsp;&raquo; avec l&#8217;audit.</p><p>Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application.</p><h3><a
name="Pourquoiauditer"></a>Pourquoi auditer ?</h3><p>Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples suffiront à nous en convaincre :</p><ul><li>Un site web de partage de photos doit pouvoir dire qui a uploadé quelle image, depuis quelle adresse IP et à quelle date.</li><li>L&#8217;application d&#8217;administration d&#8217;un site de e-commerce doit tracer toutes les modifications de prix pour empêcher un <em>employé astucieux</em> de baisser à 1 euro le prix de son téléphone préféré le temps de passer commande.</li></ul><p>Pour revenir à des explications plus théoriques, les logs d&#8217;audit nous apportent :</p><ul><li>les informations nécessaires à la justice en cas d&#8217;infraction,</li><li>la détection d&#8217;intrusions,</li><li>la reconstitution des événements en complément des logs d&#8217;exceptions pour aider au diagnostique de problèmes.</li></ul><p>Nous nous placerons dans le cas le plus fréquent où nous ne développons pas d&#8217;outil pour consulter ces informations d&#8217;audit et où un accès direct au média de stockage (<code>grep</code> sur fichier texte, sql sur base de données, etc) suffit.</p><h3><a
name="Quefautilauditer"></a>Que faut-il auditer ?</h3><p>Dans un monde idéal, le contenu des messages serait défini avec les équipes de sécurité. En pratique, nous sommes assez seuls pour les choisir et il ne faut pas dramatiser. Si l&#8217;on ne prend pas le sujet à la légère, après quelques itérations, notre bon sens est le plus souvent suffisant.</p><p>Les éléments clefs à tracer sont :</p><ul><li>L&#8217;heure exacte : il est essentiel que les serveurs soient à l&#8217;heure pour corréler les logs des différentes briques du système d&#8217;information. Le sujet est aujourd&#8217;hui censé être banal pour les équipes système (c.f. <a
href="http://en.wikipedia.org/wiki/Network_Time_Protocol" title="NTP" >NTP</a>) et nous pouvons demander le soutien des équipes sécurité pour obtenir gain de cause.</li><li>L&#8217;action réalisée : il s&#8217;agit souvent du nom de la méthode métier appelée.</li><li>L&#8217;identifiant et/ou la valeur des données métier sensibles manipulées : souvent les <code>id</code> ou le <code>toString()</code> des paramètres d&#8217;appel.</li><li>L&#8217;auteur de la manipulation : nom de l&#8217;utilisateur connecté et son adresse ip (pour plus de détails sur l&#8217;adresse ip : <a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="XForwardedFilter" >XForwardedFilter</a> et <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>).</li><li>La description succincte des exceptions levées pour analyser les éventuelles attaques.</li></ul><h3><a
name="Pourquoileslogsdaccsdesserveur"></a>Pourquoi les logs d&#8217;accès des serveurs http ne suffisent pas ?</h3><p>La première idée serait de se contenter des logs d&#8217;accès des serveurs web et des firewalls pour auditer les accès à nos applications ; nous n&#8217;aurions alors plus rien à faire.</p><p>Hélas, cela n&#8217;est pas suffisant car il manque dans les logs http des informations clefs :</p><ul><li>Nous n&#8217;avons pas l&#8217;identité de l&#8217;appelant : on a bien l&#8217;adresse ip mais pas le login de l&#8217;utilisateur authentifié.</li><li>Nous n&#8217;avons pas les id passés en paramètre des opérations à auditer (sauf si on fait du REST) ; en SOAP, nous n&#8217;avons même pas le nom de l&#8217;opération !</li><li>Nous n&#8217;avons pas le détail des exceptions levées par l&#8217;application.</li></ul><h3><a
name="APIFrameworkdelogvsframeworkdd"></a>API : Framework de log vs. framework dédié</h3><p>Dans un monde idéal, le framework d&#8217;audit ne devrait pas dépendre de la configuration des logs pour ne pas risquer qu&#8217;une mauvaise manipulation de ces configurations de logs ne le désactive.</p><p>En pratique, les frameworks de logs sont les briques les plus performantes et les plus matures pour traiter les besoins d&#8217;écriture d&#8217;audit et la probabilité de désactiver l&#8217;audit en faisant une mauvaise manipulation sur la configuration des logs est négligeable. Ces raisons nous amènent à utiliser <a
href="http://www.slf4j.org/" title="SLF4J" >SLF4J</a> avec <a
href="http://logback.qos.ch/" title="logback" >logback</a> ou <a
href="http://logging.apache.org/log4j/1.2/" title="log4j" >log4j</a> pour gérer l&#8217;audit.</p><p>Nous encapsulerons tout de même le logger avec une couche légère <em>packagée</em> dans la librairie <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="Xebia Spring Security Extras" >Xebia Spring Security Extras</a> qui ajoutera au message l&#8217;identité de l&#8217;internaute et son adresse IP (via <a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a>). Cette librairie offre une gestion déclarative de l&#8217;audit avec une annotation <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/Audited.java">@Audited</a></code>, son aspect associé <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/AuditAspect.java">AuditAspect</a></code> et une classe utilitaire <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java">Auditor</a></code>. Nous ne rentrerons pas dans le débat annotations vs. code ; dans la majeure partie des projets, nous avons pu traiter la plupart de l&#8217;audit avec une annotation et seuls quelques cas ont nécessité de passer par du code.</p><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: java; title: ; notranslate">
@Audited(message = &quot;transferMoney(#{args[0].accountNumber}, #{args[1].accountNumber}, #{args[3]})&quot;)
public void transferMoney(Account from, Account to, Amount amount) throws BusinessException { ... }
</pre><p>L&#8217;attribut <code>message</code> est un pattern supportant <a
href="http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07.html" title="Spring Expression Language" >Spring Expression Language</a> définissant l&#8217;entrée insérée dans le fichier d&#8217;audit ; la date, le nom de l&#8217;utilisateur, l&#8217;adresse ip et l&#8217;exception s&#8217;il y en a une sont ajoutés au message.</p><p><strong>Fragment de configuration Spring Framework pour utiliser l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;beans ...
   xmlns:security-extras=&quot;http://www.xebia.fr/schema/xebia-spring-security-extras&quot;
   xsi:schemaLocation=&quot;...
        http://www.xebia.fr/schema/xebia-spring-security-extras http://www.xebia.fr/schema/security/xebia-spring-security-extras.xsd&quot;&gt;
   &lt;!-- enable Spring AOP --&gt;
   &lt;aop:aspectj-autoproxy/&gt;
  &lt;!-- activate the AutitAspect --&gt;
  &lt;security-extras:audit-aspect /&gt;
   ...
&lt;/beans&gt;
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... transferMoney(000652584515, 0000684651684, 187.53) by bdupont coming from 192.168.0.14
... transferMoney(000652584515, 0000684651684, 666666.00) threw '...BusinessException: debit amount greater than account balance'
   by bdupont coming from 192.168.0.14
</pre><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;utilitaire <a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java" title="Auditor" ><code>Auditor</code></a> :</strong></p><pre class="brush: java; title: ; notranslate">
public void transferMoney(...) throws BusinessException {
   ...
   Auditor.audit(&quot;Tranfer '&quot; + amount + &quot;' from &quot; + fromAccount + &quot; to &quot; + toAccount);
}
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... Transfer '187.53 euros' from Account[000652584515] to Account[0000684651684] by bdupont coming from 192.168.0.14
</pre><p>L&#8217;entrée d&#8217;audit est ajoutée dans un fichier d&#8217;audit géré par le logger spécifique <code>"fr.xebia.audit"</code> (<a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="voir cet article" >voir cet article</a> pour la configuration du logger).</p><p>Tous les détails sur l&#8217;annotation <code>@Audited</code> sont sur <a
href="https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation">@Audited Annotation</a>.</p><h4><a
name="Intgrationduframeworkdansuneap"></a>Intégration du framework dans une application</h4><p>Ce framework peut être intégré de différentes façons dans une application :</p><ul><li>Intégration Maven :<pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
   &lt;dependencies&gt;
      &lt;dependency&gt;
         &lt;groupId&gt;fr.xebia.springframework&lt;/groupId&gt;
         &lt;artifactId&gt;xebia-spring-security-extras&lt;/artifactId&gt;
         &lt;version&gt;1.1.6&lt;/version&gt;
      &lt;/dependency&gt;
      ...
   &lt;/dependencies&gt;
   ...
&lt;/project&gt;
</pre><p>Cet artifact est déployé sur le <a
href="http://repo1.maven.org/maven2/">Maven Central Repository</a>.</li><li>Téléchargement du jar <a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6.jar" title="xebia-spring-security-extras-1.1.6.jar" >xebia-spring-security-extras-1.1.6.jar</a> (<a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6-sources.jar" title="sources" >sources</a>).</li><li>En récupérant le code source disponible sous licence Open Source <a
href="http://www.apache.org/licenses/LICENSE-2.0" title="Apache Software Licence 2" >Apache Software Licence 2</a> dans le repository GitHub <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="GitHub xebia-france xebia-spring-security-extras" >https://github.com/xebia-france/xebia-spring-security-extras</a>.</li></ul><h3><a
name="Stockagefichiertextevsbasededo"></a>Stockage : fichier texte vs. base de données</h3><p>Le stockage des entrées d&#8217;audit en base de données permet sûrement une recherche plus fine des données que sur des fichiers mais cela ajoute de la complexité (déploiement, exploitation, backup) ainsi que des risques de pannes et impacte les performances. Les approches JMS présentent des contraintes similaires et l&#8217;utilisation de systèmes de logs distants comme <a
href="http://en.wikipedia.org/wiki/Rsyslog" title="rsyslog" >rsyslog</a> présentent un défi de fiabilité. Ces difficultés sont accentuées lorsqu&#8217;une application génère de gros volumes de logs (plusieurs Go/jour).</p><p><strong>Pour ces raisons, nous préférons stocker les messages d&#8217;audit dans un simple fichier.</strong> Les risques de saturation du système de fichiers sont <em>assez facilement</em> gérables par les équipes d&#8217;exploitation, les procédures d&#8217;archivage et de consultation très simples (<code>gzip</code>, <code>scp</code>, <code>grep</code>, etc) et il n&#8217;y a quasiment jamais de problème de performance, même avec des fichiers de quelques Go par jour.</p><p>Y-a-t-il un plus grand risque de perdre les données par de mauvaises manipulations ? Si une application est critique, les exploitants doivent déjà ne pas perdre les fichiers de log du système d&#8217;exploitation, des serveurs web et autres firewalls.</p><p>Pour la gestion des messages d&#8217;audit sous forme de fichier texte, nous aimons logback comme nous l&#8217;avons expliqué dans <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="Java en Production  Les fichiers de logs" >Java en Production &#8211; Les fichiers de logs</a> mais il est aussi possible d&#8217;utiliser Log4j.</p><p>Exemple de configuration Logback pour gérer les messages d&#8217;audit émis sur le logger <code>fr.xebia.audit</code> :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day --&gt;
      &lt;fileNamePattern&gt;/my-application-audit.%d{yyyyMMdd-HHmm}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;
      &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;
&lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
   &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
&lt;/logger&gt;
</pre><p>Exemple équivalent avec log4j (le <code>EnhancedPatternLayout</code> requiert log4j 1.2.16) :</p><pre class="brush: java; title: ; notranslate">
log4j.appender.auditfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.auditfile.datePattern='-'yyyyMMdd
log4j.appender.auditfile.file=${catalina.base}/logs/my-application-audit.log
log4j.appender.auditfile.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.auditfile.layout.conversionPattern=%m %throwable{short}n
log4j.logger.fr.xebia.audit=INFO, auditfile
</pre><h3><a
name="Quefairedeslogsdauditaprslesav"></a>Que faire des logs d&#8217;audit après les avoir générées ?</h3><p>Nous ne rentrerons pas plus dans les détails de la gestion des logs d&#8217;audit après leur génération par nos applications.</p><p>Ce sujet complexe présente aussi bien des aspects juridiques que de confidentialité ou encore de fiabilité. Schématiquement, on n&#8217;a pas le droit de garder indéfiniment des données personnelles, il faut restreindre leur consultation et empêcher leur modification et leur destruction par accident comme par malveillance.</p><p>Des professionnels de l&#8217;exploitation et de la sécurité sont beaucoup plus compétents que nous sur ce sujet <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><h3><a
name="Pourallerplusloin"></a>Pour aller plus loin</h3><p>Si le traitement de l&#8217;audit dans les applications vous a intéressé, nous avons aimé lire :</p><ul><li><a
href="http://itmanagement.earthweb.com/columns/article.php/3578916/The-Importance-of-Audit-Logs.htm" title="The Importance of Audit Logs" >The Importance of Audit Logs</a> par George Spafford,</li><li><a
href="http://www.slideshare.net/anton_chuvakin/nist-80092-log-management-guide-in-the-real-world" title="NIST 800-92 Log Management Guide in the Real World" >NIST 800-92 Log Management Guide in the Real World</a> et <a
href="http://www.slideshare.net/anton_chuvakin/presentations" title="lensemble des prsentations" >l&#8217;ensemble des présentations</a> de Anton Chukavin.</li></ul><h3><a
name="Synthse"></a>Synthèse</h3><p>Nous avons vu aujourd&#8217;hui une façon simple de gérer l&#8217;audit d&#8217;applications java en reposant sur le framework de log de l&#8217;application (Logback voire Log4j) pour écrire les messages dans de simples fichiers texte avec une surcouche très légère composée d&#8217;une annotation <code>@Audited</code> et d&#8217;un utilitaire <code>Auditor</code>.</p><p><strong>Historique</strong><br
/> 25/11/2010 : passage à la version 1.1.5 de la librarie xebia-spring-security-extras avec utilisation du namespace de configuration.<br
/> 20/12/2011 : xebia-spring-security-extras : passage à la version 1.1.6 et aux URLs GitHub</p><div
class="shr-publisher-5252"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F08%2F25%2Fjava-en-production-laudit%2F' data-shr_title='Java+en+Production+-+L%27audit'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F08%2F25%2Fjava-en-production-laudit%2F' data-shr_title='Java+en+Production+-+L%27audit'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/feed/</wfw:commentRss> <slash:comments>16</slash:comments> </item> <item><title>Java en Production &#8211; Les fichiers de logs</title><link>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/</link> <comments>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/#comments</comments> <pubDate>Wed, 07 Jul 2010 13:06:35 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[log4j]]></category> <category><![CDATA[logback]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5013</guid> <description><![CDATA[Tout a déjà été dit sur les logs. Pour preuve, ce n&#8217;est plus un sujet chaud, les équipes d&#8217;exploitation sont très contentes avec les logs de nos applications . D&#8217;accord, l&#8217;envers du décor est moins reluisant et il reste une marge de progression. Nous avions proposé dans Les 10 commandements des logs applicatives des suggestions [...]]]></description> <content:encoded><![CDATA[<p>Tout a déjà été dit sur les logs. Pour preuve, ce n&#8217;est plus un sujet chaud, les équipes d&#8217;exploitation sont très contentes avec les logs de nos applications <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>D&#8217;accord, l&#8217;envers du décor est moins reluisant et il reste une marge de progression. Nous avions proposé dans <a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/" title="Les 10 commandements des logs applicatives" >Les 10 commandements des logs applicatives</a> des suggestions focalisées sur le contenu des fichiers de logs ; voici aujourd&#8217;hui des propositions pour gérer les fichiers eux-mêmes. Même si le sujet peut sembler trivial, ces bonnes pratiques peuvent grandement simplifier le quotidien des équipes de production et améliorer les relations tumultueuses entre exploitants et développeurs.</p><p>Au risque de surprendre certains, les exemples de ce billet utilisent <a
href="http://logback.qos.ch/" title="Logback" >Logback</a> plutôt que le standard de-facto <a
href="http://logging.apache.org/log4j/" title="Log4j" >Log4j</a> car certaines bonnes pratiques que je proposerai sont impossibles à mettre en oeuvre avec Log4j. Aujourd&#8217;hui, je préfère utiliser Logback à Log4j pour gérer les logs de mes applications &#8230; même si je suis nostalgique du format &#8216;.properties&#8217; pour la configuration de ces dernières <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>Bien que Logback ne soit pas le sujet de ce billet, j&#8217;ai ajouté à l&#8217;article initial un paragraphe &laquo;&nbsp;Pourquoi je préfère Logback à Log4j&nbsp;&raquo; pour expliquer ce choix.</p><h3><a
name="Diffrentsfichiersdelogspourdif"></a>Différents fichiers de logs pour différents besoins</h3><p>On utilise souvent un seul fichier <code>mon-application.log</code> pour écrire toutes les logs : les informations d&#8217;audit, les logs d&#8217;exception avec des stack traces sans fins aussi bien que les informations de diagnostique/troubleshooting. Ce fichier se remplit de centaines de lignes par minute, et c&#8217;est alors la déception pour tous ses utilisateurs :</p><ul><li>l&#8217;exploitant est incapable de dire si une application a un problème en regardant les logs sans un astucieux système de &#8216;<code>grep</code>&#8216; et d&#8217;expressions régulières,</li><li>l&#8217;administrateur système et les responsables de la collecte des logs sont incapables de dimensionner les disques pour des logs dont la taille explose au moindre grain de sable à coup de stack traces dont il est pourtant inutile de conserver le détail,</li><li>les équipes de diagnostique/troubleshooting sont noyées dans la masse des informations lorsqu&#8217;elles doivent intervenir.</li></ul><p>Au final, c&#8217;est l&#8217;échec de la transmission de l&#8217;application du développement à la production et les exploitants prennent les développeurs pour des inconscients. Je ne saurais leur donner tort sur ce problème et voici ma proposition de découpage des fichiers de logs.</p><h4>Les logs applicatives</h4><p>Ce fichier ne trace que les dysfonctionnements, il n&#8217;est pas censé se remplir quand l&#8217;application fonctionne normalement et est archivé pendant plusieurs années par l&#8217;exploitant.</p><p>Ses caractéristiques sont :</p><ul><li>seuls les messages de dysfonctionnement (ie >= WARN) y apparaissent,</li><li>ce fichier tourne (&#8216;est rotationné&#8217; en franglais) chaque jour pour être archivé,</li><li>les stack traces seront compactes pour éviter de saturer le système de fichiers. Compacter à deux lignes par cause d&#8217;une exception est un bon compromis entre le niveau de détail utile au diagnostic et la taille occupée sur disque.</li></ul><p>Remarques :</p><ul><li>que faire si l&#8217;exploitant utilise l&#8217;augmentation de la taille du fichier de logs comme indicateur de disponibilité de l&#8217;application ? Cette technique de monitoring me semble très discutable sur le fond et je proposerai dans un autre billet d&#8217;utiliser des compteurs JMX pour ce besoin. Cependant, si votre exploitant tient absolument à suivre l&#8217;augmentation de la taille d&#8217;un fichier de logs, je vous propose de l&#8217;orienter vers le fichier d&#8217;audit décrit plus bas.</li><li>ajouter le nom de l&#8217;instance dans le préfixe de chaque message de logs ? Cette technique est parfois utilisée pour agréger les logs provenant de plusieurs serveurs. Cependant, je préfère que le script de collecte reporte le nom d&#8217;instance dans le nom des fichiers collectés. Cela consomme moins de disque et, de toutes façons, la fusion de fichiers de logs en conservant la chronologie est très délicate car toutes les lignes de nos fichiers ne sont pas préfixées (stack traces, sauts de ligne dans les message, etc).</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un fichier de logs filtré à <code>WARN</code>, à rotation quotidienne et dont les stack traces sont compactées à 2 lignes par cause d&#8217;une exception :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;my-application.log&lt;/file&gt;
   &lt;filter class=&quot;ch.qos.logback.classic.filter.ThresholdFilter&quot;&gt;
      &lt;!-- only log problems, not debugging info --&gt;
      &lt;level&gt;WARN&lt;/level&gt;
   &lt;/filter&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day for log collection and archiving --&gt;
      &lt;fileNamePattern&gt;my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- only log 2 lines of stack trace per cause of an exception --&gt;
      &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m %throwable{2}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
</pre><h4>Les logs de diagnostic/troubleshooting</h4><p>Ce fichier est destiné aux équipes de diagnostic/troubleshooting qui peuvent ajouter ou retirer des informations de debug selon leurs besoins. Ces logs ne sont pas archivées et doivent être très détaillées sans pour autant saturer le système de fichiers.</p><p>Ses caractéristiques sont :</p><ul><li>aucun filtrage sur le niveau de log (TRACE, &#8230;),</li><li>reconfiguration à chaud du framework de log pour ajouter/supprimer des informations selon les besoins,</li><li>rotation avec écrasement des fichiers pour éviter de saturer le système de fichiers.</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un rechargement de la configuration toutes les 30 secondes et un fichier de logs de troubleshooting</p><pre class="brush: xml; title: ; notranslate">
&lt;configuration scan=&quot;true&quot; scanPeriod=&quot;30 seconds&quot;&gt;
  ...
   &lt;appender name=&quot;troubleshooting-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;my-application-troubleshooting.log&lt;/file&gt;
      &lt;!-- 10x10Mo files to limit size on disk --&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;my-application-troubleshooting.%i.log&lt;/fileNamePattern&gt;
         &lt;maxIndex&gt;10&lt;/maxIndex&gt;
      &lt;/rollingPolicy&gt;
      &lt;triggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;&gt;
         &lt;maxFileSize&gt;10MB&lt;/maxFileSize&gt;
      &lt;/triggeringPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
&lt;/configuration&gt;
</pre><h4>Logs d&#8217;audit</h4><p>Ce fichier est destiné à l&#8217;audit de sécurité, on y trace &laquo;&nbsp;qui a fait quoi à quelle heure&nbsp;&raquo;, il grossit donc en permanence et peut dépasser le Go chaque jour.</p><p>Ses caractéristiques sont :</p><ul><li>seuls les messages d&#8217;audit y apparaissent,</li><li>ce fichier tourne chaque jour pour être archivé.</li></ul><p>Remarques :</p><ul><li>Certains estiment que le framework de logs n&#8217;a pas vocation à gérer les informations d&#8217;audit. Bien que je comprenne la théorie, je trouve en pratique bien plus simple de gérer simultanément les deux pour les raisons suivantes:</li><ul><li>l&#8217;audit doit tracer toutes les erreurs pour permettre d&#8217;analyser les problèmes de sécurité, il faudrait donc tracer les exceptions à la fois dans les logs et dans l&#8217;audit,</li><li>les frameworks de logging sont très efficaces pour gérer l&#8217;écriture de gros volumes de messages sur disque,</li><li>bien qu&#8217;il existe théoriquement un risque qu&#8217;une équipe de diagnostic fasse une erreur de configuration et désactive l&#8217;audit, je n&#8217;ai jamais entendu parler de ce genre de bourde.</li></ul><li>Faut-il augmenter la fréquence de rotation pour prévenir une dégradation des performances lorsque les fichiers d&#8217;audit dépassent le Go chaque jour ? Je ne pense pas : j&#8217;ai travaillé récemment sur une application Linux RHEL 5 / JVM Hotspot 6 / Tomcat / Log4j qui générait plus d&#8217;un Go de logs d&#8217;audit chaque jour. L&#8217;impact sur les performances était négligeable et l&#8217;augmentation de la fréquence de rotation n&#8217;a eu aucun impact. En revanche, en cas d&#8217;écriture massive sur disque, il faut collaborer avec l&#8217;administrateur système pour qu&#8217;il vérifie ses configurations OS et disques (c.f. <a
href="http://en.wikipedia.org/wiki/RAID_1#RAID_1" title="RAID 1" >RAID 1</a>) ; les administrateurs sont habitués à ces problèmes avec les fichiers de logs des bases de données.</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un fichier d&#8217;audit avec rotation quotidienne qui ne traite que les loggers ayant la racine &#8216;fr.xebia.audit&#8217; :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day --&gt;
      &lt;fileNamePattern&gt;/my-application-audit.%d{yyyyMMdd}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;
      &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;
&lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
   &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
&lt;/logger&gt;
</pre><h3><a
name="Unrpertoireddipourlesfichiersd"></a>Un répertoire dédié pour les fichiers de logs archivés</h3><p>Une fois nos fichiers bien séparés, nous pouvons encore faciliter le travail des équipes d&#8217;exploitation avec une astuce très simple : stocker dans un autre répertoire les fichiers qui ont tourné. Il suffit de déclarer un répertoire <code>logs-to-collect</code> à côté de notre répertoire <code>logs</code>. Les bénéfices sont nombreux :</p><ul><li>Le script de collecte des logs (compression et transfert sur un serveur de backup) est grandement simplifié. Il n&#8217;est plus nécessaire d&#8217;utiliser un astucieux mécanisme de pattern sur le nom des fichiers pour exclure ceux qui sont en cours d&#8217;utilisation. Tous les fichiers du répertoires <code>logs-to-collect</code> peuvent être collectés à n&#8217;importe quel moment.</li></ul><ul><li>L&#8217;équipe de collecte de logs peut conserver autant de fichiers de logs d&#8217;archive sur le serveur sans nuire à la lisibilité du répertoire <code>logs</code> en y laissant des centaines d&#8217;entrées.</li></ul><ul><li>Il n&#8217;y a plus de risques de perdre les fichiers créés dans des circonstances exceptionnelles (opération de diagnostic, etc) et dont le nom ne correspondrait pas aux patterns du script de collecte, il suffit de déplacer ces fichiers dans le répertoire <code>logs-to-collect</code>.</li></ul><p>Remarque : seules les logs applicatives et d&#8217;audit ont vocation à être reversées dans ce répertoire. Les logs de diagnostic/troubleshooting ne sont pas archivées et restent donc dans le répertoire <code>logs</code>.</p><p><strong>Structure de répertoires avec un répertoire <code>logs-to-collect</code> dédié aux fichiers à archiver</strong><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/07/logs-to-collect-folder.jpg" alt="logs-to-collect folder" /></p><p><strong>Exemple de configuration avec logback</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
  &lt;file&gt;logs/my-application.log&lt;/file&gt;
  &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
    &lt;!-- roll every day in a dedicated non-active folder --&gt;
    &lt;fileNamePattern&gt;logs-to-collect/my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
  &lt;/rollingPolicy&gt;
  ...
&lt;/appender&gt;
</pre><h3><a
name="Compresserlesfichierslorsdeleu"></a>Compresser les fichiers lors de leur rotation</h3><p>Dernière astuce pour faire plaisir aux équipes d&#8217;exploitation en limitant la consommation d&#8217;espace disque : nos frameworks de logs savent maintenant compresser les fichiers (zip ou gzip) lors des rotations. Cette compression n&#8217;a en général aucun impact sur les performances de nos applications grâce aux CPU multi-cœurs, cela simplifiera encore le script de collecte des logs.</p><p>Pour la recherche dans des fichiers compressés, il faut garder en tête <code>zcat</code> et <code>gzcat</code> qui permettent d&#8217;extraire simplement les informations utiles.</p><p>Exemple de fichier <code>logback.xml</code> avec un fichier d&#8217;audit avec rotation quotidienne qui ne traite que les loggers ayant la racine &#8216;fr.xebia.audit&#8217; :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;zipped-archive&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   ...
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate and zip every day --&gt;
      &lt;fileNamePattern&gt;my-log-file.%d{yyyyMMdd}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   ...
&lt;/appender&gt;
</pre><h3><a
name="Unfichierdeconfigurationdelogs"></a>Un fichier de configuration de logs prêt pour la production</h3><p>Voici un fichier de configuration <a
href="http://blog.xebia.fr/wp-content/uploads/2011/07/logback.xml" title="logback.xml" >logback.xml</a> prêt pour la production qui reprend toutes les bonnes pratiques de ce billet; il tient en 50 lignes <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><pre class="brush: xml; title: ; notranslate">
&lt;configuration scan=&quot;true&quot;&gt;
  &lt;property name=&quot;LOGS_FOLDER&quot; value=&quot;${catalina.base}/logs&quot; /&gt;
  &lt;property name=&quot;LOGS_TO_COLLECT_FOLDER&quot; value=&quot;${catalina.base}/logs-to-collect&quot; /&gt;
   &lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application.log&lt;/file&gt;
      &lt;filter class=&quot;ch.qos.logback.classic.filter.ThresholdFilter&quot;&gt;
         &lt;level&gt;WARN&lt;/level&gt;
      &lt;/filter&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_TO_COLLECT_FOLDER}/my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
      &lt;/rollingPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m %throwable{0}%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_TO_COLLECT_FOLDER}/my-application-audit.%d{yyyyMMdd}.log.gzip&lt;/fileNamePattern&gt;
      &lt;/rollingPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;appender name=&quot;troubleshooting-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application-troubleshooting.log&lt;/file&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_FOLDER}/my-application-troubleshooting.%i.log&lt;/fileNamePattern&gt;
         &lt;maxIndex&gt;10&lt;/maxIndex&gt;
      &lt;/rollingPolicy&gt;
      &lt;triggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;&gt;
         &lt;maxFileSize&gt;10MB&lt;/maxFileSize&gt;
      &lt;/triggeringPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
      &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
   &lt;/logger&gt;
   &lt;root level=&quot;WARN&quot;&gt;
      &lt;appender-ref ref=&quot;log-file&quot; /&gt;
      &lt;appender-ref ref=&quot;troubleshooting-file&quot; /&gt;
   &lt;/root&gt;
&lt;/configuration&gt;
</pre><h3><a
name="PourquoijeprfreLogbackLogj"></a>Pourquoi je préfère Logback à Log4j</h3><p>Au delà du comparatif <a
href="http://logback.qos.ch/reasonsToSwitch.html" title="Reasons to prefer logback over log4j" >Reasons to prefer logback over log4j</a> que maintient le projet Logback avec un zest de chauvinisme, je trouve que le <strong>compactage des stack traces en préservant les causes d&#8217;une exception</strong> est vraiment différenciant. Je ne vois pas de solution pour le faire avec Log4j sans <em>hacker</em> la librairie. J&#8217;ai proposé le patch <a
href="https://issues.apache.org/bugzilla/show_bug.cgi?id=48902" title=""Bug 48902 - log4j-extras - Enhancement : add %throwable{compact} to EnhancedPatternLayout"" >&laquo;&nbsp;Bug 48902 &#8211; log4j-extras &#8211; Enhancement : add %throwable{compact} to EnhancedPatternLayout&nbsp;&raquo;</a> mais la gestion des causes de l&#8217;exception n&#8217;a pas été intégrée.</p><p>Conservation de la cause d&#8217;une exception avec Logback et le pattern &laquo;&nbsp;<a
href="%thread" title="thread" >%thread</a> %-5level %logger{36} &#8211; %msg %throwable{1}%n&nbsp;&raquo;</p><pre class="brush: java; title: ; notranslate">
[main] ERROR fr.xebia.test.LoggerTest - Logged by Logback java.lang.RuntimeException: Ze caller
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:52)
	at fr.xebia.test.LoggerTest.testLogback(LoggerTest.java:38)
Caused by: java.lang.RuntimeException: Ze cause
	at fr.xebia.test.LoggerTest.nestedMethod(LoggerTest.java:45)
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:50)
</pre><p>Perte de la cause d&#8217;une exception avec Log4j et le pattern &laquo;&nbsp;<a
href="%t" title="t" >%t</a> %5p  %c &#8211; %m %throwable{3}%n&nbsp;&raquo; :</p><pre class="brush: java; title: ; notranslate">
[main] ERROR  fr.xebia.test.LoggerTest - Logged by Log4j java.lang.RuntimeException: Ze caller
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:52)
	at fr.xebia.test.LoggerTest.testLog4j(LoggerTest.java:28)
</pre><p>J&#8217;apprécie aussi le fichier de configuration de test <code>logback-test.xml</code>, l&#8217;activation du rafraichissement de la configuration avec <code>scan="true"</code> et bien d&#8217;autres détails de Logback qui pourraient faire l&#8217;objet d&#8217;un prochain billet.</p><div
class="shr-publisher-5013"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F07%2F07%2Fjava-en-production-les-fichiers-de-logs%2F' data-shr_title='Java+en+Production+-+Les+fichiers+de+logs'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F07%2F07%2Fjava-en-production-les-fichiers-de-logs%2F' data-shr_title='Java+en+Production+-+Les+fichiers+de+logs'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/feed/</wfw:commentRss> <slash:comments>27</slash:comments> </item> <item><title>Performance, les Xebians jouent les démineurs 3</title><link>http://blog.xebia.fr/2010/04/16/performance-les-xebians-jouent-les-demineurs-3/</link> <comments>http://blog.xebia.fr/2010/04/16/performance-les-xebians-jouent-les-demineurs-3/#comments</comments> <pubDate>Fri, 16 Apr 2010 09:00:30 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[datasource]]></category> <category><![CDATA[Hibernate]]></category> <category><![CDATA[jmeter]]></category> <category><![CDATA[JMX]]></category> <category><![CDATA[Performances]]></category> <category><![CDATA[threaddump]]></category> <category><![CDATA[VisualVM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4398</guid> <description><![CDATA[3ème épisode de notre série. Il est temps pour notre magnifique application de dépasser la barre symbolique de l&#8217;utilisateur unique. Mais comme nous nous sentons confiants et forts, nous allons pousser le vice de passer à, tenez vous bien, 5 utilisateurs concurrents. Et comme certains diraient, &#171;&#160;Et là, c&#8217;est le drame&#160;&#187;. Les temps se dégradent [...]]]></description> <content:encoded><![CDATA[<p>3ème épisode de notre série. Il est temps pour notre magnifique application de dépasser la barre symbolique de l&#8217;utilisateur unique. Mais comme nous nous sentons confiants et forts, nous allons pousser le vice de passer à, tenez vous bien, 5 utilisateurs concurrents. Et comme certains diraient, &laquo;&nbsp;Et là, c&#8217;est le drame&nbsp;&raquo;. Les temps se dégradent à vitesse grand V.</p><p>Pour rappel, nous avions laissé notre utilisateur unique avec un temps mirobolant de 1,7 secondes par requête en moyenne.</p><p>Le tableau ci dessous montre que la concurrence est nuisible à nos temps de réponse.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/04/tempsInitial.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/tempsInitial670.png" alt="tempsInitial" title="tempsInitial" class="alignnone size-medium wp-image-4402" /></a></div><h3><a
name="Labaseuneressourcecritique"></a>La base une ressource critique.</h3><p>Première amélioration, quasiment gratuite. En allant chercher dans les problèmes que nous avions mis de coté (il y a quelques semaines sur le blog, mais quelques minutes auparavant lors du Xke <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , nous pouvons exhumer le traçage de la totalité des requêtes SQL dans les fichiers de log. Cette fonctionnalité est bien connue des utilisateurs d&#8217;Hibernate (très pratique pour débugger), mais elle se retrouve malheureusement bien trop souvent en production.</p><pre class="brush: xml; title: ; notranslate">
&lt;prop key=&quot;hibernate.show_sql&quot;&gt;false&lt;/prop&gt;
</pre><p>Il suffit alors d&#8217;une simple modification dans la configuration d&#8217;Hibernate, d&#8217;un redéploiement, et miracle, les temps s&#8217;améliorent déjà un peu.</p><ul><li>hibernate.show_sql à false</li><li>Temps moyen de 8,2 s à 7,6 s pour 5 utilisateurs</li><li>1 point pour l&#8217;équipe qui a trouvé</li></ul><p>Après cette correction facile, attaquons nous à plus complexe.</p><p>Si la montée en charge induit une augmentation du temps de réponse, c&#8217;est que les utilisateurs sont en concurrence sur un certain type de ressource, ou bien qu&#8217;ils mettent la machine à genoux. Un rapide coup d&#8217;oeil dans VisualVm nous montre que la CPU et la mémoire ne sont pas saturées, on a donc à faire à une contention applicative.</p><p>Celles ci peuvent être de deux types :</p><ul><li>une concurrence applicative, <i>mal</i> gérée avec les outils fournis par <code>java.concurrent.util</code></li><li>une contention sur des ressources externes, comme un pool de connexions JDBC dans une DataSource.</li></ul><p>Comme nous étions déjà sur Hibernate dans la correction précédente, continuons à creuser le sillon. Et profitons en pour dégainer un nouvel outil de notre couteau suisse de diagnostic : JMX.<br
/> Pour vérifier si nos connexions JDBC sont bloquantes, utilisons l&#8217;api de monitoring de Java. Une fois de plus, utilisons notre VisualVm, qui propose une interface graphique d&#8217;affichage des MBeans.<br
/> Nous sommes chanceux, nos GO ont utilisé la dataSource standard de Tomcat, elle est donc exposée <code>Catalina:type=DataSource,class=javax.sql.DataSource,name="jdbc/petclinicMySQL"</code></p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/04/numActive.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/numActive-300x152.png" alt="numActive" title="numActive" width="300" height="152" class="alignnone size-medium wp-image-4400" /></a></div><p>En procédant par sondage rapide (à l&#8217;aide de la fonction &#8216;refresh&#8217; du MBean), on constate rapidement que les valeurs <em>maxActive</em> et <em>numActive</em> se rejoignent autour de la valeur 3. Pas la peine d&#8217;en dire beaucoup plus&#8230; Comme d&#8217;habitude, la documentation va nous confirmer ce que nous pouvions supposer à la lecture de ces valeurs. <em>maxActive</em> nous donne le nombre maximal de connexion JDBC, alors que <em>numActive</em> nous donne celles qui sont utilisées à l&#8217;instant t. Ce qui signifie que lorsque les 3 connexions sont prises, les process suivant se mettent en attente, pendant un temps fixé par <em>maxWait</em> soit 3 secondes. Le goulet d&#8217;étranglement est évident. Il suffit donc de le fluidifier.</p><p>Ce paramétrage se trouve dans la configuration du serveur tomcat, dans le fichier <em>server.xml</em>. Nous allons agir sur deux paramètres : le <em>maxActive</em>, que nous allons positionner à 30 connexions (ce qui est plus que raisonnable) et sur le <em>maxWait</em> afin de ne pas attendre en vain une connexion qui ne viendra jamais.</p><pre class="brush: xml; title: ; notranslate">
&lt;GlobalNamingResources&gt;
    &lt;Resource name=&quot;jdbc/petclinicMySQL&quot; auth=&quot;Container&quot; type=&quot;javax.sql.DataSource&quot; driverClassName=&quot;org.gjt.mm.mysql.Driver&quot; url=&quot;jdbc:mysql://localhost:3306/petclinic_light?autoReconnect=true&quot; username=&quot;petclinic&quot; password=&quot;petclinic&quot; maxActive=&quot;30&quot; maxIdle=&quot;10&quot; removeAbandoned=&quot;true&quot; removeAbandonedTimeout=&quot;60&quot; logAbandoned=&quot;true&quot; maxWait=&quot;60&quot;/&gt;
&lt;/GlobalNamingResources&gt;
</pre><p>Les résultats sont immédiats et nous passons à un temps moyens de 7,2 s :</p><ul><li>Paramétrage de la datasource</li><li>Temps moyen de 7,6 s à 7,2 s pour 5 utilisateurs</li><li>2 points pour l&#8217;équipe qui a trouvé</li></ul><h3><a
name="CacoincetoujoursOletempsestilc"></a>Ca coince toujours. Où le temps est il consommé ?</h3><p>Pas la peine d&#8217;envisager de passer à plus d&#8217;utilisateurs tant que le temps moyen de requête est aussi catastrophique. Si l&#8217;on s&#8217;intéresse plus en détail aux résultats de JMeter, on constate que la requête <em>Owner detail</em> est la plus consommatrice. Sûrement quelque chose à optimiser de ce côté là.<br
/> On ne va pas déroger aux bonnes habitudes prises, on retourne dans VisualVm. Et quand quelque chose coince au niveau applicatif, on réalise un ensemble de ThreadDump. Comme nous sommes avides de nouveauté, nous allons laisser les commandes Unix <em>vi</em> et <em>grep</em> aux dinosaures et utiliser les possibilités de VisualVm, <a
href="https://visualvm.dev.java.net/plugins.html" title=" savoir le plugin Tda" >à savoir le plugin Tda</a>.</p><p>Pour mettre en évidence notre problème, nous allons tout d&#8217;abord restreindre les scenarii JMeter à la seule et unique requête <em>Owner Details</em>. Ensuite, nous allons réaliser une série de ThreadDump très rapproché (de 5 à 10 en quelques secondes). Nous allons ensuite utiliser une des possibilités de TDA, à savoir la détection des Thread longue durée <i><em>Long Running Thread</em></i>. TDA va tenter d&#8217;identifier les threads &#8216;bloqués&#8217; dans la même méthode au travers de n ThreadDump.<br
/> Comme auparavant, nous ne nous occuperons que des <em>catalina-exec-xx RUNNABLE</em>. Et nous avons de la chance, puisque sur nos cinq utilisateurs, nous trouvons 2 threads bloqués au même point, dans la même méthode (vous l&#8217;aurez compris, la détection de thread longue durée est principalement basée sur un &#8216;coup de sonde&#8217; statistique).</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/04/longRuningThreads.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/longRuningThreads-300x172.png" alt="longRuningThreads" title="longRuningThreads" width="300" height="172" class="alignnone size-medium wp-image-4399" /></a></div><p>Un petit tour dans le code, dans la classe incriminée.</p><pre class="brush: java; title: ; notranslate">
/**
     &lt;strong&gt; Custom handler for rendering images.
     &lt;/strong&gt;
     &lt;strong&gt; @param petId
     &lt;/strong&gt;            the ID of the pet whose visits to display
     &lt;strong&gt; @param response to output the image bytes
     &lt;/strong&gt; @throws IOException
     */
    @RequestMapping(value = &quot;/owners/*/pets/{petId}/image&quot;, method = RequestMethod.GET)
    public void petImageHandler(@PathVariable int petId, HttpServletResponse response) throws IOException {
        int imgId = petId % 6;
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(&quot;img/pet-&quot; + imgId + &quot;.jpg&quot;);
        response.setContentType(&quot;image/jpeg&quot;);
        OutputStream out = response.getOutputStream();
        IoUtils.copy(in, out);
        clean();
    }
</pre><p>A priori, rien de très suspect dans la façon de servir des images stockées côté serveur (le but de l&#8217;exercice n&#8217;étant pas d&#8217;éliminer le problème, en changeant le comportement de l&#8217;application et en déplaçant ces images côté apache).<br
/> Si on revient à nos ThreadDump, nous constatons que nous pouvons encore descendre dans le code, à l&#8217;intérieur de la classe IoUtils.</p><pre class="brush: java; title: ; notranslate">
    public static void copy(InputStream in, OutputStream out) throws IOException {
        OutputStream bufferedOutputStream = new BufferedOutputStream(out);
        byte[] buffer = new byte[512];
        int length;
        while ((length = in.read(buffer)) &gt;= 0) {
            bufferedOutputStream.write(buffer, 0, length);
        }
        bufferedOutputStream.close();
    }
</pre><p>A priori, si les copies d&#8217;InputStream / Outputstream étaient à ce point sous performantes, cela se saurait. Mais ne mésestimons pas la fourberie de nos poseurs de bombes.</p><p>En y regardant de plus près, on constate en effet que nous avons une belle implémentation maison de la méthode write, inspirée de celle du <code>ByteArrayOutputstream</code>.</p><pre class="brush: java; title: ; notranslate">
public synchronized void write(int b) {
            int newcount = count + 1;
            if (newcount &gt; buf.length) {
                buf = Arrays.copyOf(buf, (buf.length &lt;&lt; 1) / 2 + 3);
            }
            buf[count] = (byte) b;
            count = newcount;
        }
</pre><p>Et là où le <code>ByteArrayOutputstream</code> se redimensionne de manière intelligente pour accélérer la copie</p><pre class="brush: java; title: ; notranslate">
    public synchronized void write(int b) {
	int newcount = count + 1;
	if (newcount &gt; buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length &lt;&lt; 1, newcount));
	}
	buf[count] = (byte)b;
	count = newcount;
    }
</pre><p>, l&#8217;implémentation maison reste définitivement bloquée et recopie les octets 2 à 2&#8230;</p><p>Si nous remplaçons cette implémentation par <code>java.io.BufferedOutputstream</code>, nous devrions avoir de bien meilleurs résultats.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/04/tempsFinal.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/04/tempsFinal670.png" alt="tempsFinal" title="tempsFinal"  class="alignnone size-medium wp-image-4401" /></a></div><p>Et en effet cette fois, c&#8217;est spectaculaire. Pour nos cinq utilisateurs, nous passons à un temps moyen de 1,4 s avec une très remarquée dégringolade du temps moyen de <em>ownersDetail</em> qui passe de 32 s à 3,7 s.</p><ul><li>Suppression d&#8217;un java.io maison</li><li>Temps moyen de 7,2 s à 1,4 s pour 5 utilisateurs</li><li>3 points pour l&#8217;équipe qui a trouvé</li></ul><p>Il va bientôt être temps de passer à un nombre d&#8217;utilisateurs &laquo;&nbsp;raisonnable&nbsp;&raquo;.</p><div
class="shr-publisher-4398"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F04%2F16%2Fperformance-les-xebians-jouent-les-demineurs-3%2F' data-shr_title='Performance%2C+les+Xebians+jouent+les+d%C3%A9mineurs+3'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F04%2F16%2Fperformance-les-xebians-jouent-les-demineurs-3%2F' data-shr_title='Performance%2C+les+Xebians+jouent+les+d%C3%A9mineurs+3'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/04/16/performance-les-xebians-jouent-les-demineurs-3/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Soirée &#171;&#160;Les applications Java et la Production&#160;&#187; suivie d&#8217;un cocktail</title><link>http://blog.xebia.fr/2010/03/25/soiree-les-applications-java-et-la-production-suivie-dun-cocktail/</link> <comments>http://blog.xebia.fr/2010/03/25/soiree-les-applications-java-et-la-production-suivie-dun-cocktail/#comments</comments> <pubDate>Thu, 25 Mar 2010 16:03:02 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4270</guid> <description><![CDATA[Xebia organise le 12 Avril à partir de 19h, une soirée &#171;&#160;Les dix bonnes pratiques des applications Java prêtes pour la production&#160;&#187; suivie d’un cocktail. Cette soirée gratuite vous permettra d’appréhender les bonnes pratiques que se doivent de respecter les Directions Etudes et Développement pour rendre leurs applications Java/J2EE prêtes pour la production. Elle se [...]]]></description> <content:encoded><![CDATA[<p>Xebia organise le 12 Avril à partir de 19h, une soirée &laquo;&nbsp;Les dix bonnes pratiques des applications Java prêtes pour la production&nbsp;&raquo; suivie d’un cocktail.</p><p>Cette soirée gratuite vous permettra d’appréhender les bonnes pratiques que se doivent de respecter les Directions Etudes et Développement pour rendre leurs applications Java/J2EE prêtes pour la production.</p><p>Elle se déroulera dans les locaux de Xebia : 156, boulevard Haussmann, 75008 Paris.<br
/> Les inscriptions peuvent se faire :</p><ul><li>Par mail : <a
href="mailto:info@xebia-training.fr">info@xebia-training.fr</a></li><li>Par téléphone : 01.53.89.99.93</li><li>En ligne <a
href="http://training.xebia.fr/soiree-les-applications-java-et-la-production/"> sur le site de Xebia Training</a></li></ul><p>Les technologies Java ont été massivement adoptées par les DSI pour la réalisation de leurs applications critiques. Porteuses de valeur et d’innovation, elles posent régulièrement problème au niveau des départements Exploitation/Production. Instabilité chronique, manque de capacité à monter en charge, difficultés de diagnostiques en cas de dysfonctionnement, déploiement chaotique sont autant de maux fréquemment rencontrés par les entreprises utilisatrices.</p><p>Les bonnes pratiques que se doivent de respecter les Directions Etudes et Développement pour rendre leurs applications Java/J2EE prêtes pour la production s’articulent autour des axes suivants :</p><h4>Les bonnes pratiques pour le déploiement</h4><p>Le déploiement est le baptême du feu d’une application en production. Comment réussir cette épreuve ?</p><ul><li>Complexité des composants à déployer : simplicité rime avec fiabilité,</li><li>Les paramètres de configuration : éviter l’anarchie,</li><li>Traçabilité et build automatisés : maitriser sa plateforme.</li></ul><h4>Les bonnes pratiques de robustesse</h4><p>Dans l’adversité, une application robuste assure un service minimum plutôt que de s’arrêter :</p><ul><li>Dépendances inter-application : fail fast est il synonyme de fragilité ?</li><li>Prévention des saturations et des effets “domino” : l’art du code défensif,</li><li>Modes dégradés : les négociation technico-fonctionnelles.</li></ul><h4>Les bonnes pratiques pour la supervision et le monitoring</h4><p>Une application en production doit exposer son état aux équipes d’exploitation et faciliter la détection de problèmes :</p><ul><li>Indicateurs de bon fonctionnement d’une application : ne pas se noyer dans les chiffre,</li><li>Comment exposer les indicateurs de performances ? Fichier de log versus page JSP versus Java Management eXtension (JMX) ?</li></ul><h4>Les bonnes pratiques de log</h4><p>Grande source d’incompréhension entre les départements études et exploitation, les logs d’application Java ? Quels formats de messages ?</p><ul><li>Codes erreurs chers aux exploitants, exceptions chainées et stacktraces familières aux développeurs, quel compromis ?</li><li>Des logs de troubleshooting extrêmement verbeuses aux logs d’audit sécurité à conserver plus d’un an en passant par celles de perfs et celles de diagnostique, comment organiser les logs ?</li></ul><h4>Les bonnes pratiques organisationnelles</h4><p>Avoir une application prête pour la production ne se limite pas à des bonnes pratiques techniques, la collaboration des départements études et exploitation est essentielle :</p><ul><li>Prendre en considération les réalités de production dans les développements : une amélioration continue,</li><li>Les incidents : comment s’y préparer pour qu’ils ne se transforment pas en longues indisponibilité.</li></ul><h4>BONUS</h4><p>Les bonnes pratiques de robustesse</p><ul><li>Les mécanismes de ré-essai</li></ul><div
class="shr-publisher-4270"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F03%2F25%2Fsoiree-les-applications-java-et-la-production-suivie-dun-cocktail%2F' data-shr_title='Soir%C3%A9e+%22Les+applications+Java+et+la+Production%22+suivie+d%27un+cocktail'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F03%2F25%2Fsoiree-les-applications-java-et-la-production-suivie-dun-cocktail%2F' data-shr_title='Soir%C3%A9e+%22Les+applications+Java+et+la+Production%22+suivie+d%27un+cocktail'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/25/soiree-les-applications-java-et-la-production-suivie-dun-cocktail/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Deployit 1.2.2 supporte maintenant Tomcat !</title><link>http://blog.xebia.fr/2010/03/19/deployit-1-2-2-supporte-maintenant-tomcat/</link> <comments>http://blog.xebia.fr/2010/03/19/deployit-1-2-2-supporte-maintenant-tomcat/#comments</comments> <pubDate>Fri, 19 Mar 2010 09:05:19 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4213</guid> <description><![CDATA[Plus d&#8217;excuse pour ne pas l&#8217;essayer : la nouvelle version de Deployit, solution d’automatisation des déploiements J2EE vient de sortir. Les deux principales nouveautés sont : le support du serveur Tomcat : déploiement des archives de type WAR directement ou à travers l&#8217;application Manager et la création des DataSources JDBC dans le context. l&#8217;exécution de [...]]]></description> <content:encoded><![CDATA[<div><p><img
style="margin: 1em; float:right" title="deployit" src="http://blog.xebia.fr/wp-content/uploads/2010/03/deployit-logo-small.png" alt="deployit" /></p><p>Plus d&#8217;excuse pour ne pas l&#8217;essayer : la nouvelle version de Deployit, solution d’automatisation des déploiements J2EE vient de sortir. Les deux principales nouveautés sont :</p><ul><li>le support du serveur <strong>Tomcat </strong>: déploiement des archives de type WAR directement ou à travers <a
href="http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html">l&#8217;application <em>Manager</em></a> et la création des <a
href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html">DataSources JDBC</a> dans le <i>context</i>.</li><li>l&#8217;exécution de <strong>scripts SQL</strong> lors du déploiement.</li></ul><p>Les autres serveurs d&#8217;application n&#8217;ont pas été oubliés.</p><ul><li>Oracle Weblogic : gestion plus complète des services JMS</li><li>IBM WebSphere : support indifférent d&#8217;Apache ou d&#8217;<a
href="http://www-01.ibm.com/software/webservers/httpservers/">IHS</a>, possibilité d&#8217;indiquer l&#8217;ordre de chargement pour les EAR et WAR, des déploiements accélérés en gardant ouverte la connexion vers wsadmin</li></ul><p>et coté système d&#8217;exploitation, support du protocole telnet/smb pour les machines de type Windows.</p><p>Retrouvez toutes ces nouvelles fonctionnalités dans Deployit Personal Edition. Cette version gratuite possède toutes les fonctionnalités de la version Enterprise, exception faite des aspects sécurité. Elle inclut une licence permettant à un utilisateur unique et identifié d’utiliser l’outil, sans limitations. Deployit Personal Edition inclut en standard des plugins pour Tomcat, IBM WebSphere AS, Oracle WebLogic Server et JBoss AS. Cette version peut être téléchargée gratuitement avec sa documentation et des tutoriels permettant de comprendre son fonctionnement. Cliquer sur le lien suivant : <a
href="http://www.xebialabs.com/deployit-personal-edition-request">http://www.xebialabs.com/deployit-personal-edition-request</a>.</div><div
class="shr-publisher-4213"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F03%2F19%2Fdeployit-1-2-2-supporte-maintenant-tomcat%2F' data-shr_title='Deployit+1.2.2+supporte+maintenant+Tomcat+%21'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F03%2F19%2Fdeployit-1-2-2-supporte-maintenant-tomcat%2F' data-shr_title='Deployit+1.2.2+supporte+maintenant+Tomcat+%21'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/03/19/deployit-1-2-2-supporte-maintenant-tomcat/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Catalogue Xebia Training</title><link>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/</link> <comments>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/#comments</comments> <pubDate>Wed, 24 Feb 2010 12:32:34 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[eXtrem Programming]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[XP]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4085</guid> <description><![CDATA[Nous sommes heureux de vous proposer le nouveau catalogue de formation Xebia Traning : Le catalogue numérique. Le catalogue PDF. Xebia Training se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/xebia-training.png" style="margin: 1em 1em 1em 1em; float: right;" /></a><br
/> Nous sommes heureux de vous proposer le nouveau <a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue de formation Xebia Traning</a> :</p><ul><li>Le <a
href="http://flipflashpages.uniflip.com/2/26742/50371/pub/">catalogue numérique</a>.</li><li>Le <a
href="http://training.xebia.fr/wp-content/uploads/catalogue%20des%20formations%202010-xebia-training.pdf">catalogue PDF</a>.</li></ul><p><a
href="http://training.xebia.fr">Xebia Training</a> se positionne logiquement dans la continuité de Xebia, tant sur la qualité de son offre de formation technique que méthodologique (méthodes agiles), en proposant des formations haut de gamme animées uniquement par les référents de leur domaine.</p><p>Avec pour principe premier le refus de tout compromis sur la qualité du formateur et du contenu, <a
href="http://training.xebia.fr">Xebia Training</a> fait systématiquement intervenir des acteurs de références dans leurs domaines respectifs.</p><p>Nos formations, savant équilibre entre théorie et travaux pratiques, sont destinées à un large public soucieux d’acquérir les meilleures pratiques de notre industrie.</p><div
class="shr-publisher-4085"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F24%2Fcatalogue-xebia-training%2F' data-shr_title='Catalogue+Xebia+Training+'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F24%2Fcatalogue-xebia-training%2F' data-shr_title='Catalogue+Xebia+Training+'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/24/catalogue-xebia-training/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Performance, les Xebians jouent les démineurs 2</title><link>http://blog.xebia.fr/2010/02/16/performance-les-xebians-jouent-les-demineurs-2/</link> <comments>http://blog.xebia.fr/2010/02/16/performance-les-xebians-jouent-les-demineurs-2/#comments</comments> <pubDate>Tue, 16 Feb 2010 13:51:05 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[dump]]></category> <category><![CDATA[HTTPConnector]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[Mémoire]]></category> <category><![CDATA[Performances]]></category> <category><![CDATA[Threads]]></category> <category><![CDATA[Xssn]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4004</guid> <description><![CDATA[Suite de nos investigations sur l&#8217;application PetClinic dégradée. Après une première passe qui nous a permis de calibrer les logs de manière un peu plus pertinente, il est temps, toujours sans l&#8217;aide du code source, de mettre les mains sous le capot de Tomcat (6.0.20). Et pour cela, rien de mieux que de jeter de [...]]]></description> <content:encoded><![CDATA[<p>Suite de nos investigations sur l&#8217;application PetClinic dégradée.</p><p>Après <a
href="http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/" title="une premire passe" >une première passe</a> qui nous a permis de calibrer les logs de manière un peu plus pertinente, il est temps, toujours sans l&#8217;aide du code source, de mettre les mains sous le capot de Tomcat (6.0.20).</p><p>Et pour cela, rien de mieux que de jeter de nouveau un œil à notre VisualVm.</p><h4><a
name="Tantdethreadspourunseulutilisa"></a>Tant de threads pour un seul utilisateur.</h4><p>Pour (re)commencer, penchons nous sur nos threads, juste après le démarrage du serveur (et donc avant la première connexion d&#8217;un utilisateur)</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/threadsOverview.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/threadsOverview.png" alt="threadsOverview" title="threadsOverview" width="567" height="272" class="aligncenter size-full wp-image-4009" /></a></div><p>Lorsque l&#8217;on démarre un serveur Tomcat, un certain nombre de threads sont affectés à sa &#8216;tuyauterie&#8217; interne (connecteurs RMI, JMX). Mais de là à avoir 165 threads, il y a certainement un souci quelque part !<br
/> Creusons un peu, et entrons dans le détail de ces threads en utilisant l&#8217;onglet <em>Threads</em>.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/threadsDetails.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/threadsDetails.png" alt="threadsDetails" title="threadsDetails" width="700" class="aligncenter size-large wp-image-4013" /></a></div><p>Hormis les threads &#8216;connecteurs&#8217; de Tomcat, on voit apparaître 150 threads catalina-exec. Ces threads sont en charge des traitements des requêtes HTTP, via le HTTP-8080-acceptor. Nous avons donc, &laquo;&nbsp;à froid&nbsp;&raquo; 150 unités d&#8217;œuvre prêtes à traiter nos requêtes. Sachant que pour l&#8217;instant nos tests se limitent à un utilisateur, on sent que nous sommes très légèrement surarmés par rapport à nos besoins.<br
/> Tomcat ne devrait-il pas gérer automatiquement ces problématiques de montée ou descente en charge ?<br
/> Allons faire un petit tour dans la documentation, <a
href="<br /> http://tomcat.apache.org/tomcat-6.0-doc/config/http.html">du côté du connecteur HTTP</a>.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/httpConnector.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/httpConnector.png" alt="httpConnector" title="httpConnector" width="700" class="aligncenter size-large wp-image-4015" /></a></div><p>Si nous recherchons le paramètre minSpareThreads dans nos fichiers de configuration, nous le trouvons dans server.xml. Repassons le à une valeur plus réaliste de 10 threads, sachant que Tomcat montera automatiquement en charge si besoin.<br
/> Cela n&#8217;a pas d&#8217;impact visible sur les performances, mais au moins, les ThreadDumps deviennent lisibles (obfusquer les ThreadDumps était le but recherché de ce paramétrage).<br
/> Autre paramètre qui a interpellé les connaisseurs de Tomcat, la classe de l&#8217;Executor. <code>org.apache.catalina.core.extended.PrestartingThreadExecutor</code> n&#8217;est pas une classe courante. D&#8217;habitude, on utilise plutôt le <code>StandardThreadExecutor</code>. Une fois encore, on peut remercier nos buggers en chef : PrestartingThreadExecutor est une classe custom, qui démarre automatiquement tous les threads HTTP. De nouveau, l&#8217;impact sur les performances est négligeable pour un utilisateur, mais mieux vaut laisser Tomcat gérer toutes les problématiques de vie du serveur d&#8217;application. Sans vouloir leur faire offense, nos maîtres de cérémonie n&#8217;ont pas le niveau des équipes Apache rodées à l&#8217;exercice depuis de très nombreuses années <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br
/> Dernier paramètre &laquo;&nbsp;malin&nbsp;&raquo; introduit au niveau de Tomcat, le paramètre -Xss. Celui-ci peut être découvert via l&#8217;overview de VisualVm. -Xmx, -Xms sont des paramètres classiques (nous reviendrons dessus) que grand nombre de développeurs connaissent. Mais -Xss ? Comme d&#8217;habitude, notre meilleure arme est <a
href="http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html" title="la documentation de Sun" >la documentation de Sun</a>.</p><pre class="brush: java; title: ; notranslate">-Xssn
    Set thread stack size.</pre><p>Avons nous réellement besoin d&#8217;une taille de stack de 1024 Ko ? Difficile à dire, surtout a priori. Mais une fois encore, le plus simple est de faire confiance à Tomcat, quitte à devoir intervenir a posteriori. Nous ne sommes plus à un redémarrage près.</p><p>Maintenant que notre application est déployée et paramétrée de manière à peu près correcte, il est temps de rentrer &laquo;&nbsp;dans le dur&nbsp;&raquo; : mettre les mains dans le cambouis et explorer le code source.</p><h4><a
name="Fuitemmoirethreadsdumpaexplose"></a>Fuite mémoire, threads dump, ça explose de tous les côtés.</h4><p>Dès que nous avons eu le code source entre les mains, plusieurs stratégies se sont dégagées :</p><ul><li>la première consiste à conserver un seul utilisateur dans les scripts JMeter et à le pousser à faire plus d&#8217;itérations,</li><li>la seconde consiste à mettre plus d&#8217;utilisateurs JMeter en parallèle.</li></ul><p>Toujours dans le but de rester très didactique, nous allons appliquer la première stratégie. Qui trouve rapidement sa limite :</p><p>Aux environs de la 70ème itération, la <em>heap used</em> tangente la <em>heap max</em>, le Garbage Collector est déclenché plusieurs dizaines de fois par seconde de manière totalement inefficace, et la JVM finit par faire un joli OutOfMemory. Les symptômes classiques de la fuite mémoire.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/memoryLeak.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/memoryLeak.png" alt="memoryLeak" title="memoryLeak" width="700" class="aligncenter size-medium wp-image-4017" /></a></div><p>Comment faire pour la trouver ?<br
/> C&#8217;est à la fois simple et complexe : depuis la JVM 6, il est très facile, grâce à VisualVm de réaliser des &laquo;&nbsp;photographies&nbsp;&raquo; exhaustives de la mémoire de la JVM, les célèbres heap dumps. Malheureusement, ce n&#8217;est possible que sur les JVM locales.<br
/> Conformons nous donc à l&#8217;énoncé et n&#8217;installons pas notre Tomcat en local. La solution consiste à utiliser la commande jmap.<br
/> Commençons par générer un histogramme, que nous allons filtrer.<br
/> <code>jmap -histo &lt;pid_jvm&gt; | grep org.spring</code><br
/> Notre premier candidat arrive en 16ème position dans l&#8217;histogramme :<br
/> <code>16:         14000         560000  org.springframework.samples.petclinic.Vet</code><br
/> 14 000 vétérinaires, voilà qui est surprenant&#8230; De là à dire que notre fuite tourne autour de cet objet métier, il n&#8217;y a qu&#8217;un pas. Malheureusement, à part en allant dans le code à la pioche, il va être difficile de colmater la fuite avec aussi peu d&#8217;information. De nouveau, jmap va nous rendre service, cette fois en générant un heap dump.<br
/> <code>jmap -dump:format=b,file=/tmp/dump.hprof &lt;pid_jvm&gt;</code><br
/> Pour exploiter ce dump, nous avons choisi d&#8217;utiliser l&#8217;outil <a
href="http://www.eclipse.org/mat/" title="Eclipse Mat" >Eclipse Mat</a>. Dès l&#8217;ouverture, Mat nous propose de rechercher les <em>leak suspects</em><br
/> Et là, le diagnostic est assez évident.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/leakMat.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/leakMat.png" alt="leakMat" title="leakMat" width="700" class="aligncenter size-medium wp-image-4020" /></a></div><p>Un type d&#8217;objet monopolise à lui seul 92 % de la mémoire. Il ne reste plus qu&#8217;à creuser dans le heap dump pour déceler l&#8217;allocation coupable.<br
/> Passons donc à la vue <em>dominator tree</em>. En dépliant progressivement la pile mémoire (en cliquant sur l&#8217;objet qui a la plus grande <em>retained heap</em>), on constate que la mémoire est occupée par de très nombreuses occurences de <code>org.springframework.samples.petclinic.util.CacheFilter$CacheEntry</code></p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/memoryLeakMat.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/memoryLeakMat.png" alt="memoryLeakMat" title="memoryLeakMat" width="700" class="aligncenter size-medium wp-image-4018" /></a></div><p>Maintenant que nous avons un coupable, il est temps, pour la première fois, d&#8217;ouvrir notre code source sous Eclipse. En faisant une simple recherche de classe sur notre coupable désigné, nous arrivons au code suivant :</p><pre class="brush: java; title: ; notranslate">
HttpSession session = request.getSession();
Map&lt;String, CacheEntry&gt; cache = (Map&lt;String, CacheEntry&gt;) session.getAttribute(&quot;pages.cache&quot;);
if (cache == null){
    cache = new Hashtable&lt;String, CacheEntry&gt;();
    session.setAttribute(&quot;pages.cache&quot;, cache);
}
...
//Return cached content if available
String path = context.getRealPath(&quot;&quot;) + request.getRequestURI() + request.getQueryString();
CacheEntry cacheEntry = cache.get(path);
if (cacheEntry != null) {
    response.setContentType(cacheEntry.t);
} else {
    //Else, fetch it
    cacheEntry = new CacheEntry();
    CacheResponseWrapper wrapper = new CacheResponseWrapper(response);
    chain.doFilter(request, wrapper);
    byte[] buf = cacheEntry.buf;
    InputStream in = wrapper.getContentAsInputStream();
    OutputStream out = cacheEntry.c;
    int length;
    while((length = in.read(buf)) &gt;= 0) {
        out.write(buf, 0, length);
    }
cacheEntry.t = wrapper.getContentType();
cache.put(path, cacheEntry);
}
</pre><p>Chaque page est donc mise en cache dans la session de l&#8217;utilisateur. Le timeout du cache étant fixé à l&#8217;infini, on voit de manière assez évidente que chaque fois que notre JMeter lance une campagne de test, il ouvre une nouvelle Session dans laquelle l&#8217;ensemble des pages vues est gardée en mémoire (avec un taux de réutilisation proche de zéro).<br
/> L&#8217;utilisation des ressources mémoire de notre JVM est ici particulièrement mauvaise.<br
/> Deux solutions sont envisageables :</p><ul><li>basculer le cache dans un scope application. Mais dans ce cas, attention, la taille de celui-ci peut vite exploser et l&#8217;utilisation d&#8217;un filtre qui cache systématiquement tout le contenu de la réponse peut rapidement échapper à tout contrôle.</li><li>supprimer purement et simplement ce cache dont le taux de hit est ridiculement bas. C&#8217;est la solution que nous choisirons ici, car c&#8217;est la plus économique (une ligne à commenter dans le <code>web.xml</code>).</li></ul><p>Cette correction ne devrait toutefois pas affecter notre nombre élevé de <code>Vets</code> trouvés via l&#8217;histogramme&#8230; Nous y reviendrons probablement.</p><p>Ne reste alors plus qu&#8217;à re-construire (via Maven) et relivrer l&#8217;application pour voir le résultat.</p><p>Cette fois, le gain de performance ne se mesure pas directement dans JMeter. Les temps de réponse de l&#8217;application sont sensiblement identiques à ce qu&#8217;ils étaient avant nos interventions.</p><p>En revanche, nous avons largement gagné en performance dans deux domaines :</p><ul><li>le plus immédiat, celui du ressenti utilisateur : plus la peine de rebooter notre serveur tous les 70 scenarii, et ça toutes les équipes d&#8217;exploitation vous le diront (sauf les mauvais élèves qui ont bêtement automatisé leurs redémarrages), c&#8217;est un énorme gain.</li><li>celui plus égoïste, d&#8217;avoir des traces propres et peu nombreuses, donc beaucoup plus exploitables.</li></ul><p>Pour finir, les points attribués :</p><ul><li> Fuite mémoire de CacheFilter en session</li><li> Passage de la barre des 70 scenarii pour 1 utilisateur</li><li> 2 points pour l&#8217;équipe qui a trouvé</li></ul><p>Comme l&#8217;a très bien pressenti l&#8217;un de nos lecteurs (voir les <a
href="http://blog.xebia.fr/2010/01/27/performance-les-xebians-jouent-les-demineurs/#comment-20398" title="commentaires" >commentaires</a> sur l&#8217;article précédent), nous ne sommes pas encore au bout de nos <em>surprises</em></p><div
class="shr-publisher-4004"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F16%2Fperformance-les-xebians-jouent-les-demineurs-2%2F' data-shr_title='Performance%2C+les+Xebians+jouent+les+d%C3%A9mineurs+2'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F16%2Fperformance-les-xebians-jouent-les-demineurs-2%2F' data-shr_title='Performance%2C+les+Xebians+jouent+les+d%C3%A9mineurs+2'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/16/performance-les-xebians-jouent-les-demineurs-2/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Just DeployIt !</title><link>http://blog.xebia.fr/2010/02/04/just-deployit/</link> <comments>http://blog.xebia.fr/2010/02/04/just-deployit/#comments</comments> <pubDate>Thu, 04 Feb 2010 13:31:23 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3981</guid> <description><![CDATA[Le 1er février dernier, XebiaLabs a mis en ligne une version dite &#171;&#160;Personnelle&#160;&#187; de &#171;&#160;Deployit&#160;&#187;, sa solution d&#8217;automatisation des déploiements J2EE. Cette version est gratuite et possède toutes les fonctionnalités de la version Enterprise, exception faite des aspects sécurité. Elle inclut une licence permettant à un utilisateur unique et identifié d&#8217;utiliser l&#8217;outil, sans limitations. Deployit [...]]]></description> <content:encoded><![CDATA[<p>Le 1er février dernier, <a
href="http://www.xebialabs.com/">XebiaLabs</a> a mis en ligne une <a
href="http://www.xebialabs.com/deployit-personal-edition-request">version dite &laquo;&nbsp;Personnelle&nbsp;&raquo; de &laquo;&nbsp;Deployit&nbsp;&raquo;</a>, sa solution d&#8217;automatisation des déploiements J2EE.</p><p>Cette version est gratuite et possède toutes les fonctionnalités de la version Enterprise, exception faite des aspects sécurité. Elle inclut une licence permettant à un utilisateur unique et identifié d&#8217;utiliser l&#8217;outil, sans limitations. Deployit Personal Edition inclut en standard des plugins pour IBM WebSphere AS, Oracle WebLogic Server et JBoss AS. Cette version peut être téléchargée gratuitement avec sa documentation et des tutoriels permettant de comprendre son fonctionnement.</p><p>Par ailleurs, avec Deployit Personal Edition, vous avez tout à disposition pour développer vos propres plugins : la documentation de l&#8217;API de plugin, les tutoriels et le code source des plugins existants. Enfin, en plus du support technique fourni via le web, notre équipe support peut être contactée gratuitement pendant 90 jours !</p><p>Si <a
href="http://www.xebialabs.com/deployit-personal-edition-request">Deployit Personal Edition</a> permet de bénéficier des avantages de Deployit (y compris en Production), il conviendra d&#8217;opter pour la version Enterprise incluant ses fonctionnalités de sécurité, son support technique complet et sa licence multi-utilisateurs dans le cadre d&#8217;un environnement plus complexe d&#8217;Entreprise.</p><div
align="center"> <object
width="425" height="344"><param
name="movie" value="http://www.youtube.com/v/Fc88Jw4A8kc&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param
name="allowFullScreen" value="true"></param><param
name="allowScriptAccess" value="always"></param><embed
src="http://www.youtube.com/v/Fc88Jw4A8kc&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></div><p>Deployit Personal Edition peut être obtenue en cliquant sur le lien suivant : <a
href="http://www.xebialabs.com/deployit-personal-edition-request">http://www.xebialabs.com/deployit-personal-edition-request</a>.</p><div
class="shr-publisher-3981"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F04%2Fjust-deployit%2F' data-shr_title='Just+DeployIt+%21'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F04%2Fjust-deployit%2F' data-shr_title='Just+DeployIt+%21'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/04/just-deployit/feed/</wfw:commentRss> <slash:comments>4</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><div
class="shr-publisher-3952"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F03%2Ftomcat-load-balancing-mod_proxy-vs-mod_jk-le-match%2F' data-shr_title='Tomcat+load+balancing+-+mod_proxy+vs+mod_jk+le+match'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2010%2F02%2F03%2Ftomcat-load-balancing-mod_proxy-vs-mod_jk-le-match%2F' data-shr_title='Tomcat+load+balancing+-+mod_proxy+vs+mod_jk+le+match'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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>Les fournisseurs de serveurs d&#8217;application ont-ils vraiment compris le déploiement ?</title><link>http://blog.xebia.fr/2009/11/16/les-fournisseurs-de-serveurs-dapplication-ont-ils-vraiment-compris-le-deploiement/</link> <comments>http://blog.xebia.fr/2009/11/16/les-fournisseurs-de-serveurs-dapplication-ont-ils-vraiment-compris-le-deploiement/#comments</comments> <pubDate>Mon, 16 Nov 2009 11:09:35 +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> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3130</guid> <description><![CDATA[Chez XebiaLabs, nous nous y connaissons en déploiement automatique d&#8217;applications Java EE. L&#8217;une des choses les plus surprenantes réside dans le fait que «les fournisseurs de serveurs d&#8217;application ne semblent pas faire partie des personnes qui maitrisent le mieux le déploiement d&#8217;applications». Dans un article précédent, nous avons décrit ce que nous considérons comme le [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.xebialabs.com/sites/all/themes/xebialabs/images/block-sidebar-green-not-front.png" alt="DeployIt" style="margin: 1em 1em 1em 1em; float: right;" /></p><p>Chez <a
href="http://www.xebialabs.com/" title="XebiaLabs" >XebiaLabs</a>, nous nous y connaissons en déploiement automatique d&#8217;applications Java EE. L&#8217;une des choses les plus surprenantes réside dans le fait que «les fournisseurs de serveurs d&#8217;application ne semblent pas faire partie des personnes qui maitrisent le mieux le déploiement d&#8217;applications».</p><p>Dans un article précédent, nous avons décrit ce que nous considérons comme le <a
href="http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole/" title="dploiement dapplication J2EE global" >déploiement d&#8217;application J2EE global</a>. Et force est de constater que:</p><ul><li>Déployer va bien au delà d&#8217;un simple déploiement d&#8217;un EAR ou d&#8217;un WAR.</li><li>La plupart des applications ont également besoin d&#8217;autres artéfacts comme par exemple du contenu statique pour le serveur web ou encore des fichiers de configuration, utilisés par le code java, au démarrage.</li><li>Il faut également configurer des ressources JEE comme des Datasources JDBC ou des composants JMS (Queues, Topics, Servers).</li><li>A ceci s&#8217;ajoute, bien entendu, la configuration du middleware lui-même: création et configuration de clusters de serveurs d&#8217;application ou de virtual hosts d&#8217;un serveur Apache.</li><li>L&#8217;ordre d&#8217;exécution des tâches est important afin de réduire (voire de prévenir) la coupure de service de l&#8217;application pendant le déploiement et d&#8217;en augmenter la vitesse.</li></ul><p>Alors posons nous la question. Que nous proposent les fournisseurs de serveurs d&#8217;application dans ce domaine ?</p><h3><a
name="OracleWebLogicServer"></a>Oracle WebLogic Server</h3><p>Oracle WebLogic Server propose un concept de &#8216;Deployment&#8217;: c&#8217;est la <a
href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/ConsoleHelp/taskhelp/applications/DeployEnterpriseApplications.html" title="chose que vous créez" >chose que vous créez</a> quand vous déployez un EAR, un WAR ou un EJB Jar. Sic ! Vous pouvez l&#8217;adapter à l&#8217;environnement en fournissant un <a
href="http://blog.xebia.fr/2008/04/17/les-plans-de-deploiement-weblogic/" title="plan de dploiement" >plan de déploiement</a>. Cependant, rien n&#8217;est proposé pour regrouper plusieurs artéfacts JEE dans un seul déploiement ou inclure la création de ressources JEE telle qu&#8217;une Datasource.</p><p>Dans WebLogic, il y a le concept de &#8216;<a
href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/jms_admin/basic_config.html#wp1170473" title="SubDeployement'" >SubDeployement&#8217;</a> mais étrangement il n&#8217;est pas corrélé à un déploiement. C&#8217;est un mécanisme utilisé pour cibler des parties d&#8217;un <a
href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/jms_admin/basic_config.html#wp1170355" title="module JMS" >module JMS</a> vers des serveurs JMS ou des serveurs WebLogic. L&#8217;artifice proposé par les modules JMS semble destiné seulement à regrouper des ressources JMS. Sans doute qu&#8217;un jour un développeur l&#8217;a initialement appelé Déploiement sans se souvenir que le concept existait déjà dans WebLogic et il l&#8217;a alors renommé SubDeployement. Bien sûr, tout ceci n&#8217;est que supputation!</p><p>WebLogic propose un grand nombre d&#8217;API pour le déploiement: l&#8217;historique <a
href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/deployment/deploy.html" title="weblogic.Deployer" >weblogic.Deployer</a> en ligne de commande, la tâche ANT <a
href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/wldeploy.html" title="wldeploy" >wldeploy</a> et le <a
href="http://download.oracle.com/docs/cd/E15051_01/wls/docs103/config_scripting/index.html" title="WebLogic Scripting Tools" >WebLogic Scripting Tools</a>, WLST pour les intimes, basé sur Python. Ce dernier est, je pense, le plus complet. Grâce à sa représentation sous forme de système de fichier de la hiérarchie des MBeans, il fournit un moyen très intuitif d&#8217;accéder à l&#8217;information.</p><h3><a
name="JBossApplicationServer"></a>JBoss Application Server</h3><p>Le déploiement dans JBoss est géré par le <a
href="http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Administration_And_Configuration_Guide/5/html/virtual_deployment_framework.html" title="Virtual Deployment Framework" >Virtual Deployment Framework</a>. C&#8217;est un framework basé sur des MBeans qui permet à différents artéfacts (EARs, WARs, EJB JARs, RARs, SARs &#8230;) et à différentes ressources (sources de données, paramètres JMS &#8230;) d&#8217;être déployés sur JBoss. Tout ceci est géré par leurs <a
href="http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Administration_And_Configuration_Guide/5/html/ch06s04.html" title="deployers" >deployers</a>.</p><p>Cependant, la plupart des gens n&#8217;invoque pas ces <code>deployers</code>, ni même &#8216;<a
href="http://www.jboss.org/community/wiki/Twiddle" title="twiddle" >twiddle</a>&#8216;. Ils préfèrent simplement déposer leurs artéfacts dans le répertoire <code>deploy/</code> de leur serveur d&#8217;application Jboss, puis attendre que le <a
href="http://www.jboss.org/community/wiki/ConfiguringTheDeploymentScannerInConfjbossSystemxml" title="Deployment Scanner" >Deployment Scanner</a> le détecte. Ils vérifient ensuite dans le fichier de log que le déploiement est terminé.</p><p>Le souci avec cette méthode : le déploiement n&#8217;est pas une opération atomique. Quand on automatise un déploiement, on ne veut redémarrer le serveur web qu&#8217;après un déploiement réussi du nouveau WAR. Mais écrire un bout de code qui analyse les logs du serveur à la recherche d&#8217;un mot clé est tout simplement moche. Une alternative serait de positionner la propriété <code>ScanEnabled</code> du <code>DeploymentScanner</code> à <code>false</code> d&#8217;invoquer manuellement le <code>deployer</code>. Non seulement cela complexifie le code, mais il faut également prévoir la copie des fichiers dans le répertoire <code>deploy</code> du serveur JBoss.</p><p>Ainsi, il s&#8217;avère qu&#8217;avec JBoss Application Server, il est difficile d&#8217;intégrer des déploiements vers ses serveurs dans un scénario de déploiement plus global. RedHat doit corriger ce problème au plus vite pour que JBoss soit réellement prêt pour les entreprises.</p><h3><a
name="IBMWebSphereApplicationServer"></a>IBM WebSphere Application Server</h3><p>Et pour le gros monstre JEE de chez &#8216;Big Blue&#8217; ? Il offre une façon polyvalente et transactionnelle pour déployer des applications et des ressources. Globalement, le langage de script <a
href="http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/txml_launchscript.html" title="wsadmin" >wsadmin</a> permet de contrôler tous les aspects de WebSphere. Par exemple, vous pouvez synchroniser des nœuds explicitement et l&#8217;invocation de la méthode (par Jython ou JACL) pour déployer l&#8217;application ne rendra la main que lorsque l&#8217;opération sera réalisée. Le côté négatif est qu&#8217;il est beaucoup plus lent que l&#8217;outil similaire WLST proposé par WebLogic (les nombreuses copies de documents XML à travers SOAP doivent y être pour quelque chose) et les API proposées sont plutôt complexes à manipuler (qui peut donner la différences entre un <code>containment path</code>, un <code>configuration id</code> et un <code>object name</code>?)</p><p>Bien que WAS ne propose pas de mécanismes pour regrouper les différents artéfacts et ressources liés à un même déploiement, sa nature transactionnelle permet de commiter les différents changements de configuration en une fois. Il peut même gérer la configuration des instances des serveurs <a
href="http://www-01.ibm.com/software/webservers/httpservers/" title="IBM HTTP Server" >IBM HTTP Server</a> ou <a
href="http://httpd.apache.org/" title="Apache HTTP Server" >Apache HTTP Server</a> .</p><p>Malgré une vitesse de déploiement lente, rien ne vaut la fiabilité des déploiements de WebSphere !</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Les serveurs d&#8217;application fournissent chacun un niveau de support différent pour prendre en charge les déploiements des applications d&#8217;entreprise. Bien sûr, ils offrent tous le déploiement basique des artéfacts Java EE mais aucun d&#8217;entre eux ne propose de regrouper différents artéfacts en un seul déploiement ou de lier des ressources Java EE à ces artéfacts. WebLogic Server est le seul qui essaye de regrouper des ressources (JMS Modules et SubDeployment). Mais ces abstractions ne couvrent qu&#8217;une petite partie de toute l&#8217;étendue du déploiement Java EE.</p><p>La répétition et la prédiction sont très importantes pour une stratégie de déploiement réussie, ce qui peut expliquer la prévisibilité de WebSphere sur le marché. Et finalement, une bonne API est nécessaire pour automatiser votre processus de déploiement: WebLogic et WebSphere l&#8217;offrent, JBoss a un sérieux manque dans ce domaine (même avec <code>twiddle</code> !)</p><p>Les consultants de <a
href="http://www.xebia.fr/" title="Xebia" >Xebia</a> et l&#8217;ensemble des développeurs chez <a
href="http://www.xebialabs.com/" title="XebiaLabs" >XebiaLabs</a> ont quasiment tous écrit dans leurs expériences passées des tonnes de scripts pour automatiser des déploiements et ont dû batailler sur ces questions encore et encore. Nous avons développé <a
href="http://www.xebialabs.com/deployit-automated-deployment-java-applications" title="Deployit" >Deployit</a> afin de prendre en charge ces différences entre serveurs d&#8217;applications et parce que nous croyons que l&#8217;automatisation des déploiements est de la plus haute importance du fait du nombre croissant de déploiements dans les entreprises.</p><p>&#8211;<br
/> Traduction libre du billet «<a
href="http://blog.xebia.com/2009/11/13/do-application-server-vendors-really-understand-deployment/" title="Do application server vendors really understand deployment? " >Do application server vendors really understand deployment? </a>» publié par Vincent Partington.</p><div
class="shr-publisher-3130"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F11%2F16%2Fles-fournisseurs-de-serveurs-dapplication-ont-ils-vraiment-compris-le-deploiement%2F' data-shr_title='+Les+fournisseurs+de+serveurs+d%27application+ont-ils+vraiment+compris+le+d%C3%A9ploiement+%3F'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F11%2F16%2Fles-fournisseurs-de-serveurs-dapplication-ont-ils-vraiment-compris-le-deploiement%2F' data-shr_title='+Les+fournisseurs+de+serveurs+d%27application+ont-ils+vraiment+compris+le+d%C3%A9ploiement+%3F'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/16/les-fournisseurs-de-serveurs-dapplication-ont-ils-vraiment-compris-le-deploiement/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/</link> <comments>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#comments</comments> <pubDate>Mon, 26 Oct 2009 18:32:17 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[Artifactory]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Grails]]></category> <category><![CDATA[Groovy]]></category> <category><![CDATA[Play!]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[VisualVM]]></category> <category><![CDATA[WADL]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3036</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. SOA SOA Manifesto : pragmatisme utopique ? WADL devient une Submission W3C Le coin de la technique Play! Framework 1.0 Mise à jour de VisualVM en 1.2 Comment concevoir un datacenter, &#8230; par Google Ca bouge dans la communauté Groovy/Grails Votre application web est [...]]]></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>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#SOAManifestopragmatismeutopiqu">SOA Manifesto : pragmatisme utopique ?</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#WADLsurlavoiedelastandardisati">WADL devient une <em>Submission</em> W3C</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#PlayFramework">Play! Framework 1.0</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#MisejourdeVisualVMen">Mise à jour de VisualVM en 1.2</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#Commentconcevoirundatacenterpa">Comment concevoir un datacenter, &#8230; par Google</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#CabougedanslacommunautGroovyGr">Ca bouge dans la communauté Groovy/Grails</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#Votreapplicationwebestellevuln">Votre application web est elle vulnérable ?</a></li><li><a
href="http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/#ArtifactoryvolutionsetmodeSaaS">Artifactory : évolutions et mode SaaS</a></li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="SOAManifestopragmatismeutopiqu"></a>SOA Manifesto : pragmatisme utopique ?</h4><p>La communauté SOA vient de publier son <a
href="http://soa-manifesto.org/" title="SOA Manifesto" >SOA Manifesto</a>. Les valeurs sont très consensuelles, on pourrait même les trouver trop lisses quand on a vécu un naufrage SOA (avec l&#8217;oubli des objectifs métier, sa perfection naïve initiale, ses services faussement partagés qui finalement ne satisfont même pas le premier consommateur et autres ESB passe-plats).</p><p>Saluons tout de même cette initiative. SOA est une réalité. Les projets utopistes sont aujourd&#8217;hui minoritaires face à tous les projets qui intègrent des web services pour interconnecter les applications.<br
/> Le Manifeste SOA en français :<br
/> <strong>Valeur métier</strong> plutôt que stratégie technique,<br
/> <strong>Objectifs stratégiques</strong> plutôt que bénéfices spécifiques à un projet,<br
/> <strong>Interopérabilité intrinsèque</strong> plutôt qu&#8217;intégration propriétaire,<br
/> <strong>Services partagés</strong> plutôt qu&#8217;implémentation spécifique à un besoin particulier,<br
/> <strong>Flexibilité</strong> plutôt qu&#8217;optimisation,<br
/> <strong>Amélioration incrémentale</strong> plutôt que recherche de la perfection initiale.</p><p>Et rassurons-nous, ce n&#8217;est pas un manifesto qui empêchera les zélotes SOA de se déchirer. La guerre SOAP versus REST bat (toujours) son plein <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>Ils parlent du SOA Manifesto : <a
href="http://www.innoq.com/blog/st/2009/10/soa_manifesto.html" title="InfoQ SOA Manifesto" >InfoQ SOA Manifesto</a>, <a
href="http://www.innoq.com/blog/st/2009/10/comments_on_the_soa_manifesto.html" title="Stefan Tilkovs Weblog  Comments on SOA Manifesto" >Stefan Tilkov&#8217;s Weblog : Comments on SOA Manifesto</a>.</p><p>Allez, je retourne à mes web services Contract First avec CXF <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p><h4><a
name="WADLsurlavoiedelastandardisati"></a>WADL devient une <em>Submission</em> W3C</h4><p>Marc Hadley, auteur de la spécification <a
href="http://www.w3.org/Submission/2009/SUBM-wadl-20090831/" title="WADL" >WADL</a> et <em>spec-lead</em> de la JSR-311 (JAX-RS), <a
href="http://weblogs.java.net/blog/mhadley/archive/2009/10/23/wadl-submitted-w3c" title="a annonc" >a annoncé</a> que WADL venait d&#8217;être accepté en tant que <em>Submission</em> W3C.</p><p>Cette spécification portée par Sun a pour but de définir un format XML de description de services REST. Il s&#8217;agit donc d&#8217;un équivalent à WSDL pour REST. Alors que REST-*, porté par JBoss, a récemment <a
href="http://blog.xebia.fr/2009/09/21/revue-de-presse-xebia-127/#LinitiativeRESTfaitdbat" title="relanc le dbat" >relancé le débat</a> sur la tendance récurrente à vouloir intégrer dans REST les fonctionnalités des très controversés WS-*, la soumission de WADL au W3C fait réapparaître la question de l&#8217;intérêt de définir des contrats pour des services REST.</p><p>Joe Gregorio <a
href="http://bitworking.org/news/193/Do-we-need-WADL" title="sopposait vivement" >s&#8217;opposait vivement</a> à l&#8217;initiative WADL il y a deux ans déjà. Il reprochait principalement :</p><ul><li>l&#8217;insuffisance de WADL pour définir élégamment tous les types de services REST</li><li>la fragilité du client qui ne fonctionne plus lorsque le contrat change comme c&#8217;est déjà le cas avec WSDL</li><li>le manque de réalisme de l&#8217;approche WADL2Java qui ne permettrait pas la pleine exploitation de REST. Il préférait donc une approche d&#8217;écriture du client REST manuelle, en se basant sur un socle commun.</li></ul><p>Toutefois, l&#8217;approche &laquo;&nbsp;REST avec un contrat&nbsp;&raquo; est séduisante pour les applications d&#8217;entreprise dont les services sont souvent aussi nombreux que les consommateurs variés.<br
/> C&#8217;est dans cette logique que de nombreux projets lèvent les ambiguïtés de leurs services REST en préférant XSD à JSON. Les URL et paramètres d&#8217;appel restant alors décrits uniquement dans une documentation annexe.</p><p>Par ailleurs, on peut regretter que WADL n&#8217;ait pas mieux adressé que WSDL des problèmes aussi important que le <em>versioning</em> des services alors qu&#8217;un projet comme <a
href="http://incubator.apache.org/thrift/" title="Apache Thrift" >Apache Thrift</a> a su être innovant sur le sujet.</p><p>La soumission de WADL au W3C n&#8217;implique donc pas forcément son succès à venir. La disponibilité en masse d&#8217;outils et de <em>frameworks</em> permettant de gérer ce format pourrait en revanche attirer une partie des adeptes de SOAP.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="PlayFramework"></a>Play! Framework 1.0</h4><p><a
href="http://www.theserverside.com/" title="The Server Side" >The Server Side</a> nous annonce la sortie de <a
href="http://www.playframework.org/" title="Play! Framework" >Play! Framework</a> en version 1.0.</p><p>Play! est un framework web de haute productivité (tout comme <a
href="http://grails.org/" title="Grails" >Grails</a> ou <a
href="http://www.springsource.org/roo" title="Spring Roo" >Spring Roo</a>) qui simplifie la création et le développement d&#8217;applications Web en langage Java. Ce framework <em>full stack</em> inclut tout une batterie de composants tels que Groovy (pour le <em>templating</em>), Apache Mina mais aussi Hibernate. Quant à l&#8217;architecture de vos projets Play!, elle sera de type RESTful.</p><p>Cette <a
href="http://vimeo.com/7087610" title="vido" >vidéo</a> nous donne un bon aperçu du produit, surtout en ce qui concerne le fameux <em>Fix the bug and hit reload !</em> c&#8217;est à dire pas de compilation, de déploiement ou de redémarrage serveur suite à la modification de vos classes Java, juste un rafraîchissement de votre navigateur pour voir vos modifications.</p><p>A noter que l&#8217;équipe travaille déjà sur la version 1.1 et, entre autres, sur le support de <a
href="http://www.scala-lang.org/" title="Scala" >Scala</a></p><p>Pour les liens utiles, la documentation complète du produit se trouve sur cette <a
href="http://www.playframework.org/documentation" title="page" >page</a>. Le téléchargement se passe par <a
href="http://download.playframework.org/" title="ici" >ici</a>. Et, comme le rappelle TSS, n&#8217;oubliez pas la présentation <a
href="http://www.devoxx.com/display/DV09/Play+framework+in+practice" title="Play! framework in practice" >Play! framework in practice</a> à Devoxx, en tous cas nous y serons !</p><h4><a
name="MisejourdeVisualVMen"></a>Mise à jour de VisualVM en 1.2</h4><p>8 mois après la sortie de la version 1.1, l&#8217;équipe nous gratifie d&#8217;une nouvelle version de son outil de monitoring de JVM. Avec un passage de 1.1.1 à 1.2, il ne faut pas s&#8217;attendre à de grandes révolutions. Une liste de <a
href="https://visualvm.dev.java.net/issues/buglist.cgi?Submit+query=Submit+query&#038;issue_type=DEFECT&#038;component=visualvm&#038;resolution=FIXED&#038;target_milestone=1.2&#038;email1=&#038;emailtype1=exact&#038;emailassigned_to1=1&#038;email2=&#038;emailtype2=exact&#038;emailreporter2=1&#038;issueidtype=include&#038;issue_id=&#038;changedin=&#038;votes=&#038;chfield=creation_ts&#038;chfieldfrom=&#038;chfieldto=Now&#038;chfieldvalue=&#038;short_desc=&#038;short_desc_type=fulltext&#038;long_desc=&#038;long_desc_type=fulltext&#038;issue_file_loc=&#038;issue_file_loc_type=fulltext&#038;status_whiteboard=&#038;status_whiteboard_type=fulltext&#038;field0-0-0=noop&#038;type0-0-0=noop&#038;value0-0-0=&#038;cmdtype=doit&#038;order=Reuse+same+sort+as+last+time" title="31 bugs corrigs" >31 bugs corrigés</a>, suivie de quelques nouvelles fonctionnalités notables:</p><ul><li>Un sampling profiler CPU et mémoire</li><li>Support de plusieurs instances de JStatd</li><li>Amélioration de l&#8217;API de génération de graphes</li><li>Sauvegarde d&#8217;un snapshot de l&#8217;application dans un fichier nps pouvant-être utilisé plus tard pour analyse</li></ul><p>Nous vous passons les améliorations de GUI et le support des proxys qui peut toujours s&#8217;avérer utile pour les analyses à distance. La vraie grande nouveauté c&#8217;est le plugin permettant de profiler l&#8217;application par sampling. Il ne faut pas s&#8217;attendre à la précision des outils instrumentant l&#8217;application comme <a
href="http://www.jinspired.com/products/jxinsight/" title="JXInsight" >JXInsight</a>. Cependant, cela permettra une analyse assez poussée sans impact sur les performances.</p><h4><a
name="Commentconcevoirundatacenterpa"></a>Comment concevoir un datacenter, &#8230; par Google</h4><p>Lors de la conférence Ladis 2009 (<b>La</b>rge Scale <b>Di</b>stributed <b>S</b>ystems and Middleware), <a
href="http://research.google.com/people/jeff/index.html" title="Jeff Dean" >Jeff Dean</a>, du groupe infrastructure chez Google, a présenté <a
href="http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf" title="les manires de concevoir un systme distribu" >les manières de concevoir un système distribué</a>.</p><p>Il passe en revue différentes problématiques :</p><ul><li>Infrastructure</li><li>Stockage</li><li>Clustering</li><li>Échange de données sur le réseau</li><li>Communication entre applications</li><li>Construction d&#8217;application sur de telles infrastructures</li></ul><p>Il est intéressant de voir les problématiques posées et les solutions proposées, sur des problématiques que nous avons trop tendance à oublier en tant que développeurs. Citons entre autres :</p><ul><li>Latence réseau : un critère important, car difficile à optimiser</li><li>Bande passante du réseau</li><li>Capacité de stockage (mémoire et disque)</li></ul><p>Il est donc très important même pour un <a
href="http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/" title="dveloppeur davoir ces chiffres en tte" >développeur d&#8217;avoir ces chiffres en tête</a>.</p><p>Par retour d&#8217;expérience, Jeff Dean montre les joies d&#8217;interagir avec du matériel physique. Les applications ne doivent pas supposer que le matériel est infaillible, il y a différentes erreurs que nos applications doivent gérer. Quand on voit les nombres d&#8217;occurrences de ce type de problème et leur nature, leur gestion par l&#8217;application n&#8217;est pas aussi triviale qu&#8217;il y parait :</p><ul><li>Problème DNS</li><li>Plantage de serveur</li><li>Perte de connections</li><li>&#8230;</li></ul><p>Cette présentation est très riche, et elle permet de voir les tenants et aboutissants d&#8217;une bonne infrastructure mais aussi les impacts que cela peut avoir dans nos développements de tous les jours.</p><p>Les contraintes que s&#8217;est imposé Google en terme de disponibilité, dimensionnement, &#8230;  ont amené plusieurs innovations technologiques en terme d&#8217;infrastructure qui ont des impacts sur le développement applicatif :</p><ul><li>Protocol Buffer</li><li>MapReduce</li><li>Google File System</li><li>Big Table</li></ul><p>Les lecteurs intéressés par les innovations mises en place par Google sur ses infrastructures noteront que Gregor Hohpe (auteur de <a
href="http://www.eaipatterns.com/" title="Enterprise Integration Patterns" >Enterprise Integration Patterns</a>) présentera à Devoxx une session <a
href="http://www.devoxx.com/display/DV09/Distributed+Programming+the+Google+Way" title="Distributed Programming the Google Way" >Distributed Programming the Google Way</a>.</p><h4><a
name="CabougedanslacommunautGroovyGr"></a>Ca bouge dans la communauté Groovy/Grails</h4><p>Pour commencer, on peut noter <a
href="http://www.infoq.com/presentations/Web-Development-Grails-Graeme-Rocher" title="la longue prsentation de Grails" >la longue présentation de Grails</a> faite par Graeme Rocher sur InfoQ. Le &laquo;&nbsp;papa&nbsp;&raquo; de Grails revient sur de nombreux points relatifs à ce très bon framework permettant de créer des applications web rapidement en bénéficiant de la puissance de Java, Groovy, Hibernate, Spring&#8230;</p><p>Ensuite, et c&#8217;est la rançon du succès, il y a beaucoup de discussions et d&#8217;interrogations autour des besoins auxquels répondent Groovy et Grails. <a
href="http://blog.peterdelahunty.com/2009/10/grails-iron-man-suit-for-tony-stark.html" title="Sur son blog" >Sur son blog</a>, Peter Delahunty précise par exemple que, pour lui, Grails n&#8217;est l&#8217;arme absolue que si on a une bonne connaissance des technologies sous-jacentes (Spring, Hibernate&#8230;). Il ne faut pas débuter par Grails sans s&#8217;attendre à bloquer sur des problèmes relatifs à ces technologies.</p><p><a
href="http://www.danielhonig.info/index.php?/archives/1-Groovy-and-Grails-Java-Skills-Not-Directly-Relevant.html" title="Cet article" >Cet article</a> va dans le même sens et rappelle qu&#8217;à partir du moment où l&#8217;on parle de &laquo;&nbsp;la magie Groovy&nbsp;&raquo; il faut être conscient que des choses qui n&#8217;ont rien de magique (cela reste du code !) se passent. Les &laquo;&nbsp;dynamic finders&nbsp;&raquo;, le MOP (Meta Object Protocol) et la magie des closures font rêver mais s&#8217;expliquent bel et bien ! Ensuite, il y est noté que la proximité de Groovy et Java fait que de nombreuses personnes pensent que l&#8217;on peut passer de Java à Groovy sans formation particulière. Si l&#8217;on ne comprend pas les principes de ces choses magiques et que l&#8217;on se contente de les accepter comme tels, on s&#8217;expose tôt ou tard à des retours de flamme sévères qui se matérialisent généralement sous la forme de StackTraces incompréhensibles. Enfin, le manque de support professionnel pour Groovy/Grails est évoqué. Sur ce point, je pense que l&#8217;auteur se trompe. On note en effet que Springsource semble fournir un <a
href="http://www.springsource.com/services/enterprisesupport" title="support commercial pour ces technologies" >support commercial pour ces technologies</a>. Mais, il y a peu, Groovy et Grails n&#8217;étaient pas encore dans le giron de Springsource et l&#8217;on devait &laquo;&nbsp;se contenter&nbsp;&raquo; du support de la communauté. Néanmoins, celui-ci a toujours été assez réactif et de bon niveau.</p><p>Toujours concernant Groovy, on peut noter la version Community Edition de l&#8217;IDE IntelliJ, tout récemment publiée, semble <a
href="http://mrhaki.blogspot.com/2009/10/groovy-intentions-in-intellij-idea.html" title="bien lotie" >bien lotie</a> au niveau du support de ce langage. Malheureusement, le support de Grails, lui, n&#8217;est <a
href="http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html" title="pas prsent dans cette version" >pas présent dans cette version</a>.</p><h4><a
name="Votreapplicationwebestellevuln"></a>Votre application web est elle vulnérable ?</h4><p>Le Web Application Security Consortium (WASC) estime que 87% des applications de la toile sont vulnérables. Tout le monde ne peut pas s&#8217;offrir les services d&#8217;un expert en sécurité, et un développeur ne peut pas écrire du code sécurisé s&#8217;il ne connaît ou ne comprends pas les risques auxquels il s&#8217;expose. C&#8217;est pour cette raison que DeveloperWorks revient sur les principales failles de sécurité qui nous guettent, et quelques outils simples pour analyser notre code.<br
/> Les points de faiblesse les plus connus sont :</p><ul><li>le cross site scripting : le pirate injecte, via un autre site (de type forum par exemple), un script (de type javascript) vers le site visé. Ce script lui permet de récupérer des informations de connexion, des cookies&#8230;</li><li>l&#8217;injection de SQL : le pirate saisit du code SQL dans un formulaire web. Celui-ci est poussé jusqu&#8217;à la base, exécuté et donne (le plus souvent) accès à la base &#8216;en direct&#8217; au pirate (l&#8217;un des exemples le plus connus est l&#8217;injection de <em>OR 1=1-</em> dans un formulaire d&#8217;authentification, qui retourne alors toujours TRUE).</li></ul><p>Et <a
href="http://blog.xebia.fr/2009/06/30/jazoon-jour-3-agile-et-securite/" title="lon reparle de lOWASP" >l&#8217;on reparle de l&#8217;OWASP</a>, qui propose un outil open source pour détecter ces erreurs de conception : WebScarab. WebScarab s&#8217;utilise comme un proxy HTTP (qui se place entre votre browser et votre serveur d&#8217;applications, par simple redirection des ports). Ensuite, un simple fichier .txt permet d&#8217;injecter votre site avec quelques-uns des plus célèbres cas de cross site scripting ou d&#8217;injection SQL. Un autre outil open source est présenté, d&#8217;un fonctionnement similaire, Paros Proxy.<br
/> Reste ensuite à détecter les faux positifs, opération généralement manuelle.</p><p>On notera que la section <a
href="http://www.ibm.com/developerworks/web/library/wa-appsecurity/?S_TACT=105AGX01&#038;S_CMP=HP&#038;ca=drs-#resources" title="Ressources" >Ressources</a> de l&#8217;article original est richement fournie, et permet de réellement comprendre les risques auxquels sont exposées les applications accessibles sur internet.</p><p>Saurez-vous trouver les failles du site de test <a
href="http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project" title="Webgoat" >Webgoat</a> ?</p><h4><a
name="ArtifactoryvolutionsetmodeSaaS"></a>Artifactory : évolutions et mode SaaS</h4><p><a
href="http://www.jfrog.org/products.php" title="Artifactory" >Artifactory</a> est un <em>repository</em> Maven dont la principale particularité est de s&#8217;appuyer sur <a
href="http://en.wikipedia.org/wiki/Content_repository_API_for_Java" title="Java Content Repository (JCR)" >Java Content Repository (JCR)</a> pour assurer le stockage des artefacts. Le choix de JCR plutôt qu&#8217;un simple système de fichiers n&#8217;avait pas fait l&#8217;unanimité car il rend les tâches courantes d&#8217;administration plus délicates. En effet, lorsque l&#8217;on veut supprimer, remplacer ou déplacer un ensemble d&#8217;artefacts, l&#8217;action est triviale lorsque le système de fichier est utilisé alors qu&#8217;elle devient plus complexe avec JCR, qui n&#8217;est pas aussi directement manipulable.</p><p>Conscient de ce problème <a
href="http://www.jfrog.org" title="JFrog" >JFrog</a>, l&#8217;éditeur derrière Artifactory, a peu à peu intégré un certain nombre de fonctionnalités permettant d&#8217;effectuer ces tâches courantes d&#8217;administration des artefacts directement depuis l&#8217;interface Web. Ainsi, la dernière version du projet permet même le déplacement d&#8217;artefacts entre plusieurs <em>repository</em>.</p><p>Début septembre, JFrog a également lancé <a
href="http://www.jfrog.org/art-online.php" title="ArtifactoryOnline" >ArtifactoryOnline</a>, un service d&#8217;hébergement de <em>repository</em> Maven Artifactory en mode SaaS (Software as a Service). Ce type d&#8217;offre répond clairement à un besoin puisque la présence d&#8217;un <em>repository</em> Maven est souhaitable pour de nombreux cas d&#8217;utilisation et que cette infrastructure nécessite du temps et du matériel dont ne disposent pas toujours les équipes de taille réduite.</p><p>Par ces innovations, le <em>repository</em> Maven de JFrog saura sûrement séduire les utilisateurs déçus par les solutions concurrentes que sont <a
href="http://nexus.sonatype.org/" title="Nexus" >Nexus</a> et <a
href="http://archiva.apache.org/" title="Archiva" >Archiva</a>.</p><p><em>Article mis à jour le 26/10/2009 à 21h25</em></p><div
class="shr-publisher-3036"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F10%2F26%2Frevue-de-presse-xebia-131%2F' data-shr_title='Revue+de+Presse+Xebia'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F10%2F26%2Frevue-de-presse-xebia-131%2F' data-shr_title='Revue+de+Presse+Xebia'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/10/26/revue-de-presse-xebia-131/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Le déploiement, cas d&#8217;école</title><link>http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole/</link> <comments>http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole/#comments</comments> <pubDate>Tue, 20 Oct 2009 05:25:39 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3016</guid> <description><![CDATA[Vous venez juste de boucler la première version de votre application, packagée par Maven. Vos intégrateurs ont préparé un environnement de recette et vous ont communiqué les informations de connexion à la console d&#8217;administration de votre serveur d&#8217;applications. Vous vous connectez, accédez aux fonctionnalités de déploiement et déployez le fichier EAR. Satisfait, vous démarrez votre [...]]]></description> <content:encoded><![CDATA[<p>Vous venez juste de boucler la première version de votre application, packagée par <a
href="http://maven.apache.org" title="Maven">Maven</a>. Vos intégrateurs ont préparé un environnement de recette et vous ont communiqué les informations de connexion à la console d&#8217;administration de votre serveur d&#8217;applications. Vous vous connectez, accédez aux fonctionnalités de déploiement et déployez le fichier EAR. Satisfait, vous démarrez votre navigateur pour vérifier que l&#8217;application tourne correctement. Mais quand vous essayez de charger la page, vous obtenez l&#8217;erreur DNS <em>&laquo;&nbsp;Host not found&nbsp;&raquo;</em>. C&#8217;est donc le moment d&#8217;appeler un ami &#8211; l&#8217;administrateur de cette obscure infrastructure, qu&#8217;on appellera Michel. Michel est bien sûr très heureux d&#8217;ajouter un enregistrement DNS qui va permettre d&#8217;aller sur le serveur Apache à partir de l&#8217;URL www.app-in-dev.com. <em>&laquo;&nbsp;Quoi ! Un serveur Apache ?&nbsp;&raquo;</em> vous exclamez vous, <em>&laquo;&nbsp;Mais ça devrait pointer vers notre serveur d&#8217;applications, pas du tout vers un quelconque serveur HTTP !&nbsp;&raquo;</em>.</p><p>Michel, qui a l&#8217;habitude de ce genre d&#8217;exclamation vis-à-vis de l&#8217;organisation des réseaux d&#8217;entreprise, explique calmement que toutes les requêtes partant d&#8217;un navigateur doivent d&#8217;abord passer par un serveur HTTP avant d&#8217;être redirigées vers le serveur d&#8217;applications. <em>&laquo;&nbsp;Il est donc aussi nécessaire de configurer Apache !&nbsp;&raquo;</em>, dit-il. <em>&laquo;&nbsp;Mais je développe une application Java, j&#8217;ai juste besoin de déployer sur un serveur d&#8217;applications et hop, terminé !&nbsp;&raquo;</em> répondez vous. Et Michel d&#8217;expliquer sur un ton très sérieux : <em>&laquo;&nbsp;Écoute fiston, appuyer sur le bouton de déploiement de ta console d&#8217;administration est juste une petite étape parmi toutes celles qui permettent de réaliser un vrai déploiement.&nbsp;&raquo;</em></p><h3><a
name="Rendrelapplicationaccessiblelu"></a>Rendre l&#8217;application accessible à l&#8217;utilisateur final</h3><p>Avant de parler des différentes étapes du déploiement, il est important de comprendre quel est l&#8217;objectif d&#8217;un déploiement. De façon élémentaire, le but d&#8217;un déploiement est de &laquo;&nbsp;rendre une application, dans une version donnée, disponible pour les utilisateurs finaux&nbsp;&raquo;. En d&#8217;autres termes, l&#8217;utilisateur ouvre son navigateur, tape www.app.com et voit l&#8217;application fonctionner.</p><p>Alors, que faut-il faire pour qu&#8217;une application fonctionne? Pour comprendre les composantes du déploiement, le plus simple est de suivre la requête depuis le navigateur de l&#8217;utilisateur à travers tous les composants matériels et logiciels par lesquels elle transite.<br
/> <em>&laquo;&nbsp;La destination de la requête est tout d&#8217;abord résolue en s&#8217;adressant à un serveur DNS (ou à un mécanisme équivalent). La requête est alors routée vers sa destination ; elle est filtrée par un premier firewall, arrive sur le serveur HTTP chargé de la répartition de charge, traverse un nouveau firewall, atteint le serveur d&#8217;applications puis enfin l&#8217;application à proprement parler, exécutée sur le serveur, qui elle-même interroge une base de données pour récupérer les informations demandées par l&#8217;utilisateur.&nbsp;&raquo;</em><br
/> Sur cet exemple simple, il y a au moins 5 composants en action pour rendre disponible l&#8217;application ; nous devons non seulement configurer ces 5 composants mais aussi y placer certaines données et s&#8217;assurer au besoin qu&#8217;ils (re-)démarrent dans un ordre correct.</p><p>Voici typiquement les étapes nécessaires au premier déploiement d&#8217;une telle application sur un environnement de production :</p><ul><li>(a) Exécuter les ordres SQL de création de tables sur la base de données</li><li>(b) Configurer la source de données JDBC dans le serveur d&#8217;applications</li><li>(c) Configurer les ports HTTP et les Virtual Hosts dans le serveur d&#8217;applications pour que l&#8217;application soit accessible par les requêtes HTTP</li><li>(d) Installer l&#8217;application sur le serveur d&#8217;applications</li><li>(e) Démarrer l&#8217;application</li><li>(f) Configurer le firewall, en ouvrant les ports utiles à la communication entre le serveur HTTP et le serveur d&#8217;applications</li><li>(g) Configurer le serveur HTTP, pour router vers le serveur d&#8217;applications les requêtes arrivant sur www.app.com et qui ne se terminent pas, par exemple, par .js, .html, .jpg</li><li>(h) Déposer le contenu HTML statique (fichiers js, fichiers css, images, etc.) sur le serveur HTTP</li><li>(i) (re-)Démarrer le serveur HTTP pour prendre en compte la nouvelle configuration</li><li>(j) Configurer le firewall externe, pour permettre les accès de www.app.com vers le bon serveur HTTP</li></ul><p>Bien sûr, dans un environnement plus complexe, on ajoute quelques étapes à la liste. Par exemple, dans un environnement clusterisé avec haute disponibilité, tout doit être fait au moins deux fois. Pour les déploiements de versions ultérieures de la même application, certaines étapes pourront de surcroît être négligées.</p><h3><a
name="Destchesnombreusesetvaries"></a>Des tâches nombreuses et variées</h3><p>Les étapes décrites dans la section précédentes permettent de &laquo;&nbsp;mettre à disposition des utilisateurs&nbsp;&raquo; une application à l&#8217;architecture élémentaire. D&#8217;une façon plus générale, on peut distinguer plusieurs grandes catégories d&#8217;opérations à réaliser pour finaliser un déploiement :</p><ul><li><em>Installer l&#8217;application (Étape d)</em><br
/> C&#8217;est la partie principale du déploiement, où la logique métier est installée sur le serveur, le plus souvent sous la forme d&#8217;un fichier EAR ou WAR.</li><li><em>Configurer les ressources externes (Étape b)</em><br
/> L&#8217;application peut avoir besoin d&#8217;interagir avec d&#8217;autres systèmes, comme une base de données, un mainframe ou un middleware de message. Les ressources externes sont le plus souvent utilisées par l&#8217;application pour obtenir ou diffuser des données. L&#8217;accès à ces ressources est généralement configuré au niveau du serveur d&#8217;applications.</li><li><em>Configurer les composants intermédiaires (Étape a, c, f, g, h, j)</em><br
/> Ce sont les composants qui permettent d&#8217;atteindre l&#8217;application, et de l&#8217;exécuter (par exemple, un cluster de serveurs d&#8217;applications, des instances de serveurs HTTP, des firewalls, etc.).</li><li><em>Démarrer/Arrêter les composants (Étape e, i)</em><br
/> Pour s&#8217;assurer que chaque composant fonctionne correctement, il peut être nécessaire de le (re-)démarrer.</li><li>Et respecter l&#8217;ordre dans les points précédents</li><p> Pour être sûr que l&#8217;application démarre correctement, sans erreurs, un certain ordre doit être maintenu. Exemple : Si vous installez l&#8217;application (Étape d) et la démarrez avant d&#8217;avoir configuré la source de données (Étape b), l&#8217;application risque de ne pas se lancer correctement. Ceci devient encore plus important lorsque vous déployez une nouvelle version de votre application dans un environnement clusterisé.</li></ul><p>Il y a une catégorie supplémentaire pour les organisations qui valident leurs applications successivement sur plusieurs environnements (Développement, Test, Intégration, Production) :</p><ul><li><em>Configurer l&#8217;application installée sur des environnements différents</em><br
/> Un déploiement doit assurer la configuration spécifique à l&#8217;environnement. Exemple : Quand vous installez une application sur l&#8217;environnement de développement, il faut récupérer les données de la base de développement. De la même façon, pour l&#8217;environnement de tests, il est nécessaire d&#8217;avoir les données de tests et ainsi de suite.</li></ul><h3><a
name="LEARlapartiemergedeliceberg"></a>L&#8217;EAR, la partie émergée de l&#8217;iceberg</h3><p>Beaucoup pensent qu&#8217;installer un EAR sur un serveur d&#8217;applications  équivaut à déployer l&#8217;application. Bien sûr, le bouton dans la console d&#8217;administration indique : <em>&laquo;&nbsp;Déployer l&#8217;application&nbsp;&raquo;</em>, mais il ne s&#8217;agit que de la partie concernant le serveur d&#8217;applications à proprement parler ; cette vision étroite du déploiement n&#8217;est généralement opérationnelle que sur un environnement simplifié, comme celui de développement ou sur le poste de travail du développeur. Dès qu&#8217;une application doit être installée sur un environnement plus complexe, cette vision ne suffit plus et il devient nécessaire de réaliser un grand nombre d&#8217;opérations complémentaires pour véritablement &laquo;&nbsp;mettre l&#8217;application à disposition des utilisateurs&nbsp;&raquo;.</p><p><strong>Parce que de ce point de vue le déploiement n&#8217;est pas une opération triviale, beaucoup cherchent à l&#8217;automatiser</strong>.<br
/> Exécuter manuellement toutes les étapes est en effet à la fois complexe et risqué, particulièrement sur les environnements les plus critiques. Et ce, d&#8217;autant plus que, souvent, les responsabilités et les gouvernances de chaque module de l&#8217;infrastructure reposent entre les mains de personnes, d&#8217;équipes, voire de départements différents.<br
/> Malheureusement, cet effort d&#8217;automatisation aboutit souvent à un ou plusieurs jeux de scripts à la gouvernance floue et dont le coût de maintenance semble souvent prohibitif. Les solutions du marché n&#8217;abordent souvent qu&#8217;un sous-ensemble de la problématique (on pense à Phurnace ou BuildForge, qui restent concentrés sur le serveur d&#8217;applications, ou à d&#8217;autres solutions qui sont souvent de simples ordonnanceurs de scripts).<br
/> Avec les serveurs d&#8217;intégration continue, on peut mettre en œuvre des déploiements automatiques, qui permettent de tester la chaîne complète de la compilation jusqu&#8217;aux tests de charge (<a
href="http://www.anthillpro.com/blogs/anthillpro-blog/2009/07/29/build_pipelines_and_build_lifecycles.html" title="cf. Build Pipelines" >cf. Build Pipelines</a>). Et si l&#8217;on veut aller encore plus loin, c&#8217;est-à-dire déployer automatiquement sur l&#8217;environnement de production, on peut se pencher sur le logiciel <a
href=" http://www.xebialabs.com/fr/deployit-automated-deployment-java-applications" title="DeployIt" >DeployIt</a>, développé par mes collègues Hollandais.</p><p>Je parlerai, plus en détail, dans un prochain article du déploiement automatique et nous pourrons déterminer par nous-même si c&#8217;est une solution &laquo;&nbsp;Insane&nbsp;&raquo; comme le pense le livre blanc <a
href="http://www.anthillpro.com/html/resources/white-papers" title="Enterprise CI Maturity Model de la société anthillpro" >Enterprise CI Maturity Model de la société anthillpro</a> ou une solution réelle pour améliorer la fiabilité comme le pense <a
href="http://www.xebialabs.com/fr/content/benefits" title="DeployIt" >DeployIt</a>.</p><hr
/> <em>Traduction libre du billet &laquo;&nbsp;<a
href="http://blog.xebia.com/2009/07/08/so-what-is-a-deployment-really/" title="So what is a deployment really?" >So what is a deployment really?</a>&nbsp;&raquo; publié par Robert van Loghem.</em></p><div
class="shr-publisher-3016"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F10%2F20%2Fle-deploiement-cas-decole%2F' data-shr_title='Le+d%C3%A9ploiement%2C+cas+d%27%C3%A9cole'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F10%2F20%2Fle-deploiement-cas-decole%2F' data-shr_title='Le+d%C3%A9ploiement%2C+cas+d%27%C3%A9cole'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/10/20/le-deploiement-cas-decole/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>CITCON Paris 2009</title><link>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/</link> <comments>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/#comments</comments> <pubDate>Mon, 21 Sep 2009 11:34:26 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[citcon]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[git]]></category> <category><![CDATA[intégration continue]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[release]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2865</guid> <description><![CDATA[Le CITCON (prononcé &#171;&#160;KITCON&#160;&#187;) a eu lieu vendredi et samedi dernier à Paris, pour la session européenne 2009. Vendredi soir, après les présentations d&#8217;usage, l&#8217;open space a commencé par le remplissage du tableau des sessions par les fameux post-it. Pour rappel, les participants écrivent un thème sur un post-it et le collent n&#8217;importe où sur [...]]]></description> <content:encoded><![CDATA[<p>Le <a
href="http://citconf.com/" title="CITCON" >CITCON</a> (prononcé &laquo;&nbsp;KITCON&nbsp;&raquo;) a eu lieu vendredi et samedi dernier à Paris, pour la session européenne 2009.  Vendredi soir, après les présentations d&#8217;usage, l&#8217;open space a commencé par le remplissage du tableau des sessions par les fameux post-it. Pour rappel, les participants écrivent un thème sur un post-it et le collent n&#8217;importe où sur le tableau. C&#8217;est autour d&#8217;un verre, et entre deux discussions, qu&#8217;on vote et place les post-it dans les cases proposées pour chaque session.</p><p>Samedi matin, j&#8217;ai assisté à la session sur <strong>la gestion de source dans un environnement distribué</strong>. Après une mise au point sur la différence entre gestion de configuration et gestion de source, nous avons entamé la discussion sur l&#8217;outil très utilisé dans le développement Open Source dénommé <a
href="http://fr.wikipedia.org/wiki/Git" title="GIT" >GIT</a>.  Cet outil fonctionne en mode décentralisé : il n&#8217;y a pas un unique serveur de sources, mais chaque développeur fonctionne à la fois en mode serveur et en mode client. Le développeur peut, par exemple, versionner très souvent ses sources sur son serveur local, mais décider de ne valider ses changements qu&#8217;en une seule fois sur le serveur de référence (il peut même signer sa validation !).<br
/> Le cas d&#8217;un projet partagé entre la France et l&#8217;Australie m&#8217;a particulièrement intéressé. Le responsable avait mis en place un serveur intermédiaire GIT sur chaque site pour éviter les échanges réseau trop nombreux avec un serveur central. Une synchronisation régulière permettait aux deux sites d&#8217;être à jour. Il s&#8217;était rendu compte au bout d&#8217;un certain temps que cela était en réalité inutile, car la qualité du réseau faisait qu&#8217;on pouvait se permettre de n&#8217;avoir qu&#8217;un seul serveur. En revanche, si cela est peut-être vrai pour l&#8217;Australie, ce ne l&#8217;est pas forcément pour tous les pays.<br
/> Avec GIT, chaque copie du repository est une nouvelle branche ; un développeur en local, c&#8217;est une branche. Le fonctionnement des branches est un vrai casse-tête pour des outils comme Subversion, et cette approche propose finalement un peu de simplicité. Mais pour le moment, les serveurs d&#8217;Intégration Continue ne font pas la différence entre modes centralisé et décentralisé. Rien n&#8217;est proposé aujourd&#8217;hui pour mieux profiter d&#8217;un monde distribué&#8230;</p><p>Après un ravitaillement en café et jus d&#8217;orange, j&#8217;ai suivi Vincent Massol, de XWiki pour savoir <strong>comment améliorer notre façon de faire une release avec Maven</strong>. Arnaud Heritier faisait parti de la session et après une présentation du <a
href="http://dev.xwiki.org/xwiki/bin/view/Community/ReleaseProcess" title="processus" >processus</a> pour XWiki, ils ont démarré le codage d&#8217;une extension au <a
href="http://maven.apache.org/plugins/maven-dependency-plugin/" title="plugin dependency" >plugin dependency</a>. L&#8217;objectif était d&#8217;ajouter un goal pour récupérer les différences entre les versions des dépendances entre deux releases. Il faudra être attentif aux prochaines sorties de ce plugin, il y aura peut-être une nouvelle fonction.<br
/> Le constat, finalement, était qu&#8217;il y avait encore beaucoup d&#8217;étapes manuelles lors de la release d&#8217;une version et qu&#8217;à part développer ses propres MOJOs, Maven était assez loin du compte. Mais ça avance comme le montre le plugin <a
href="http://mojo.codehaus.org/versions-maven-plugin/" title="versions" >versions</a>, dont Arnaud Heritier nous a vanté les mérites.</p><p>L&#8217;après-midi, trois sessions nous attendaient mais je souhaite ne parler que de la dernière sur <strong>la configuration et le déploiement</strong>, les autres étant déjà traitées sur différents <a
href="http://citconf.com/wiki/index.php?title=OnTheWeb#CITCON_Europe_2009_Paris_France" title="blogs" >blogs</a>. Un problème récurrent se pose sur chaque projet, celui de la modification des valeurs selon l&#8217;environnement sur lequel on déploie. On utilise, par exemple, des fichiers de propriétés qui sont remplacés au moment du packaging. Si on s&#8217;est trompé dans les propriétés ou si la valeur n&#8217;est connue que de la personne qui déploie, il faut dézipper le fichier, changer la valeur et refaire le package. Bonjour la galère !<br
/> Deux ingénieurs de <a
href="http://opensource.thoughtworks.com" title="ThoughtWorks" >ThoughtWorks</a> nous ont présenté leur petit dernier : <a
href="http://code.google.com/p/escservesconfig" title="Escape" >Escape</a>. Sous ce nom très commun se cache une application Java dans laquelle on peut sauvegarder les valeurs des propriétés de chaque application dans un environnement donné. Ces valeurs peuvent être cryptées. Pour y accéder, une simple interface REST permet d&#8217;interroger la base et de récupérer la valeur : l&#8217;url http://mymachine:8080/environnements/dev/citcon/city, par exemple, renvoie la valeur de city pour l&#8217;environnement de dev sur l&#8217;application citcon. Je trouve ce projet simple et efficace pour améliorer la gestion des propriétés de nos applications. La mise en œuvre demandera un peu d&#8217;effort pour disposer d&#8217;un serveur central mais cela en vaut certainement la peine pour s&#8217;affranchir de cette partie de la configuration.</p><p>La conférence s&#8217;est terminée par un tour des participants sur leur &laquo;&nbsp;AA moment&nbsp;&raquo; (ie. ce qu&#8217;ils ont préférés!) et une distribution de livres sur l&#8217;intégration continue.<br
/> J&#8217;en ai gagné un, écrit par Paul M. Duvall, qui était juste à côté de moi, et me l&#8217;a dédicacé. Et c&#8217;est aussi ce qui rendait cette journée franchement sympathique et réussie; mon &laquo;&nbsp;AA moment&nbsp;&raquo; a été de mettre enfin un visage sur des auteurs de blogs ou des contributeurs open source, et surtout pouvoir converser <em>de visu</em>.</p><div
class="shr-publisher-2865"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F09%2F21%2Fcitcon-paris-2009%2F' data-shr_title='CITCON+Paris+2009'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F09%2F21%2Fcitcon-paris-2009%2F' data-shr_title='CITCON+Paris+2009'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/21/citcon-paris-2009/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Séminaire déploiements Java/J2EE le 8 Octobre</title><link>http://blog.xebia.fr/2009/09/11/seminaire-deploiements-javaj2ee-le-8-octobre/</link> <comments>http://blog.xebia.fr/2009/09/11/seminaire-deploiements-javaj2ee-le-8-octobre/#comments</comments> <pubDate>Fri, 11 Sep 2009 08:01:43 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[ADDM]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2831</guid> <description><![CDATA[A l&#8217;Atelier BNP PARIBAS, Xebia présentera sa solution de déploiement automatique DeployIT commercialisée par sa filiale XebiaLabs. Intervenants : M. Guillaume Bodet, Directeur Technique, Xebia Informations utiles : Adresse : L&#8217;Atelier &#8211; 14, Rue Bergère &#8211; 75009 Paris Date : Jeudi 8 Octobre 2009 à 9h00 Durée : 2H00 Inscription: http://www.atelier.fr/inscriptionEvenement.php?artid=38668]]></description> <content:encoded><![CDATA[<p>A l&#8217;<a
href="http://www.atelier.fr/applications-it/2/07092009/xebia-labs-38668-.html">Atelier BNP PARIBAS</a>, Xebia présentera sa solution de déploiement automatique <strong>DeployIT</strong> commercialisée par sa filiale <a
href="http://www.xebialabs.com">XebiaLabs</a>.</p><p><strong>Intervenants :</strong></p><ul><li>M. Guillaume Bodet, Directeur Technique, <a
href="http://www.xebia.fr">Xebia</a></li></ul><p><strong>Informations utiles :</strong></p><ul><li>Adresse : L&#8217;Atelier &#8211; 14, Rue Bergère &#8211; 75009 Paris</li><li>Date : <strong>Jeudi 8 Octobre</strong> 2009 à 9h00</li><li>Durée : 2H00</li><li>Inscription:<a
href="http://www.atelier.fr/inscriptionEvenement.php?artid=38668"> http://www.atelier.fr/inscriptionEvenement.php?artid=38668</a></li></ul><div
class="shr-publisher-2831"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F09%2F11%2Fseminaire-deploiements-javaj2ee-le-8-octobre%2F' data-shr_title='S%C3%A9minaire+d%C3%A9ploiements+Java%2FJ2EE+le+8+Octobre'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F09%2F11%2Fseminaire-deploiements-javaj2ee-le-8-octobre%2F' data-shr_title='S%C3%A9minaire+d%C3%A9ploiements+Java%2FJ2EE+le+8+Octobre'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/11/seminaire-deploiements-javaj2ee-le-8-octobre/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Création de Xebia Labs</title><link>http://blog.xebia.fr/2009/08/25/creation-de-xebia-labs/</link> <comments>http://blog.xebia.fr/2009/08/25/creation-de-xebia-labs/#comments</comments> <pubDate>Tue, 25 Aug 2009 07:44:33 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[DeployIt]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Xebia]]></category> <category><![CDATA[Xebia Labs]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2692</guid> <description><![CDATA[Le groupe Xebia a créé en Juin 2009, Xebia Labs une société de droit néerlandais dont les actionnaires sont Xebia NL, Coert Baart, Vincent Partington et Luc Legardeur. Erreurs humaines, interventions &#171;&#160;pompier&#160;&#187;, manque de prédictibilité, complexité des guides et procédures de mise en production, manque d&#8217;évolutivité des scripts, frictions entre les départements Etudes et Production, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2009/08/labs.png" alt="Xebia Labs" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Le groupe Xebia a créé en Juin 2009, <a
href="http://www.xebialabs.com">Xebia Labs</a> une société de droit néerlandais dont les actionnaires sont Xebia NL, Coert Baart, Vincent Partington et Luc Legardeur.</p><p><strong>Erreurs humaines</strong>, <strong>interventions &laquo;&nbsp;pompier&nbsp;&raquo;</strong>, <strong>manque de prédictibilité</strong>, <strong>complexité des guides et procédures de mise en production</strong>, <strong>manque d&#8217;évolutivité des scripts</strong>, <strong>frictions entre les départements Etudes et Production</strong>, <strong>mises à jour des middleware et des applicatifs coûteuses</strong> sont autant de maux que rencontrent les utilisateurs des technologies Java/J2EE.</p><p>Fort de nos  8 ans d&#8217;expérience dans la conception, la mise en place et la gestion d&#8217;applications et d&#8217;infrastructures basées sur Java/J2EE chez plus de 200 clients en Europe, Xebia a créé <a
href="http://www.xebialabs.com/deployit-automated-deployment-java-applications">DeployIT</a>, une offre logicielle, exclusivement dédiée aux déploiements Java/J2EE.</p><p><a
href="http://www.xebialabs.com/deployit-automated-deployment-java-applications">DeployIT</a> permet de sécuriser et de réduire les coûts des déploiements des applications et des infrastructures Java/J2EE, jugés de plus en plus périlleux, coûteux et aléatoires.</p><p><a
href="http://www.xebialabs.com">Xebia Labs</a> propose donc une plateforme logicielle incluant les spécificités des applications et infrastructures Java/J2EE, adossée à  une approche méthodologique éprouvée, offrant les avantages suivants :</p><ul><li><strong>Réduction des risques</strong> d&#8217;échecs des déploiements liés aux trop nombreuses  interventions humaines.</li><li><strong>Réduction des coûts</strong> liés au développement et à la maintenance de scripts coûteux et hétérogènes.</li><li><strong>Suppression des interventions &laquo;&nbsp;pompier&nbsp;&raquo;</strong> des équipes de développement pour aider les cellules d&#8217;exploitation à mettre en production.</li><li><strong>Réduction du Time to Market</strong> des nouvelles applications ainsi que de leurs évolutions fonctionnelles.</li><li><strong>Standardisation</strong> autour d&#8217;un outil commun des départements Etudes et Production.</li><li><strong>Garantie des SLA</strong> par une professionnalisation de la filière de déploiement.</li></ul><p>Pour avoir plus d&#8217;informations sur cette solution, n&#8217;hésitez pas à contacter Luc Legardeur au 01 42 91 27 93 ou par mail : <a
href="mailto:llegardeur@xebia.fr">llegardeur@xebia.fr</a>.</p><div
class="shr-publisher-2692"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F08%2F25%2Fcreation-de-xebia-labs%2F' data-shr_title='Cr%C3%A9ation+de+Xebia+Labs'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F08%2F25%2Fcreation-de-xebia-labs%2F' data-shr_title='Cr%C3%A9ation+de+Xebia+Labs'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/08/25/creation-de-xebia-labs/feed/</wfw:commentRss> <slash:comments>0</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><div
class="shr-publisher-1914"></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div
class='shareaholic-like-buttonset' style='float:none;height:30px;'><a
class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F05%2F05%2Ftomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for%2F' data-shr_title='Tomcat+%3A+Adresse+IP+de+l%27internaute%2C+load+balancer%2C+reverse+proxy+et+header+Http+X-Forwarded-For'></a><a
class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fblog.xebia.fr%2F2009%2F05%2F05%2Ftomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for%2F' data-shr_title='Tomcat+%3A+Adresse+IP+de+l%27internaute%2C+load+balancer%2C+reverse+proxy+et+header+Http+X-Forwarded-For'></a></div><div
style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div>]]></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> </channel> </rss>
