<?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/tag/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>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> ]]></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> ]]></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>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> ]]></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>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> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/04/just-deployit/feed/</wfw:commentRss> <slash:comments>4</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> ]]></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>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> ]]></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>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> ]]></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> ]]></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> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/feed/</wfw:commentRss> <slash:comments>41</slash:comments> </item> <item><title>Refactorisation de bases de données avec Liquibase</title><link>http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase/</link> <comments>http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase/#comments</comments> <pubDate>Wed, 03 Dec 2008 15:55:59 +0000</pubDate> <dc:creator>Emmanuel Servent</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[bases de données]]></category> <category><![CDATA[database]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[liquibase]]></category> <category><![CDATA[refactoring]]></category> <category><![CDATA[refactorisation]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1102</guid> <description><![CDATA[Gérer les modifications d&#8217;une base de données est toujours une affaire délicate, que ce soit lors du développement d&#8217;une application, pendant le déroulement des tests unitaires et même lors du déploiement en production. On observe un grand nombre de difficultés, en particulier dans les projets Agile, où les changements sur le modèle de données sont [...]]]></description> <content:encoded><![CDATA[<p>Gérer les modifications d&#8217;une base de données est toujours une affaire délicate, que ce soit lors du développement d&#8217;une application, pendant le déroulement des tests unitaires et même lors du déploiement en production.<br
/> On observe un grand nombre de difficultés, en particulier dans les projets Agile, où les changements sur le modèle de données sont fréquents.<br
/> A l&#8217;heure actuelle, peu d&#8217;outils sont disponibles sur le marché et on pense rarement à les mettre en place sur nos projets. On passe par des solutions « maisons » avec toutes les difficultés que cela peut engendrer.</p><p>Tout d&#8217;abord, nous ferons un point sur <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase#Problmespossparlagestiondesbas" title="les problèmes posés par la gestion des bases de données" >les problèmes posés par la gestion des bases de données</a>, puis nous verrons comment <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase#Refactorisationdebasesdedonnes" title="Liquibase, outils de refactorisation" >Liquibase, outils de refactorisation</a>, peut nous aider à les surmonter.<br
/> Nous continuerons par la description de <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase#Caractristiquesetfonctionnalit" title="ses caractéristiques et fonctionnalités principales" >ses caractéristiques et fonctionnalités principales</a> et par <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase#LancementdeLiquibase" title="les différents moyens de l'exécuter" >les différents moyens de l&#8217;exécuter</a>.<br
/> <a
href="http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase#Petitexercicepoursefamiliarise" title="Un petit exercice" >Un petit exercice</a> pour se familiariser avec cet outil viendra conclure ce billet.</p><h3><a
name="Problmespossparlagestiondesbas"></a>Problèmes posés par la gestion des bases de données</h3><p>Lorsqu&#8217;un projet démarre, on se demande souvent si l&#8217;on doit installer <strong>une base de données par développeur ou une base commune pour tous</strong>.<br
/> Sur des projets de taille réduite, une base peut suffire et une personne est désignée pour centraliser les changements et éviter ainsi des problèmes de redondance, d&#8217;incohérence, etc. Mais dans ce cas-là, dès qu&#8217;un changement est effectué, tout le monde doit impérativement mettre à jour le modèle objet sinon il court le risque de ne plus pouvoir lancer l&#8217;application. Par ailleurs, les jeux de tests de chaque développeur peuvent &laquo;&nbsp;se télescoper&nbsp;&raquo; ce qui peut faire perdre beaucoup de temps.<br
/> Sur des projets plus importants, il est préférable d&#8217;avoir une base par développeur, ce qui cause d&#8217;autres difficultés, telles que les répercutions des changements d&#8217;un développeur à l&#8217;autre ou encore une intégration plus laborieuse.<br
/> Se pose aussi la question suivante : <strong>comment va-t-on tracer les changements successifs ?</strong> Le plus courant reste d&#8217;écrire un fichier d&#8217;update SQL mais ce n&#8217;est pas fait systématiquement pendant les développements et ça manque de structure (au sens XML) et ça pas de signification propre. Par exemple, rien ne permet rapidement de différencier dans un script, le code qui applique les changements de celui qui les rollback (à part les commentaires !); ou les actions comme &laquo;&nbsp;Renommer&nbsp;&raquo; se traduisent par un DROP COLUMN / ADD COLUMN, ce qui fait perdre le sens de l&#8217;action.<br
/> Cette dernière question amène à s&#8217;en poser d&#8217;autres :</p><ul><li>comment versionner les changements effectués sur une base de données ?</li><li>comment appliquer les changements ? Entre développeurs, mais aussi lorsqu&#8217;on passe en intégration, puis en recette, etc. Pour le moment, cette étape prend du temps, que ce soit en amont si on décide de packager correctement les changements, ou en aval lorsqu&#8217;il s&#8217;agit de dérouler les scripts.</li></ul><p>Voilà en quelques phrases les multiples difficultés rencontrées lorsqu&#8217;on souhaite refactoriser une base de données.<br
/> Regardons à présent ce qu&#8217;un outil comme Liquibase peut faire pour nous accompagner dans ce travail délicat.</p><h3><a
name="Refactorisationdebasesdedonnes"></a>Refactorisation de bases de données avec Liquibase</h3><p>Liquibase est un outil qui peut s&#8217;intégrer dans un projet (Ant, Maven, etc.) ou se lancer <em>en mode standalone</em> directement en ligne de commande (jar).<br
/> Son objectif est de faciliter les modifications apportées à une base de données. Il est particulièrement pratique dans des projets ayant adoptés une méthodologie Agile, car les changements sont nombreux, fréquents et importants.<br
/> Le développeur enregistre dans un fichier XML (changelogs.xml), les différentes refactorisations qu&#8217;il souhaite effectuer (création d&#8217;une nouvelle table, renommage d&#8217;un champ, insertion de données, etc.). Ensuite, il suffit de lancer Liquibase en lui donnant les paramètres de connexion à la base de données et le fichier changelogs.xml. Liquibase applique ces modifications et les trace dans une table.<br
/> Les fichiers changelogs.xml sont versionnés dans le gestionnaire de sources, et sont considérés comme n&#8217;importe quelle autre ressource du projet. La base de données est alors complètement intégrée au cycle de développement.</p><p>Après cette brève présentation de Liquibase, intéressons-nous aux caractéristiques principales de cet outil.</p><h3><a
name="Caractristiquesetfonctionnalit"></a>Caractéristiques et fonctionnalités principales</h3><p>Liquibase est Open Source diffusé sous licence LGPL. Ce projet Open Source est actif, la dernière version (1.8.1) est sortie en octobre 2008 et sa road map montre qu&#8217;il veut aller encore plus loin. Il supporte un grand nombre de bases de données (> 10) et propose plus de 30 refactorisations possibles. Et pour certaines, il sait même faire un roll back (Ex: renommer une colonne).<br
/> Les changements peuvent être regroupés dans un changeset, ce qui permet de conserver un sens et une cohérence aux modifications.<br
/> On peut également n&#8217;exécuter des changements que sous certaines conditions, ou selon un certain profil d&#8217;exécution (utile pour les jeux de tests par exemple).</p><p>On peut noter également que Liquibase n&#8217;est pas juste &laquo;&nbsp;braqué&nbsp;&raquo; vers la refactorisation de la base de données, il offre d&#8217;autres fonctionnalit</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/12/03/refactorisation-de-bases-de-donnees-avec-liquibase/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Ce que vous avez peut-être raté au troisième trimestre 2008</title><link>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/</link> <comments>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/#comments</comments> <pubDate>Wed, 01 Oct 2008 06:51:57 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[log]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Supervision]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=773</guid> <description><![CDATA[Voici la liste des billets les plus lus sur ce blog en juillet, août et septembre : Les 10 commandements des logs applicatives Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité : durant le développement, afin de suivre l&#8217;exécution pas à pas et de [...]]]></description> <content:encoded><![CDATA[<p>Voici la liste des billets les plus lus sur ce blog en juillet, août et septembre :</p><h4><a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/">Les 10 commandements des logs applicatives</a></h4><p>Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité :</p><ul><li>durant le développement, afin de suivre l&#8217;exécution pas à pas et de détecter d&#8217;éventuelles anomalies.</li><li>durant la recette, afin de corréler anomalies fonctionnelles et exécution du programme.</li><li>durant l&#8217;exploitation, afin de surveiller la &laquo;&nbsp;bonne santé&nbsp;&raquo; de l&#8217;application.</li></ul><p>Mais obtenir des traces de qualité n&#8217;est pas un exercice trivial. C&#8217;est pourquoi nous vous proposons nos 10 commandements des logs.</p><p><a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/">Simplifiez votre configuration Spring 2.5 avec les annotations</a></h4><p>Spring 2.5 <a
href="http://www.springframework.org/node/561" title="est sorti" >est sorti</a> depuis le 19 novembre 2007 comme nous l&#8217;annoncions, il y a quelques temps, dans notre <a
href="http://blog.xebia.fr/2007/11/26/revue-de-presse-xebia-33/#Spring" title="revue de presse" >revue de presse</a>. Vous avez comme moi sagement mis à jour vos poms Maven2 vers la dernière release de Spring (normalement et la plupart du temps compatible avec les versions 2.0.x).</p><p>Mais avez-vous vraiment profité des nouveautés de cette version en terme de configuration ?</p><p><a
href="http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/">Programmation concurrente : notions fondamentales</a></h4><p>Jouer avec les Threads n&#8217;est pas trivial. En informatique de gestion, cette difficulté est heureusement masquée par les serveurs d&#8217;application et les API spécifiques. La plupart du temps, ils permettent aux développeurs de s&#8217;abstraire de ces contraintes et de se concentrer sur le code métier, moins technique. Il arrive pourtant qu&#8217;il faille se relever les manches. Certains besoins vous ont certainement déjà poussé à faire communiquer 2 Threads.<br
/> Si le développement n&#8217;est pas facile, le debug peut devenir une calamité ! La programmation concurrente ne soulève pourtant que 3 types majeurs de problèmes. Faites le sondage autour de vous, les développeurs associent trop rapidement le mot clé <code>synchronize</code> au multithreading sans en comprendre véritablement le fonctionnement. Demandez-leur ensuite de vous décrire l&#8217;utilité du mot clé <code>volatile</code> &#8230;</p><p>Cet article revient sur les grands principes de la programmation concurrente.</p><p><a
href="http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/">Lire cet article »</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Les 10 commandements des logs applicatives</title><link>http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/</link> <comments>http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/#comments</comments> <pubDate>Fri, 11 Jul 2008 08:34:40 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[log]]></category> <category><![CDATA[Supervision]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/</guid> <description><![CDATA[Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité : durant le développement, afin de suivre l&#8217;exécution pas à pas et de détecter d&#8217;éventuelles anomalies. durant la recette, afin de corréler anomalies fonctionnelles et exécution du programme. durant l&#8217;exploitation, afin de surveiller la &#171;&#160;bonne santé&#160;&#187; [...]]]></description> <content:encoded><![CDATA[<p>Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité :</p><ul><li>durant le développement, afin de suivre l&#8217;exécution pas à pas et de détecter d&#8217;éventuelles anomalies.</li><li>durant la recette, afin de corréler anomalies fonctionnelles et exécution du programme.</li><li>durant l&#8217;exploitation, afin de surveiller la &laquo;&nbsp;bonne santé&nbsp;&raquo; de l&#8217;application.</li></ul><p>Mais obtenir des traces de qualité n&#8217;est pas un exercice trivial. C&#8217;est pourquoi nous vous proposons nos 10 commandements des logs.</p><p>Une application J2EE possède de nombreux types de logs :</p><ul><li>Des logs purement techniques, ponctuelles, générées automatiquement ou à la demande comme les dumps (ThreadDump, MemoryDump&#8230;).</li><li>Des logs provenant de l&#8217;environnement d&#8217;exécution : logs Système (journaux d&#8217;évènements serveur&#8230;), logs du serveur applicatif et logs générées par les librairies tierces utilisées par l&#8217;application.</li><li>Les logs générées par le code développé pour l&#8217;application, que nous désignerons comme logs applicatives, sur lesquelles l&#8217;équipe projet a la main.</li></ul><p>Nous traiterons quasi exclusivement de ces dernières dans cet article.</p><h3><a
title="Lescommandements" name="Lescommandements"></a>Les 10 commandements</h3><ol><li>Les logs sont un <strong>outil collaboratif</strong> issu d&#8217;un processus <strong>itératif</strong>.</li><li>Les logs sont une <strong>brique applicative intégrée</strong> à l&#8217;<strong>environnement d&#8217;exécution</strong> de l&#8217;application.</li><li>Les logs sont <strong>paramétrées</strong> en fonction des <strong>besoins</strong>.</li><li>Les logs doivent avoir un <strong>impact minimal sur les performances</strong> globales de l&#8217;application.</li><li>Les logs ne doivent pas occasionner de <strong>perte d&#8217;information</strong>.</li><li>Une utilisation correcte du logger est la première source d&#8217;information.</li><li>L&#8217;<strong>utilisation</strong> du framework de logs doit être <strong>simplifiée</strong>.</li><li>Une log efficace doit <strong>remplacer le debugger</strong>.</li><li>Le framework mis en place doit servir <strong>exclusivement</strong> à produire des <strong>logs applicatives</strong>.</li><li>Les logs permettent de décrire le <strong>comportement aux frontières</strong> de l&#8217;application.</li></ol><h3><a
title="Entronsdansledtail" name="Entronsdansledtail"></a>Entrons dans le détail</h3><h4>1 &#8211; Les logs sont un outil collaboratif issu d&#8217;un processus itératif</h4><p>Les messages de logs sont destinés à tous les acteurs du projet.<br
/> Il est essentiel de garder à l&#8217;esprit, lors de de tout développement, qu&#8217;une application est vouée à être développée, puis testée, puis exploitée (et éventuellement corrigée). Les logs doivent prendre en compte ces 3 phases de la vie du projet, et permettre à tous les acteurs intervenant lors de ces différentes phases de pouvoir interagir efficacement.<br
/> C&#8217;est pourquoi chaque méthode devrait au minimum contenir des traces de niveau INFO, WARN et ERROR, chaque niveau ciblant un des acteurs intervenant sur l&#8217;application.<br
/> De plus, il est difficile de réaliser une &#8216;bonne&#8217; log du premier coup. La pertinence de celle-ci sera renforcée par des échanges constants entre exploitation et développement (ciblage spécifique d&#8217;un problème de performance, anomalie non remontée initialement&#8230;).<br
/> Chaque correction d&#8217;anomalie devrait entrainer l&#8217;ajout de traces de niveau DEBUG, qui permettront un diagnostic plus fin en cas de nouvelle occurrence.</p><h4>2 &#8211; Les logs sont une brique applicative intégrée à l&#8217;environnement d&#8217;exécution de l&#8217;application</h4><p>C&#8217;est pourquoi il est essentiel de choisir un framework de logs bien intégré dans le middleware utilisé en production.<br
/> Ce framework doit pouvoir être utilisé et paramétré aisément pour obtenir des traces de l&#8217;ensemble des composants du système, que ce soit de la part de librairies embarquées tierces comme des systèmes &#8216;contenants&#8217; (serveur d&#8217;application par exemple).<br
/> Par exemple, Jakarta Commons Logging est délicat à utiliser avec Websphere.</p><h4>3 &#8211; Les logs sont paramétrées en fonction des besoins</h4><p>L&#8217;écriture d&#8217;une log a un coût qu&#8217;il ne faut pas négliger. Les performances d&#8217;une application en production ne doivent pas être plombées par la génération de lignes de log inutiles. Et il est inenvisageable de demander à chaque développeur d&#8217;effacer systématiquement les logs qu&#8217;il ajoute (si ces logs ont été utiles à un moment de la vie du projet, il y a de grandes chances qu&#8217;elles puissent resservir plus tard).<br
/> Il est donc impératif de choisir un framework de logs <strong>facilement administrable</strong> autant en développement qu&#8217;en production :</p><p><strong>Pour le développement :</strong></p><ul><li>Une configuration de logs par défaut quand on fait un checkout du code (typiquement un fichier log4j.properties dans le classpath configuré au niveau WARN qui redirige vers System.out).</li><li>La possibilité de modifier à chaud la configuration des logs lors de l&#8217;éxécution de l&#8217;application dans l&#8217;IDE (typiquement un configureAndWatch sur classpath:log4j.properties).</li></ul><p><strong>Pour l&#8217;exploitation :</strong></p><ul><li>Une configuration par fichiers, séparée du WAR, ce qui permet de livrer / modifier l&#8217;application indépendamment de sa configuration (et vice et versa).</li><li>Des mécanismes de reconfiguration à chaud par modification de fichier et/ou par API (JMX).</li></ul><p>On se doit d&#8217;exploiter au maximum les <strong>différents Appenders</strong>.<br
/> Le système d&#8217;Appender fourni avec les principaux framework de log permet de gérer finement la persistence de la trace : elle peut être éphémère, par exemple dans une sortie Console, ou bien être archivée périodiquement, en utilisant un système de DailyRollingFileAppender.<br
/> Une bonne connaissance des Appenders est essentielle dans la gestion à long terme de la log, aussi bien en terme de performance (utilisation des Loggers asynchrones en utilisant JMS) qu&#8217;en terme d&#8217;espace disque (configurer correctement les FileAppenders afin que les fichiers restent exploitables).</p><h4>4 &#8211; Les logs doivent avoir un impact minimal sur les performances globales de l&#8217;application</h4><p>La majorité des frameworks de log disposent de méthodes conditionnelles de type log.is&lt;Priority&gt;Enabled(). Conditionner l&#8217;écriture de la log par ces méthodes permet d&#8217;économiser des ressources précieuses lors du runtime (construction d&#8217;une aggrégation de chaînes de caractères par exemple). La méthode log.&lt;Priority&gt;(String) effectue bien entendu le même test, mais après la résolution des paramètres.</p><p>Evitez :</p><pre class="brush: java; title: ; notranslate">
log.debug(&quot;Entrée dans la méthode doIt(), avec param1[&quot; + param1 + &quot;], param2 [&quot; + param2 + &quot;]&quot;);
</pre><p>Préférez :</p><pre class="brush: java; title: ; notranslate">
if(log.isDebugEnabled() {
   log.debug(&quot;Entrée dans la méthode doIt(), avec param1[&quot; + param1 + &quot;], param2 [&quot; + param2 + &quot;]&quot;);
}
</pre><h4>5 &#8211; Les logs ne doivent pas occasionner de perte d&#8217;information</h4><p>Ce commandement s&#8217;applique plus particulièrement aux logs des exceptions.<br
/> Il est primordial de qualifier le plus finement possible les exceptions tracées.<br
/> C&#8217;est pourquoi on privilégiera systématiquement les méthodes Logger#error(java.lang.Object message, java.lang.Throwable t) à Logger#error(java.lang.Object message) , afin de ne pas perdre les informations exposées par la stackTrace.<br
/> De plus, on explicitera au maximum le contexte d&#8217;exécution dans le message.</p><p>Evitez :</p><pre class="brush: java; title: ; notranslate">
...
} catch (UnknownUserException exception) {
   log.error(&quot;Une exception s'est produite :&quot; + exception);
   ...
}
...
</pre><p>Préférez :</p><pre class="brush: java; title: ; notranslate">
...
catch (UnknownUserException exception) {
   log.error(&quot;L'utilisateur [&quot; + user :&quot;] n'a pas été trouvé dans l'annuaire [&quot;+ myLdap + &quot;]&quot;, exception);
...
}
...
</pre><p><em>NB : le traitement des exceptions fera l&#8217;objet d&#8217;un prochain article.</em></p><h4>6 &#8211; Une utilisation correcte du logger est la première source d&#8217;information</h4><p>Chaque niveau de log a ses spécificités. Bien définir l&#8217;utilisation de chacun de ces niveaux permet de s&#8217;affranchir du risque de logger trop, ou trop peu, aux différentes étapes du cycle de vie de l&#8217;application. Utiliser des <strong>niveaux de log cohérents et pertinents</strong> donne donc un premier niveau d&#8217;information essentiel.<br
/> Voici les niveaux existants dans les différents frameworks, et leur utilisation communément admise (Log4J/Apache Commons Logging &#8211; java.util.logging) :</p><ul><li>TRACE / FINE : niveau d&#8217;information ultrafin.</li><li>DEBUG / CONFIG : information détaillée pour le suivi d&#8217;exécution du programme (identification et résolution d&#8217;éventuelles anomalies).</li><li>INFO : information essentielle sur le programme, suivi de l&#8217;exécution d&#8217;un point de vue global.</li><li>WARN / WARNING : situation d&#8217;exécution non idéale (utilisation d&#8217;API dépréciées, ressource non critique absente&#8230;).</li><li>ERROR / &lt;pas d&#8217;équivalent&gt; : situation d&#8217;erreur ou inattendue, qui n&#8217;entraine pas forcément une situation de blocage (accès à un service externe non critique et dont l&#8217;accès est re-testé périodiquement).</li><li>FATAL / SEVERE : situation d&#8217;erreur critique, qui entraîne un blocage voire un arrêt du système (problème de connexion à la DB par exemple).</li></ul><h4>7 &#8211; L&#8217;utilisation du framework de logs doit être simplifiée</h4><p>L&#8217;ajout de log doit être le moins contraignant possible pour les développeurs. De plus, dans le cadre d&#8217;une équipe de développement, il n&#8217;est pas toujours facile pour un développeur de savoir quelles sont les informations pertinentes à tracer, s&#8217;il n&#8217;est pas l&#8217;auteur de la classe suivie. Il faut donc faciliter la création de logs de qualité&#8230;</p><ul><li> &#8230; en rendant ses <strong>classes explicites</strong>.<br
/> En surchargeant la méthode Object#toString(), afin qu&#8217;elle renvoie les informations principales d&#8217;une classe, on peut facilement tracer les informations en entrée ou sortie de méthode, et expliciter le contexte applicatif de l&#8217;exécution. Attention, les méthodes toString() ne doivent jamais lancer d&#8217;exception.</li></ul><p>Evitez :</p><pre class="brush: java; title: ; notranslate">
public String toString(){
   StringBuilder sb = new StringBuilder();
   sb.append(getClass().getName())
   // Ici, on peut avoir une NullPointerException
   sb.append(&quot; myfield=[&quot;).append(this.myfield.toString()).append(&quot;]&quot;);
   return sb.toString();
}
</pre><p>Préférez :</p><pre class="brush: java; title: ; notranslate">
public String toString(){
   return new ToStringBuilder(this).append(&quot;myfield&quot;, this.myfield).toString();
}
</pre><ul><li> &#8230; en définissant, documentant et partageant la <strong>hiérarchie de logger</strong><br
/> L&#8217;utilisation la plus répandue de la hiérarchie de Logger consitste à déclarer un logger par classe.</li></ul><pre class="brush: java; title: ; notranslate">
private final static Logger LOGGER = Logger.getLogger(MyClass.class);
</pre><p>Cependant, il est souvent interessant de réfléchir à une hiérarchie plus poussée, par domaines technico-fonctionnels par exemple.<br
/> Il est parfois même utile de déclarer plusieurs Loggers par classe (un logger pour le suivi de l&#8217;exécution générale, un logger particulier pour surveiller une fonction critique)<br
/> Afin d&#8217;avoir des logs cohérentes, il est nécessaire de définir et de documenter la hiérarchie des Loggers au plus tôt de la vie du projet, et de la communiquer à l&#8217;ensemble des équipes, afin d&#8217;unifier les méthodes de logging.</p><h4>8 &#8211; Une log efficace doit remplacer le debugger</h4><p>Il existe un grand nombre de circonstances qui rendent impossible l&#8217;utilisation d&#8217;un debugger, dont la plus évidente, la nécessité de debugger un système en production. Mais on pourrait aussi citer les traitements <span
class="diffaddedchars">multi-threadés, etc</span><br
/> Dans ces cas particuliers, l&#8217;utilisation de la log doit se substituer au débuggeur, et répondre aux mêmes besoins : &laquo;&nbsp;exécution&nbsp;&raquo; pas à pas <span
class="diffaddedchars">des algorithmes</span>, inspection des valeurs d&#8217;entrée et de <span
class="diffaddedchars">sortie des points de passage clefs</span>, parcours des différentes couches de l&#8217;application, surveillance des entrées / sorties du système.<br
/> La mise à disposition d&#8217;un tel outil est vitale pour les développeurs, car trop souvent, les équipes de développements sont dans l&#8217;obligation d&#8217;attendre plusieurs occurrences d&#8217;un même bug en production avant d&#8217;être aptes à déterminer ses conditions précises d&#8217;occurrence.</p><h4>9 &#8211; Le framework mis en place doit servir exclusivement à produire des logs applicatives</h4><p>Les logs sont et doivent être un outil technique. Utiliser le framework de log pour générer des traces &#8216;fonctionnelles&#8217; (audit, génération de traces métier, constitution de fichiers métier) présente un risque majeur de perte de données. En effet, le risque d&#8217;effacement des logs est réel : la configuration des différents Appenders provoquent souvent un effacement périodique des logs, le comportement global des logs peut être totalement modifié dans le cadre d&#8217;une intervention de type &#8216;troubleshooting&#8217; (limitation des traces à un sous-ensemble de classes très restreint)&#8230;<br
/> En revanche, il est possible d&#8217;utiliser les fonctionnalités offertes par le framework de logs (RollingFileAppender, etc) mais il faut que cette utilisation soit dissociée du fonctionnement et de la configuration des logs applicatives.</p><h4>10 &#8211; Les logs permettent de décrire le comportement aux frontières de l&#8217;application</h4><p>L&#8217;un des enjeux majeurs des Systèmes d&#8217;Information actuels est l&#8217;intégration des différentes composantes de ce SI.<br
/> Il est très souvent ardu de suivre intégralement la chorégraphie entre les différents composants, aboutissant à la réponse &#8216;finale&#8217; du système.<br
/> D&#8217;où la nécessité de tracer le plus finement chaque appel entrant ou sortant du système, en utilisant :</p><ul><li>l&#8217;heure de cet appel</li><li>le système appelant / appelé (par HTTP, JMS, SOAP&#8230;)</li><li>une description concise de l&#8217;interaction sollicitée</li><li>éventuellement, au niveau le plus fin (TRACE), le message émis / reçu</li></ul><p>Certaines librairies Open Source, comme commons-http-client (HTTP) et CXF (SOAP) offrent ces fonctionnalités de manière native.</p><h3><a
title="Enconclusion" name="Enconclusion"></a>En conclusion</h3><p>L&#8217;application de ces 10 commandements nous pousse de manière assez naturelle à l&#8217;utilisation de Log4J, qui répond à l&#8217;ensemble des besoins listés ci dessus.<br
/> Le choix de Commons Logging ou de java.util.logging, si il est loin d&#8217;être proscrit, demande une plus grande vigilance (voir les articles &#8216;Critiques&#8217; cités en références).</p><p>Quoi qu&#8217;il en soit, il est primordial d&#8217;avoir en tête ces bonnes pratiques dès le démarrage d&#8217;un projet. En effet, au même titre que les tests unitaires ou que la documentation interne du code, les logs ne peuvent être repoussées à &#8216;plus tard&#8217; : plus le temps passe, plus la complexité et le volume de code à &#8216;tracer&#8217; augmentent.<br
/> Ceux qui ont expérimenté &laquo;&nbsp;l&#8217;intervention pompier&nbsp;&raquo; sur une application peu ou mal loggée savent qu&#8217;il est quasiment impossible d&#8217;otenir des logs globales et/ou pertinentes a posteriori (d&#8217;autant qu&#8217;il est difficile de &#8216;budgeter&#8217; une telle opération, dont la valeur métier est nulle).</p><h3><a
title="Rfrences" name="Rfrences"></a>Références</h3><h4>Les frameworks de logs les plus connus</h4><ul><li><em><a
href="http://www.slf4j.org/" title="Simple Logging Facade for Java (SLF4J)">Simple Logging Facade for Java (SLF4J)</a> : A simple facade for various logging APIs allowing to the end-user to plug in the desired implementation at deployment time.</em></li><li><em><a
href="http://logging.apache.org/log4j/" title="Log4J ">Log4J</a> : Site officiel du framework Log4J </em></li><li><em><a
href="http://commons.apache.org/logging/" title="Java Commons Logging ">Java Commons Logging </a> : Site officiel du framework Commons Logging</em></li><li><em><a
href="http://java.sun.com/j2se/1.4.2/docs/api/index.html" title="java.util.logging ">java.util.logging </a> : API de java.util.logging</em></li></ul><h4>Critiques</h4><ul><li><em><a
href="http://radio.weblogs.com/0122027/2003/08/15.html" title="Rod Waldhoff's Weblog - Commons Logging was my fault ">Rod Waldhoff&#8217;s Weblog &#8211; Commons Logging was my fault </a> : une critique de Commons Logging par son auteur</em></li><li><em><a
href="http://tomcat.apache.org/tomcat-6.0-doc/logging.html" title="Tomcat Docs - Logging">Tomcat Docs &#8211; Logging</a> : The default implemenatation of java.util.logging provided in the JDK is too limited to be useful. &#8230;</em></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>L&#8217;industrialisation pour la paix des ménages</title><link>http://blog.xebia.fr/2008/05/28/lindustrialisation-pour-la-paix-des-menages/</link> <comments>http://blog.xebia.fr/2008/05/28/lindustrialisation-pour-la-paix-des-menages/#comments</comments> <pubDate>Wed, 28 May 2008 07:23:23 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/05/28/lindustrialisation-pour-la-paix-des-menages/</guid> <description><![CDATA[La MOE et l&#8217;exploitation doivent collaborer au jour le jour : la MOE réalise et livre des applications, l&#8217;exploitation est en charge de les installer et de les exploiter. Cependant, ces deux équipes, bien qu&#8217;elles travaillent dans le même but, n&#8217;ont pas les mêmes besoins ni les mêmes problématiques. Cette divergence n&#8217;est pas dramatique tant [...]]]></description> <content:encoded><![CDATA[<p>La MOE et l&#8217;exploitation doivent collaborer au jour le jour : la MOE réalise et livre des applications, l&#8217;exploitation est en charge de les installer et de les exploiter. Cependant, ces deux équipes, bien qu&#8217;elles travaillent dans le même but, n&#8217;ont pas les mêmes besoins ni les mêmes problématiques.<br
/> Cette divergence n&#8217;est pas dramatique tant que la collaboration se passe bien : la MOE est consciente des besoins de l&#8217;exploitation et en tient compte en simplifiant la prise en charge des applications par les équipes d&#8217;exploitation. Les choses se compliquent bien sûr quand les problèmes et les mésententes arrivent.</p><p>Un des problèmes récurrents qui fait intervenir les deux équipes est le déploiement des applications.</p><h3>La problématique des déploiements d&#8217;applications J2EE</h3><p>Les applications actuellement réalisées sont massivement distribuées : il n&#8217;est pas rare d&#8217;avoir une application multi-tiers (un serveur web, un serveur d&#8217;applications et une base de données par exemple) qui nécessite une installation sur plusieurs serveurs distincts. Le problème s&#8217;accentue encore sur les environnements de production, qui en plus d&#8217;être distribués, sont bien souvent clusterisés pour des problématiques de tolérance à la panne et de montée en charge. Les applications actuelles deviennent très complexes à installer.</p><p>Imaginez seulement devoir installer une simple application comme Microsoft Office sans recourir à l&#8217;installateur : ceci implique copier vous-même les fichiers dans les bons répertoires, mettre à jour les fichiers de configuration pour adapter Office à la machine et au répertoire d&#8217;installation choisie, mettre à jour la base de registre (sic !) &#8230; Ceci vous semblerait complètement invraisemblable. Imaginez maintenant que vous deviez répéter cette « procédure » d&#8217;installation sur plusieurs postes aux configurations différentes. L&#8217;opération deviendrait vite cauchemardesque. Eh bien, vous commencez à comprendre ce que ressentent les équipes d&#8217;intégration et de production qui vivent ce genre de situation au jour le jour.</p><p>C&#8217;est le constat que l&#8217;on fait généralement chez nos clients quand on se penche sur leur processus d&#8217;installation des applications. La plupart des opérations sont manuelles et au mieux décrites dans un document long, pas toujours très clair, très rébarbatif à lire et source d&#8217;erreurs. Ce genre de document est d&#8217;une part très difficile à produire par la MOE (oubli, clarté des explications, &#8230;) et d&#8217;autre part, très difficile à lire pour les équipes d&#8217;exploitation. Si l&#8217;application est mal packagée, l&#8217;effet s&#8217;accentue.</p><h3>Vers une industrialisation des déploiements</h3><p>L&#8217;industrialisation des déploiements est là pour améliorer cet état de fait.</p><p>L&#8217;industrialisation ne se focalise pas uniquement sur l&#8217;automatisation des déploiements. Quand on démarre ce genre d&#8217;étude, on cherche avant tout à simplifier les processus. Dans ce cas, il ne suffit pas de se concentrer sur les équipes de production et d&#8217;exploitation : les phases de packaging et de livraison entrent elles aussi dans cette étude de simplification. Et il convient donc de rencontrer les équipes de développements en charge de ces phases.</p><p>Il est important d&#8217;analyser le processus de déploiement complet, du packaging de l&#8217;application jusqu&#8217;à la mise en production. On identifie ensuite quelles sont les étapes qui consomment énormément de temps et quelles sont les étapes qui échouent le plus souvent.</p><p>En automatisant et en simplifiant le processus de déploiement, on diminue les risques, les erreurs dues aux étapes manuelles, les pertes de temps, etc.</p><p>L&#8217;une des conséquences de cette amélioration des déploiements est l&#8217;amélioration de la relation MOE / Exploitation. Si les applications sont faciles à déployer, les relations sont moins tendues et les différentes équipes de développement et d&#8217;exploitation seront plus enclines à collaborer activement car elles sentiront que leur travail est respecté et leurs besoins compris.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/05/28/lindustrialisation-pour-la-paix-des-menages/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Administration et supervision des serveurs d&#8217;applications J2EE</title><link>http://blog.xebia.fr/2007/07/31/administration-et-supervision-des-serveurs-dapplications-j2ee/</link> <comments>http://blog.xebia.fr/2007/07/31/administration-et-supervision-des-serveurs-dapplications-j2ee/#comments</comments> <pubDate>Tue, 31 Jul 2007 10:39:46 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Administration]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Supervision]]></category> <category><![CDATA[Support]]></category> <category><![CDATA[vidéo]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/07/31/administration-et-supervision-des-serveurs-dapplications-j2ee/</guid> <description><![CDATA[L&#8217;interview de Guillaume Bodet (Xebia) par Pierre-Olivier Chotard (BEA Systems) vient d&#8217;être publiée sur TV4IT. Guillaume Bodet y partage son retour d&#8217;expérience et les meilleures pratiques en matière d&#8217;administration et de supervision des serveurs d&#8217;applications J2EE. Cette interview avait été réalisée à l&#8217;occasion du TechTalk organisé par BEA sur les thèmes de la supervision, de [...]]]></description> <content:encoded><![CDATA[<p>L&#8217;interview de Guillaume Bodet (Xebia) par Pierre-Olivier Chotard (BEA Systems) vient d&#8217;être publiée sur TV4IT.<br
/> Guillaume Bodet y partage son retour d&#8217;expérience et les meilleures pratiques en matière d&#8217;administration et de supervision des serveurs d&#8217;applications J2EE.</p><div
style="text-align:center;"> <embed
style="width:270px; height:224px;" id="VideoPlayback" type="application/x-shockwave-flash" wmode="transparent" src="http://storage02.brainsonic.com/webtv/tv4it/player.swf?&#038;paramXml=http://storage02.brainsonic.com/webtv/tv4it/param_player.xml&#038;itemId=3153&#038;autostart=false&#038;mute=false&#038;rollover=true"></embed></div><p>Cette interview avait été réalisée à l&#8217;occasion du TechTalk organisé par BEA sur les thèmes de la supervision, de l’administration et du support <em>(Cf. notre billet du 26 juin : &laquo;&nbsp;<a
href="http://blog.xebia.fr/2007/06/26/supervision-administration-et-support/">Supervision, Administration et Support</a>&laquo;&nbsp;)</em>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/07/31/administration-et-supervision-des-serveurs-dapplications-j2ee/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Supervision, Administration et Support</title><link>http://blog.xebia.fr/2007/06/26/supervision-administration-et-support/</link> <comments>http://blog.xebia.fr/2007/06/26/supervision-administration-et-support/#comments</comments> <pubDate>Tue, 26 Jun 2007 15:12:16 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Administration]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Supervision]]></category> <category><![CDATA[Support]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/06/26/supervision-administration-et-support/</guid> <description><![CDATA[BEA organise le mardi 10 juillet 2007 un TechTalk sur les thèmes de la supervision, de l&#8217;administration et du support. Un sujet plus que d&#8217;actualité puisque, comme le rappelait Luc Legardeur dans son billet &#171;&#160;Exploitation J2EE : il y a urgence !!!!&#171;&#160;, l&#8217;exploitation devient, avec l&#8217;augmentation en nombre et en criticité des applications J2EE, une [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://fr.bea.com/evenements/techtalk/interview.html" title="Interview de Guillaume Bodet"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/interviewgbodet.jpg" alt="Interview de Guillaume Bodet" style="margin: 1em 1em 1em 1em; float: right;" /></a></p><p>BEA organise le mardi 10 juillet 2007 un <a
href="http://fr.bea.com/evenements/techtalk/index.jsp">TechTalk sur les thèmes de la supervision, de l&#8217;administration et du support</a>.</p><p>Un sujet plus que d&#8217;actualité puisque, comme le rappelait Luc Legardeur dans son billet <em>&laquo;&nbsp;<a
href="http://blog.xebia.fr/2007/06/08/exploitation-j2ee-il-y-a-urgence/">Exploitation J2EE : il y a urgence !!!!</a>&laquo;&nbsp;</em>, l&#8217;exploitation devient, avec l&#8217;augmentation en nombre et en criticité des applications J2EE, une discipline fondamentale pour les départements Production.</p><p>Elle nécessite la mise en place de bonnes pratiques de supervision J2EE impliquant tous les membres de l&#8217;organisation informatique (Etudes, équipes projets, cellule d&#8217;exploitation, &#8230;).<br
/> La performance, la stabilité des systèmes, la réactivité face aux incidents, le déploiement rapide des nouvelles applications, les exigences sécuritaires accrues mettent la résilience des infrastructures à rude épreuve.</p><p>Parmi les interventions :</p><ul><li>Un retour d&#8217;expérience de Stéphane Coussement, Directeur Technique de <a
href="http://www.voyages-sncf.com">voyages-sncf.com</a> sur l&#8217;amélioration des pratiques de supervision.</li><li>Un topo sur les meilleures pratiques en matière de supervision des Infrastructures Java/J2EE par Guillaume Bodet, Directeur Technique de <a
href="http://www.xebia.fr">Xebia</a>.</li></ul><p>L&#8217;administration et le support &laquo;&nbsp;Préemptif&nbsp;&raquo; seront également à l&#8217;honneur avec :</p><ul><li>Une présentation des nouveautés de la version BEA WebLogic Server 10 : les nouveautés en terme d&#8217;administration, de nouvelles certifications, d&#8217;optimisation de la productivité des développements, etc.</li><li>Une présentation et démonstration de l&#8217;outil BEA Guardian&#8482; un outil de &laquo;&nbsp;support préemptif&nbsp;&raquo; unique, conçu et développé par BEA Systems. Cette innovation technologique signe l&#8217;ouverture vers une nouvelle génération de support.</li></ul><p><a
href="http://fr.bea.com/evenements/techtalk/index.jsp">Information et inscription au BEA TechTalk</a>.</p><p>Pour patienter, vous pouvez dès maintenant :</p><ul><li>Visualiser <a
href="http://fr.bea.com/evenements/techtalk/interview.html">l&#8217;interview de Guillaume Bodet, Directeur Technique de Xebia, au sujet des meilleures pratiques en matière de supervision des Infrastructures Java/J2EE</a>.</li><li>Lire le <a
href="http://www.xebia.fr/temoignage%20VSCT.pdf">témoignage de Voyages-Sncf.com sur l&#8217;exploitation et la supervision J2EE</a>.</li><li>Télécharger une introduction sur le sujet : <em>&laquo;&nbsp;<a
href="http://www.xebia.fr/download/supervision_J2EE.pdf">Supervision des Infrastructures</a>&laquo;&nbsp;</em>.</li><li>Télécharger la méthode utilisée par Xebia pour <a
href="http://www.xebia.fr/download/audit_de_performances_J2EE.pdf">auditer les performances d&#8217;une application J2EE</a>.</li><li>Télécharger la démarche proposée par Xebia pour <a
href="http://www.xebia.fr/download/deploiement_J2EE.pdf">automatiser les déploiements</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/06/26/supervision-administration-et-support/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Exploitation J2EE : il y a urgence !!!!</title><link>http://blog.xebia.fr/2007/06/08/exploitation-j2ee-il-y-a-urgence/</link> <comments>http://blog.xebia.fr/2007/06/08/exploitation-j2ee-il-y-a-urgence/#comments</comments> <pubDate>Fri, 08 Jun 2007 11:38:56 +0000</pubDate> <dc:creator>Luc Legardeur</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Mot du président]]></category> <category><![CDATA[J2EE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/06/08/exploitation-j2ee-il-y-a-urgence/</guid> <description><![CDATA[L’exploitation devient, avec l’augmentation en nombre et en criticité des applications J2EE, une discipline fondamentale pour les départements Production. En effet, en 2007, toute déficience dans l’exploitation, aura des répercussions immédiates sur une partie des activités commerciales de l’entreprise. L’adoption massive des technologies J2EE par les entreprises a contraint les cellules d’exploitation à adresser rapidement [...]]]></description> <content:encoded><![CDATA[<p>L’exploitation devient, avec l’augmentation en nombre et en criticité des applications J2EE, une discipline fondamentale pour les départements Production. En effet, en 2007, toute déficience dans l’exploitation, aura des répercussions immédiates sur une partie des activités commerciales de l’entreprise.</p><p>L’adoption massive des technologies J2EE par les entreprises a contraint les cellules d’exploitation à adresser rapidement (et sans aucune aide particulière)  plusieurs défis majeurs :</p><ul><li>Gérer l’augmentation sensible du nombre d’applications en exploitation.</li><li>Rendre un service compatible avec le niveau de criticité des applications utilisées.</li><li>Prendre en charge des cycles de déploiement et de mise à jour toujours plus rapides.</li><li>Appréhender une complexité inhérente à l’empilement de couches logicielles nombreuses, basées sur des technologies nouvelles.</li></ul><p>Pourtant, nous constatons tous que nous <em>-collectivement les acteurs de l’écosystème J2EE-</em> n’avons pas donné les moyens aux départements Production de faire leur travail.</p><p>Les symptômes que nous rencontrons le plus fréquemment chez nos clients sont :</p><ul
type="disc" style="margin-top: 0cm"><li>Déploiements chaotiques nécessitant de trop nombreuses interventions humaines.</li><li>Performances dégradées, fuites mémoires, dysfonctionnements inexplicables, …</li><li>Gestion des incidents et procédures d’escalade à faire se pouffer de rire les vieux routards de l’exploitation.</li></ul><p>Face à cette situation, il est urgent d’agir. Agir de deux manières :</p><ol><li>En amont, repenser le travail des architectes et développeurs et mettre l’exploitabilité des applications au cœur des applications.</li><li>En aval <em>-comme nous le proposons-</em> analyser la maturité des organisations, outils et procédures vis-à-vis de l’administration J2EE.</li></ol><p>Pour cela, il faut découper l’administration J2EE en disciplines (Alimentation, Architecture et Exploitation).</p><p>Chaque discipline sera ensuite décrite par ses activités unitaires. Par exemple : la gestion de versions, le  contrôle qualité, le déploiement, l&#8217;architecture middleware, l&#8217;architecture de sécurité, l&#8217;architecture HD, la gestion des environnements, la gestion des incidents, la gestion de la capacité, la gestion de la disponibilité, la gestion de la continuité, gestion des SLA, &#8230;<br
/> Il reste enfin à évaluer la maturité de chacune d’entre elles (état initial, reproductible, géré ou optimisé) et établir un plan d’action pour passer d’un état de non maturité (état initial) à l’état d’après (reproductible) …</p><p>Ce travail est nécessaire. Nous intervenons souvent en pompiers pour régler des problèmes ponctuels comme la performance.</p><p>Notre devoir de conseil nous oblige donc à tirer la sonnette d’alarme sur ce sujet.</p><p>Nous pouvons aider nos clients à devenir plus matures et à administrer plus sereinement leurs plateformes J2EE.</p><p>Luc Legardeur, Président</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/06/08/exploitation-j2ee-il-y-a-urgence/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>JOT Première partie : Contextualisation des logs avec log4j</title><link>http://blog.xebia.fr/2007/03/05/jot-premiere-partie-contextualisation-des-logs-avec-log4j/</link> <comments>http://blog.xebia.fr/2007/03/05/jot-premiere-partie-contextualisation-des-logs-avec-log4j/#comments</comments> <pubDate>Mon, 05 Mar 2007 13:05:01 +0000</pubDate> <dc:creator>Guillaume Bodet</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JOT]]></category> <category><![CDATA[log]]></category> <category><![CDATA[log4j]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/03/05/jot-premiere-partie-contextualisation-des-logs-avec-log4j/</guid> <description><![CDATA[Ce billet est le premier d&#8217;une série décrivant les principes et composants du &#171;&#160;Java Operations Toolkit&#160;&#187;. JOT est un projet encore embryonnaire (je le publierai bientôt sous license Open Source, et sous un autre nom, JOT étant déjà pris&#8230; Si certains parmi vous ont une idée&#8230;). Son objectif est d&#8217;offrir aux applications java un ensemble [...]]]></description> <content:encoded><![CDATA[<p>Ce billet est le premier d&#8217;une série décrivant les principes et composants du &laquo;&nbsp;Java Operations Toolkit&nbsp;&raquo;. JOT est un projet encore embryonnaire (je le publierai bientôt sous license Open Source, et sous un autre nom, JOT étant déjà pris&#8230; Si certains parmi vous ont une idée&#8230;). Son objectif est d&#8217;offrir aux applications java un ensemble d&#8217;utilitaires, d&#8217;API et de bonne pratiques visant à en faciliter l&#8217;exploitation.</p><p>Comme son titre le suggère, ce premier billet concerne la journalisation, connue également sous son sobriquet anglo-saxon de &laquo;&nbsp;log&nbsp;&raquo;.<br
/> Depuis plusieurs années maintenant, l&#8217;utilisation d&#8217;un framework dédié pour gérer les logs s&#8217;est généralisée. Log4j a ouvert la voie, suivi par framework java.util.logging à partir du JDK 1.4, qui adopte une architecture très similaire à celle de log4j, tout en proposant une nomenclature moins intuitive (du moins pour ceux qui pensent que &laquo;&nbsp;DEBUG&nbsp;&raquo; désigne un niveau de journalisation plus évident que &laquo;&nbsp;FINEST&nbsp;&raquo;). Citons également les meta-frameworks Commons Logging et SLF4J, qui offrent une couche d&#8217;adaptation au dessus des différents frameworks pour en unifier l&#8217;usage.</p><p>L&#8217;objet ici n&#8217;est pas de comparer ces différentes solutions : elles sont toutes très proches et offrent toutes les fonctionnalités attendues d&#8217;un utilitaire de logging:</p><ul><li>une API simple et intuitive, style log.debug(message) ou log.info(message)</li><li>une configuration externalisée permettant d&#8217;activer ou de désactiver certaines traces sans intervention sur les sources ou les binaires</li><li>la possibilité de configurer des flux de sortie divers pour les messages (console, fichiers avec rotation, sockets, base de données, JMS, syslog, NTEventLog, etc.), avec une granularité très fine</li><li>la possibilité de configurer le format des messages</li></ul><p>On ne peut que se féliciter de l&#8217;adoption massive de ces frameworks, en particulier du plus illustre d&#8217;entre eux, log4j. Cette adoption a pourtant bien souvent un revers: disposer de ces fonctionnalités a exempté les architectes et développeurs d&#8217;une réflexion réelle sur l&#8217;usage des logs. La politique de journalisation se réduit fréquemment à cette simple directive : &laquo;&nbsp;Utiliser log4j&nbsp;&raquo;, et le code est en conséquence saupoudré plus ou moins densément (selon l&#8217;humeur ou la sensibilité du développeur) d&#8217;instructions du style</p><pre class="brush: java; title: ; notranslate">
Logger log = Logger.getLogger(this.getClass());
	[...]
	log.debug(&quot;Avant call gloubiboulga casimir.isHeureux()=&quot; + casimir.isHeureux());
	casimir.gloubiboulga();
	log.debug(&quot;Après call gloubiboulga casimir.isHeureux()=&quot; + casimir.isHeureux());
	[...]
	catch (Exception ex){
	    log.error(&quot;Une erreur s'est produite&quot;, ex);
	    throw new RealBadThingHappenedException(ex);
	}
	[...]
</pre><p>Plusieurs problèmes dans cette approche:</p><ul><li>le logger utilisé porte le nom de la classe. Il doit être configuré comme tel (y compris avec les mécanisme d&#8217;héritage). Les noms de classe (et de package) n&#8217;ont pas vraiment de sens pour les équipes d&#8217;exploitation, ce qui limite souvent leur autonomie sur la configuration des traces.</li><li>les messages de debug manquent de consistance, et n&#8217;ont de véritable intérêt que pour le développeur au moment de la mise au point de la classe concernée (ce qui, notons-le, n&#8217;est pas critique; par nature, les messages de déboguage ne sont pas destinés aux exploitants).</li><li>si plusieurs threads exécutent simultanément la méthode, les traces seront entrelacées et il sera difficile de rétablir le séquencement des opérations</li><li>le message d&#8217;erreur est laconique et la pile d&#8217;appel, pour utile qu&#8217;elle soit, n&#8217;est interprétable que par l&#8217;ingénierie.</li><li>il n&#8217;y a pas de trace intermédiaire entre DEBUG et ERROR, ce qui limite la capacité de diagnostic en exploitation</li><li>l&#8217;utilisation des API de log tel quel peut poser des problèmes de performance (cf <a
href="http://blog.xebia.com/2007/02/18/ejapp-top-10-countdown-10-excessive-logging/">ce billet</a>)</li></ul><p>Nous nous pencherons aujourd&#8217;hui sur le problème de la corrélation: dans un environnement multithreadé et distribué, comment relier entre eux les messages relatifs à une même interaction?</p><h4>Corréler les logs</h4><p>Dans un environnement multi-threadé, et a fortiori dans un environnement distribué, il est difficile, sinon impossible, de corréler l&#8217;ensemble des traces issues d&#8217;un même traitement ou d&#8217;une même interaction (que l&#8217;on nommera désormais transaction pour plus de clareté). La solution proposée par log4j pour adresser ce problème consiste à placer dans chaque message un identifiant de corrélation unique pour chaque transaction. On trouvera une description de ce principe dans &laquo;&nbsp;Patterns for Logging Diagnostic Messages&nbsp;&raquo;(1).<br
/> Log4j supporte nativement cette contextualisation, aux travers des classes org.apache.log4j.NDC et org.apache.log4j.MDC (ce n&#8217;est pas le cas de java.util.logging; l&#8217;extension de java.util.logging pour supporter les NDC serait néanmoins très simple).<br
/> Pour implémenter ce mécanisme, il suffit donc d&#8217;intercepter le point d&#8217;entrée du système et de fixer l&#8217;identifiant de correlation dans le MDC (ou le NDC).<br
/> Le cas le plus simple est celui d&#8217;une application web, pour laquelle cette interception se fait au moyen d&#8217;un filtre:</p><pre class="brush: java; title: ; notranslate">
public class Log4jMDCServletFilter implements Filter {
	public void doFilter(ServletRequest request,
						 ServletResponse response,
						 FilterChain chain)
					throws IOException, ServletException {
		try {
			if (MDC.get(&quot;CorrelationID&quot;) == null)
				MDC.put(&quot;CorrelationID&quot;, JOTUtils.generateCorrelationID());
			chain.doFilter(request, response);
		}
		finally {
			MDC.remove(&quot;CorrelationID&quot;);
		}
	}
...
}
</pre><p>Il suffit ensuite d&#8217;utiliser le pattern (cf. org.apache.log4j.PatternLayout) suivant pour disposer systématiquement dans les messages d&#8217;un identifiant de correlation :</p><pre class="brush: plain; title: ; notranslate">
%d{ISO8601} [%t] %-5p %c %X{CorrelationID} - %m\n
</pre><p>Il est bien sûr possible de fournir un contexte plus riche (par exemple le nom de l&#8217;utilisateur, le use case, le service, etc.), et ce mécanisme peut servir de base à un filtrage, permettant d&#8217;augmenter le niveau de trace uniquement pour un sous-ensemble de clients ou de contextes.<br
/> Le composant NDC (pour Nested Diagnostic Context) permet quant à lui de gérer une pile de contextes imbriqués.</p><p>Néanmoins, MDC et NDC s&#8217;appuie sur des variables ThreadLocal, limitées donc à l&#8217;espace mémoire de la JVM. Les choses se compliquent donc singulièrement lorsque les interactions sont distribuées et que l&#8217;on souhaite corréler les traces aux travers de plusieurs JVMs.</p><p>Dans un contexte distribué, l&#8217;identifiant de correlation doit être propagé aux différents composants traversés. Il n&#8217;existe malheureusement pas de moyen universel de réaliser cette propagation : elle dépend du protocole utilisé pour réaliser les invocations distantes. Le plus souvent, cependant, la distribution se fera au moyen de RMI/IIOP.<br
/> Le protocole IIOP bénéficie d&#8217;une technologie standard d&#8217;interception: les PortableInterceptors CORBA. Voici donc un moyen de réaliser la propagation transaparente de l&#8217;identifiant de corrélation sur IIOP.</p><p>Premier élément, un intercepteur client chargé d&#8217;enrichir le flux IIOP d&#8217;un contexte spécifique portant l&#8217;identifiant de corrélation:</p><pre class="brush: java; title: ; notranslate">
...
public class CORBAClientInterceptor
	extends org.omg.CORBA.LocalObject
	implements ClientRequestInterceptor {
	private org.omg.PortableInterceptor.ORBInitInfo info;
	private int t_slot;
	private static final long serialVersionUID = -6768740178708556025L;
	public CORBAClientInterceptor(ORBInitInfo info, int t_slot) {
		this.info = info;
		this.t_slot = t_slot;
	}
	public String name() {
		return &quot;JOT Log correlation id propagation - Client Interceptor&quot;;
	}
	public void send_request(ClientRequestInfo ri) throws ForwardRequest {
		org.omg.CORBA.Any any = null;
		try {
			any = ri.get_slot(t_slot);
		}
		catch (org.omg.PortableInterceptor.InvalidSlot is) {
			throw new org.omg.CORBA.INTERNAL(&quot;JOTClientInterceptor : Invalid slot : &quot; + is.getMessage());
		}
		if ( ( any.type().kind().value() == org.omg.CORBA.TCKind._tk_null ) ||
		     ( any.type().kind().value() == org.omg.CORBA.TCKind._tk_void ) )
			return;
		org.omg.IOP.ServiceContext serviceCtx = new org.omg.IOP.ServiceContext();
		serviceCtx.context_id = 995;
		try {
			serviceCtx.context_data = ((String)MDC.get(&quot;CorrelationID&quot;)).getBytes(&quot;UTF-8&quot;);
		} catch (UnsupportedEncodingException e) {
			throw new org.omg.CORBA.INTERNAL(&quot;JOTClientInterceptor : UTF-8 Not Supported : &quot; + e.getMessage());
		}
		ri.add_request_service_context(serviceCtx, true);
	}
...
}
</pre><p>Il faut ensuite un intercepteur symétrique, côté serveur, chargé de décoder l&#8217;identifiant de corrélation et de le placer dans le NDC log4j:</p><pre class="brush: java; title: ; notranslate">
...
public class CORBAServerInterceptor extends LocalObject implements
		ServerRequestInterceptor {
	private static final long serialVersionUID = -5574812890862607150L;
	private org.omg.PortableInterceptor.ORBInitInfo info;
	private int t_slot;
	public CORBAServerInterceptor(ORBInitInfo info, int t_slot) {
		this.info = info;
		this.t_slot = t_slot;
	}
	public String name() {
		return &quot;JOT Log correlation id propagation - Server Interceptor&quot;;
	}
	public void receive_request_service_contexts(ServerRequestInfo ri)
			throws ForwardRequest {
		org.omg.IOP.ServiceContext serviceCtx = null;
		try
		{
			serviceCtx = ri.get_request_service_context(995);
		}
		catch (org.omg.CORBA.BAD_PARAM bp){
			//Le client n'a pas fourni de contexte, on en génère un
			MDC.put(&quot;CorrelationID&quot;, JOTUtils.generateTID());
			return;
		}
		try {
			MDC.put(&quot;CorrelationID&quot;, new String(serviceCtx.context_data, &quot;UTF-8&quot;));
		} catch (UnsupportedEncodingException e) {
			throw new org.omg.CORBA.INTERNAL(&quot;JOTServerInterceptor : UTF-8 Not Supported : &quot; + e.getMessage());
		}
	}
...
}
</pre><p>Et voici la classe d&#8217;initialisation qui permet d&#8217;enregistrer les intercepteurs:</p><pre class="brush: java; title: ; notranslate">
...
public class CORBAInitializer extends org.omg.CORBA.LocalObject implements
		ORBInitializer {
	/**
	 * Log correlation slot id
	 */
	private int t_slot;
	/**
	 * Pre initialization
	 */
	public void pre_init(org.omg.PortableInterceptor.ORBInitInfo info) {
		t_slot = info.allocate_slot_id();
		CORBAClientInterceptor clientInterceptor = new CORBAClientInterceptor(
				info, t_slot);
		try {
			info.add_client_request_interceptor(clientInterceptor);
			// info.add_server_request_interceptor(serverInterceptor);
		} catch (org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName dn) {
			String msg = &quot;Error in initializer: Duplicate name when adding the interceptor : &quot;
					+ dn.getMessage();
			throw new org.omg.CORBA.INTERNAL(msg);
		}
	}
	public void post_init(ORBInitInfo info) {
	}
}
</pre><p>L&#8217;implémentation de ce mécanisme pour d&#8217;autres protocoles dépend bien sût des capacités de ce protocole. Si le protocole est HTTP, il est assez simple d&#8217;ajouter les entêtes adéquates dans les requêtes. Pour d&#8217;autres protocoles, les choses peuvent s&#8217;avérer plus difficile, voire impossible pour des protocoles propriétaires.</p><p>Dans le prochain billet, nous chercherons à centraliser la configuration des catégories et à en simplifier l&#8217;usage.</p><p>Références<br
/> (1) &laquo;&nbsp;Patterns for Logging Diagnostic Messages&nbsp;&raquo; dans &laquo;&nbsp;Pattern Languages of Program Design 3&#8243;, édité par R. Martin, D. Riehle, et F. Buschmann (Addison-Wesley, 1997).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/03/05/jot-premiere-partie-contextualisation-des-logs-avec-log4j/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
