<?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; Cyrille Le Clerc</title> <atom:link href="http://blog.xebia.fr/author/cleclerc/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Mise en place d&#8217;une organisation DevOps</title><link>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/</link> <comments>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/#comments</comments> <pubDate>Mon, 09 Jan 2012 07:38:41 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[DevOps]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=10219</guid> <description><![CDATA[Comme le mouvement Agile a rapproché donneurs d&#8217;ordre et équipes de réalisation autour d&#8217;une vision commune orientée &#171;&#160;produit&#160;&#187;, le mouvement DevOps rapproche aujourd&#8217;hui les équipes de développement (DEV) et d&#8217;exploitation (OPS) autour d&#8217;une vision commune orientée &#171;&#160;service&#160;&#187;, afin de mieux concilier réactivité et qualité de service. DevOps aborde le paradoxe entre des équipes projets qui [...]]]></description> <content:encoded><![CDATA[<p>Comme le mouvement Agile a rapproché donneurs d&#8217;ordre et équipes de réalisation autour d&#8217;une vision commune orientée &laquo;&nbsp;produit&nbsp;&raquo;, le mouvement DevOps rapproche aujourd&#8217;hui les équipes de développement (DEV) et d&#8217;exploitation (OPS) autour d&#8217;une vision commune orientée &laquo;&nbsp;service&nbsp;&raquo;, afin de mieux concilier réactivité et qualité de service.</p><p>DevOps aborde le paradoxe entre des équipes projets qui cherchent à livrer toujours plus fréquemment des nouvelles fonctionnalités d&#8217;une part et d&#8217;autre part des équipes d&#8217;exploitation qui cherchent à stabiliser et fiabiliser les systèmes tout en maitrisant leur coût.</p><p>On peut décrire DevOps selon trois axes :</p><ul><li><b>Aligner l&#8217;exploitation sur les enjeux métiers</b> comme l&#8217;agilité a déjà aligné le développement sur le métier.</li><li><b>Aligner le développement sur les réalités de l&#8217;exploitation</b> pour rendre possible la mise en production, la disponibilité et la fiabilité des fonctionnalités métier.</li><li>La <b>transformation du métier d&#8217;OPS</b> pour gérer des topologies chaque jour plus grosses et plus complexes avec l&#8217;adoption d&#8217;<em><a
href="http://www.agileweboperations.com/the-implications-of-infrastructure-as-code" rel="nofollow">infrastructure as code</a></em> et d&#8217;outils comme <a
href="http://www.opscode.com/chef/" rel="nofollow">Chef</a> ou <a
href="http://puppetlabs.com/puppet/puppet-enterprise/" rel="nofollow">Puppet</a>. <b>Les nouveaux OPS sont des programmeurs !</b> Ils débattent à la machine à café de <a
href="http://shop.oreilly.com/product/0636920020042.do" rel="nofollow">TDD</a>, de <a
href="http://wiki.opscode.com/display/chef/FAQ#FAQ-HowisChefdifferentthanPuppet%3F" rel="nofollow">Ruby vs. DSL</a>, <a
href="http://puppetlabs.com/blog/geppetto-a-puppet-ide/" rel="nofollow">de choix d&#8217;IDE</a>, de Git vs. SVN, &#8230;</li></ul><p>DevOps est souvent associé à la mise en place d&#8217;un processus de <a
href="http://java.dzone.com/articles/8-principles-continuous" rel="nofollow">Continuous Delivery</a> qui, dans la mouvance <em>Lean</em>, vise à déployer les fonctionnalités en production au plus vite et de maximiser les feedbacks. Nous reviendrons dans un autre billet sur les processus de Continuous Delivery.</p><p>La mise en place d&#8217;une culture DevOps touche les humains, les processus et les outils. Nous proposons une démarche englobant ces trois aspects en prenant comme point d&#8217;entrée les processus et, de proche en proche, faire évoluer les humains et les outils.</p><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Lesprocessus"></a>Les processus</h3><p>Tous les processus impliquant la collaboration des équipes de développement et d&#8217;exploitation sont sujets à la mise en place d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo;. Nous  proposons pour la première étape de nous focaliser sur les processus de livraison, de déploiement et de <em>troubleshooting</em>.</p><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processusdelivraison"></a>Processus de livraison</h4><p>Le processus de livraison (aka processus de <em>packaging</em> de la <em>release</em>) est la première interaction entre les équipes de développement et de production. Ses défauts causent l&#8217;allongement des projets et des interruptions de service. A l&#8217;inverse, <b>l&#8217;automatisation du processus de livraison concilie</b> <b><em>&laquo;&nbsp;time to market&nbsp;&raquo;</em> et diminution des risques en déployant plus fréquemment des changements au périmètre limité.</b></p><p>Nous proposons d&#8217;accorder les équipes de développement et d&#8217;exploitation sur les points suivants :</p><ul><li><b>Périmètre du</b> <b><em>package</em></b> pour éviter les transformations et manipulations de mise en production : binaires identiques sur tous les environnements, fichiers de configurations épurées, etc.</li><li><b>Rôles et responsabilités des équipes de développement et d&#8217;exploitation dans le</b> <b><em>packaging</em></b> : binaires pour les développeurs, scripts et paramètres de configuration gouvernés par l&#8217;exploitation, etc.</li><li><b>Définition des outils et techniques de</b> <b><em>packaging</em></b> : tag Subversion/Git, build Maven, <em>repository</em> Maven Nexus, etc.</li><li><b>Alignement des environnements</b> de développement, d&#8217;intégration et de production pour éviter les écarts dev/prod : on doit tester sur un environnement le plus <em>iso-prod</em> possible.</li></ul><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processus%26nbsp%3Bd%C3%A9ploiement%26nbsp%3B"></a>Processus déploiement </h4><p>Une fois le <em>packaging</em> clarifié, nous proposons d&#8217;<b>automatiser et d&#8217;unifier les processus de déploiement du</b> <b><em>dev</em></b> <b>à la</b> <b><em>prod</em></b>. Les bénéfices sont :</p><ul><li><b>L&#8217;accélération des</b> <b><em>feedbacks</em></b> des équipes de Q&amp;A par des déploiements plus fréquents sur les environnements de validation.</li><li><b>La fiabilisation des déploiements</b> en les testant avant la mise en production.</li></ul><p>L&#8217;objectif est la banalisation : <b>les déploiements deviennent des &laquo;&nbsp;non événements&nbsp;&raquo;</b>.</p><h4><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Processusdetroubleshootingetdediagnostique"></a>Processus de <em>troubleshooting</em> et de diagnostique</h4><p>Réussir l&#8217;analyse de problèmes en production nécessite une préparation et un entrainement conjoints des équipes d&#8217;exploitation et de développement.</p><p>Des répétitions impliquant à la fois OPS et DEV permettront de valider :</p><ul><li>Que les applications sont <em>debuggables</em> : clarté des messages de log, clarté des exceptions, indicateurs de monitoring (JMX), etc.</li><li>Que les outils de diagnostique sont installés : activation et collecte de logs, accès sans problèmes de firewall, disponibilité des outils sur les serveurs (curl, screen, jstat, jmap, etc.).</li><li>Que les OPS et les DEV ont les bons outils de collaboration lors de problèmes en production : accès en lecture seule pour les DEV, messagerie instantanée, partage d&#8217;écran, micro-casques, etc.</li></ul><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-Am%C3%A9liorationcontinuedev%2Fprod"></a>Amélioration continue <em>dev/prod</em></h3><p>Les sujets d&#8217;amélioration continue transverse développement / exploitation sont gérés à la fois dans la continuité avec des réunions &laquo;&nbsp;dev/prod&nbsp;&raquo;, et lors d&#8217;événements particuliers sous forme de points &laquo;&nbsp;<em>post mortem</em>&nbsp;&raquo; (panne, mise en production importante, etc.). Les sujets abordés relèvent d&#8217;enjeux à court, moyen et long terme :</p><ul><li><b>Monitoring &amp; KPI</b> : mise en place d&#8217;indicateurs techniques et métiers de bonne santé des applications (choix des outils, adaptation du code métier, <em>health checks</em>, etc.).</li><li><b>Gestion des logs et des exceptions</b> : amélioration des messages, outils de concentration et d&#8217;analyse de logs.</li><li><b>Robustesse, tenue à la charge et</b> <b><em>capacity planning</em></b> : suppression des points de faiblesse, mise en place de modes dégradés et de mécanismes de protection contre les saturations (e.g. : <em>circuit breaker pattern</em>), plans d&#8217;action de test en charge, plan d&#8217;ajout de capacité.</li><li><b>Sécurité</b> : <em>patchs</em> à appliquer, règles de sécurité de l&#8217;entreprise, etc.</li><li><b>Fiabilisation des mises en production</b> : activation progressive (<em><a
href="http://martinfowler.com/bliki/FeatureToggle.html" rel="nofollow">feature toggle</a></em><em>)</em> ou partielle (<em>canary testing</em>) de fonctionnalités, etc.</li><li><b>Processus et outillage</b> : amélioration des processus dev/prod, alignement et partage des outils.</li><li><b>Suivi du schéma directeur</b> : gestion des montées de version des middlewares, migrations techniques, rationalisation des environnements.</li><li><b>Evolutions de l&#8217;application et de l&#8217;infrastructure</b> : <em>refactoring</em> de l&#8217;infrastructure, introduction de nouvelles technologies, plan de montée en compétence.</li></ul><h3><a
name="DRAFT-MiseenplaceduneorganisationDevOps-L%27organisation%3AYoubuildit%2Cyourunit%3F"></a>L&#8217;organisation : <em>You build it, you run it</em> ?</h3><p>L&#8217;organisation est le sujet le plus complexe à aborder dans la mise en place d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo;. Certaines entreprises comme Amazon ont intégré les équipes de développement et de production au point d&#8217;avoir pour devise &laquo;&nbsp;You build it, you run it&nbsp;&raquo;.</p><p>Un point essentiel est de s&#8217;assurer que les objectifs des différents acteurs soient alignés vers une amélioration de la disponibilité et de l&#8217;évolutivité des applications. Si les intérêts des uns et des autres sont contradictoires et ne sont pas alignés sur ce même objectif, l&#8217;adoption d&#8217;une culture &laquo;&nbsp;DevOps&nbsp;&raquo; touchera vite ses limites.</p><p>Nous proposons d&#8217;étudier les changement organisationnels au fur et à mesure de la mise en place des principes DevOps dans les processus que nous avons cité en veillant à prendre en compte les réalités de chaque entreprise.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2012/01/09/mise-en-place-d-une-organisation-devops/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Soiree Cloud avec Sacha Labourey, CEO and Founder CloudBees</title><link>http://blog.xebia.fr/2011/11/10/soiree-cloud-avec-sacha-labourey-ceo-and-founder-cloudbees/</link> <comments>http://blog.xebia.fr/2011/11/10/soiree-cloud-avec-sacha-labourey-ceo-and-founder-cloudbees/#comments</comments> <pubDate>Thu, 10 Nov 2011 07:28:26 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[CloudBees]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=9022</guid> <description><![CDATA[Public Cloud, Private Cloud, Hybrid Cloud, Infrastructure as a Service, Platform as a Service, Software as a Service, &#8230; Nous vous invitons le 23 Novembre 2011 à 19h30 à décrypter ces mots à la mode avec Sacha Labourey, CEO et fondateur CloudBees, ex CTO JBoss. Après une présentation du Cloud Computing et (brièvement) de l’offre [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.cloudbees.com/sites/default/files/imagecache/bio_photo/SL_Final_3_1.jpg" alt="Sacha Labourey" title="Sacha Labourey" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <img
src="http://www.cloudbees.com/sites/all/themes/custom/cloudbees_zen/logo-color.png" alt="cloudbees" title="cloudbees" style="margin: 1em 1em 1em 1em; float: right; clear:right;" /></p><p>Public Cloud, Private Cloud, Hybrid Cloud, Infrastructure as a Service, Platform as a Service, Software as a Service, &#8230;</p><p>Nous vous invitons le <b>23 Novembre 2011</b> à 19h30 à décrypter ces mots à la mode avec <a
href="http://www.cloudbees.com/company-team.cb" rel="nofollow">Sacha Labourey</a>, CEO et fondateur <a
href="http://www.cloudbees.com/" rel="nofollow">CloudBees</a>, ex CTO JBoss.<br
/> Après une présentation du Cloud Computing et <em>(brièvement)</em> de l’offre CloudBees, <b>Sacha Labourey</b> répondra à vos questions.</p><p>Voici notre première série :</p><ul><li>Pourquoi le cloud est-il arrivé ?</li><li>Quels bénéfices attendre du cloud ? Pour les départements études / développement ? Pour les départements exploitation / production ?</li><li>A quel rythme les organisations vont-elle être impactées par le cloud ? Les changements à court terme ? Les transformations à long terme ?</li><li>Comment préparer son organisation à l&#8217;arrivée du cloud ? Côté développement ? Côté exploitation ?</li></ul><p>Sans oublier nos questions provocatrices :</p><ul><li>Le cloud, est-ce la mort du métier d&#8217;administrateur système ?</li><li>Le PaaS est magique ? Les middlewares sont devenus zero-administration et self-tuning ?</li><li>Rupture totale ou évolution dans la lignée de tendances comme la virtualisation ?</li></ul><p>La soirée terminera par un cocktail pendant lequel des consultants <b>CloudBees</b> et <b>Xebia</b> pourront vous faire des démonstrations.</p><p><b>L&#8217;inscription sur EventBrite est <a
href="http://xfr-cloud-sacha-labourey.eventbrite.com/" rel="nofollow">ici</a></b>. Retrouvez les événements Xebia sur <a
href="http://blog.xebia.fr/tech-event/" rel="nofollow">blog.xebia.fr/tech-event</a>.</p><p><strong>Les vidéos de la soirées :</strong></p><ul><li><a
href="http://blog.xebia.fr/2011/12/08/video-de-la-presentation-de-sacha-labourey-sur-le-cloud/">Vidéo de la présentation de Sacha Labourey sur le Cloud</li><li><a
href="http://blog.xebia.fr/2011/12/16/questions-reponses-sur-le-cloud-avec-sacha-labourey-et-cyrille-leclerc-episode-1/">Questions-Réponses sur le Cloud avec Sacha Labourey et Cyrille Le Clerc – Épisode 1</li><li><a
href="http://blog.xebia.fr/2011/12/22/questions-reponses-sur-le-cloud-avec-sacha-labourey-et-cyrille-leclerc-episode-2/">Questions-Réponses sur le Cloud avec Sacha Labourey et Cyrille Le Clerc – Épisode 2</li><li><a
href="http://blog.xebia.fr/2012/01/05/questions-reponses-sur-le-cloud-avec-sacha-labourey-et-cyrille-leclerc-episode-3/">Questions-Réponses sur le Cloud avec Sacha Labourey et Cyrille Le Clerc – Épisode 3</li><li><a
href="http://blog.xebia.fr/2012/01/23/questions-reponses-sur-le-cloud-avec-sacha-labourey-et-cyrille-le-clerc-episode-4/">Questions-Réponses sur le Cloud avec Sacha Labourey et Cyrille Le Clerc – Épisode 4</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/11/10/soiree-cloud-avec-sacha-labourey-ceo-and-founder-cloudbees/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Atelier &#8211; Concevez une application DataGrid NoSQL hautement scalable avec Nati Shalom</title><link>http://blog.xebia.fr/2011/10/04/atelier-concevez-une-application-datagrid-nosql-hautement-scalable-avec-nati-shalom/</link> <comments>http://blog.xebia.fr/2011/10/04/atelier-concevez-une-application-datagrid-nosql-hautement-scalable-avec-nati-shalom/#comments</comments> <pubDate>Tue, 04 Oct 2011 12:16:51 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Tech Events]]></category> <category><![CDATA[Gigaspace]]></category> <category><![CDATA[Grid]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8771</guid> <description><![CDATA[Vous aimez regarder les présentations NoSQL et Data Grid sur Internet ? Nous aussi mais nous voulions plus&#160;! C’est pourquoi nous avons demandé à Nati Shalom, CTO et fondateur Gigaspaces, de venir animer une session de design d’une application DataGrid / NoSQL hautement scalable en reprenant un cas d’utilisation de la vraie vie. Ce ne [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/10/logo-giga-spaces.png" style="border: 0px solid black" /></p><p><span
style="float: right"><img
src="http://blog.xebia.fr/wp-content/uploads/2011/10/nati-shalom.png" style="border: 0px solid black; margin: 1em 1em 1em 1em;" /></span><br
/> Vous aimez regarder les présentations NoSQL et Data Grid sur Internet ?<br
/> Nous aussi mais nous voulions plus&nbsp;!</p><p>C’est pourquoi nous avons demandé à <a
href="http://www.gigaspaces.com/ExecutiveManagement" rel="nofollow">Nati Shalom</a>, CTO et fondateur <a
href="http://www.gigaspaces.com/" rel="nofollow">Gigaspaces</a>, de venir animer une <b>session de design d’une application DataGrid / NoSQL hautement scalable</b> en reprenant un cas d’utilisation de la vraie vie.</p><p>Ce ne sera pas la conception d’un autre, ce sera notre design influencé par une des stars du domaine !</p><p>Cet atelier aura lieu le <b>lundi 5 décembre</b>. Nous travaillons avec Nati pour préciser le type d&#8217;application à modéliser et les détails de l&#8217;événement. Pour le cas d&#8217;utilisation, nous pensons bien sûr à modéliser le cas d&#8217;école Twitter mais nous réfléchissons aussi aux systèmes de réservation de trains et d&#8217;avions, aux jeux d&#8217;argent en ligne, aux jeux massivement parallèles ou encore à l&#8217;<em>electronic trading</em>. Nous vous tiendrons informés par <a
href="http://twitter.com/#!/XebiaFr" rel="nofollow">Twitter</a> et sur <a
href="http://blog.xebia.fr/tech-event/" rel="nofollow">la page des Tech Event Xebia</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/10/04/atelier-concevez-une-application-datagrid-nosql-hautement-scalable-avec-nati-shalom/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Gestion des ressources par Cyrille Le Clerc</title><link>http://blog.xebia.fr/2011/07/06/gestion-des-ressources-par-cyrille-le-clerc/</link> <comments>http://blog.xebia.fr/2011/07/06/gestion-des-ressources-par-cyrille-le-clerc/#comments</comments> <pubDate>Wed, 06 Jul 2011 14:06:24 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[vidéo]]></category> <category><![CDATA[XKE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8131</guid> <description><![CDATA[Si vous êtes lecteur de notre blog, vous avez probablement entendu parler des journées XKE. Organisées une fois par mois, cette journée est dédiée aux échanges techniques et humains entre les consultants. Nous souhaitons partager avec vous l&#8217;une de ces sessions en vidéo. La session, animée par Cyrille Le Clerc, concerne la gestion des ressources [...]]]></description> <content:encoded><![CDATA[<p>Si vous êtes lecteur de notre blog, vous avez probablement entendu parler des <a
href="http://blog.xebia.fr/tag/xke/" title="journées XKE" >journées XKE</a>. Organisées une fois par mois, cette journée est dédiée aux échanges techniques et humains entre les consultants. Nous souhaitons partager avec vous l&#8217;une de ces sessions en vidéo. La session, animée par <a
href="http://blog.xebia.fr/author/cleclerc/" title="Cyrille Le Clerc" >Cyrille Le Clerc</a>, concerne la gestion des ressources en Java, et plus particulièrement leur fermeture.</p><div
id="player-gestion-des-ressources" align="center">Gestion des ressources par Cyrille Le Clerc</div><p><br
/> <script type='text/javascript'>jwplayer('player-gestion-des-ressources').setup({
		'flashplayer': 	'/videos/player.swf',
		'width':	'720',
		'height':	'540',
		'file':		'http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-07-gestion-des-ressources.f4v',
		'plugins': {
		'captions-2': {
			back: false,
			file: "/videos/gestion-des-ressources.srt"
			}
		}
	});</script></p><hr/> <strong>Tous les podcasts Xebia France :</strong></p><ul><li><a
href="itpc://blog.xebia.fr/feed/podcast/" title="Subscribe to the Podcast Feed with iTunes"><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/itunes.png" class="podpress_feed_buttons" alt="Subscribe with iTunes"></a></li><li><a
href="http://blog.xebia.fr/feed/podcast/" title="Les podcasts de Xebia France vous permettent de suivre l'actualité autour de Java, de l'agilité, des technologies Web et bien d'autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile."><img
src="http://blog.xebia.fr/wp-content/plugins/podpress/images/feed_button-rss-podcast.png" class="podpress_feed_buttons" alt="Xebia France Podcast Feed"></a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/07/06/gestion-des-ressources-par-cyrille-le-clerc/feed/</wfw:commentRss> <slash:comments>7</slash:comments> <enclosure
url="http://xebia-video.s3-website-eu-west-1.amazonaws.com/2011-07-gestion-des-ressources.f4v" length="232014922" type="application/unknown" /> <itunes:duration>0:24:18</itunes:duration> <itunes:subtitle>Si vous êtes lecteur de notre blog, vous avez probablement entendu parler des journées XKE. Organisées une fois par mois, cette journée est dédiée aux échanges techniques et humains entre les consultants. Nous souhaitons partager avec vous l&#8217;u[...]</itunes:subtitle> <itunes:summary>Si vous êtes lecteur de notre blog, vous avez probablement entendu parler des journées XKE. Organisées une fois par mois, cette journée est dédiée aux échanges techniques et humains entre les consultants. Nous souhaitons partager avec vous l&#8217;une de ces sessions en vidéo. La session, animée par Cyrille Le Clerc, concerne la gestion des ressources en Java, et plus particulièrement leur fermeture.
Gestion des ressources par Cyrille Le Clerc
Tous les podcasts Xebia France : </itunes:summary> <itunes:author>Xebia France</itunes:author> <itunes:explicit>no</itunes:explicit> <itunes:block>no</itunes:block> </item> <item><title>Deployer un artefact sur repo1.maven.org</title><link>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/</link> <comments>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/#comments</comments> <pubDate>Wed, 22 Jun 2011 17:30:28 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Artefact]]></category> <category><![CDATA[Maven]]></category> <category><![CDATA[Maven Central Repository]]></category> <category><![CDATA[repo1.maven.org]]></category> <category><![CDATA[Sonatype]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=8072</guid> <description><![CDATA[Vous avez peut-être eu l&#8217;obsession de voir « maven » en train de télécharger vos propres artefacts à partir de son repository central. Du moins vous vous êtes sûrement posé la question : mon projet est mavenisé, open source, sur une forge publique (github, googlecode, etc.) et il est destiné à être utilisé par le [...]]]></description> <content:encoded><![CDATA[<p>Vous avez peut-être eu l&#8217;obsession de voir « maven » en train de télécharger vos propres artefacts à partir de son repository central. Du moins vous vous êtes sûrement posé la question : mon projet est mavenisé, open source, sur une forge publique (github, googlecode, etc.) et il est destiné à être utilisé par le plus grand nombre ; pourquoi ne pas le publier sur le Maven Central Repository (<a
title="httprepo1mavenorg" href="http://repo1.maven.org">http://repo1.maven.org</a>) ?</p><p>Au lieu de penser à ouvrir votre Nexus sur Internet ou encore à créer votre propre repository sur Google Code ou autre, nous vous proposons de directement déployer sur le Maven Central Repository, ce qui, en plus de vous épargner l&#8217;installation d&#8217;un repository, facilitera l&#8217;utilisation de votre artefact.</p><p>Le but de ce billet est de décrire la marche à suivre pour la publication d&#8217;un artefact en passant par le repository de Sonatype. Ce dernier étant un repository approuvé pour tout projet OSS comme c&#8217;est le cas du repository Apache (pour les projets Apache) et celui du <a
title="Codehaus" href="http://repository.codehaus.org">Codehaus</a> (pour les projets Codehaus). Le fait de passer par Sonatype vous garantit d&#8217;une part, un processus de validation structurant qui impose un ensemble de points de contrôle (licence, copyright, traçabilité, etc.) augmentant ainsi la qualité des métadonnées, et d&#8217;autre part une synchronisation rapide avec le Maven Central Repository.</p><p>Il s&#8217;agit également de vous faire profiter de notre expérience sur le sujet avec le déploiement de quelques artefacts tels que <a
title="mindmap-maven-plugin" href="http://repo1.maven.org/maven2/fr/xebia/maven/plugins/mindmap-maven-plugin/">mindmap-maven-plugin</a>, <a
title="xebia-management-extras" href="http://repo1.maven.org/maven2/fr/xebia/management/xebia-management-extras/">xebia-management-extras</a>, <a
title="xebia-spring-security-extras" href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/">xebia-spring-security-extras</a> et <a
title="xebiaservletextras" href="http://repo1.maven.org/maven2/fr/xebia/web/extras/xebia-servlet-extras/">xebia-servlet-extras</a>.</p><p>Ce qui est présenté par la suite est basé principalement sur le guide officiel fourni par Sonatype: <a
title="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide" href="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide">https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide</a></p><h2><a
name="Choixdelalicenceduprojet"></a>Choix de la licence du projet</h2><p>Chacun appliquera sur son code la licence qui lui convient. C&#8217;est à la fois un choix &laquo;&nbsp;tactique&nbsp;&raquo; pour cibler ses utilisateurs et &laquo;&nbsp;philosophique&nbsp;&raquo; selon ses convictions. Pour résumer ce sujet qui mériterait un billet complet, il y a deux grandes familles de licences :</p><ul><li>les licences &laquo;&nbsp;business friendly&nbsp;&raquo; (Apache Software Licence, MIT, BSD, etc) qui facilitent l&#8217;intégration dans toute programme (y compris &laquo;&nbsp;close source&nbsp;&raquo; et commercial)</li><li>les licences &laquo;&nbsp;business unfriendly&nbsp;&raquo; (GPL, Aferro GPL, etc) qui sont qualifiées de virales et ne permettent pas l&#8217;intégration dans des logiciels &laquo;&nbsp;close source&nbsp;&raquo;</li></ul><p>Pour aller plus loin sur le sujet, nous vous recommandons <a
title="451 Chaos Group - 06/2011 : The trend towards permissive licensing" href="http://blogs.the451group.com/opensource/2011/06/06/the-trend-towards-permissive-licensing/">451 Chaos Group &#8211; 06/2011 : The trend towards permissive licensing</a> et notre récent billet <a
title="Rponses au Quizz Licences Open Source" href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/">Réponses au Quizz Licences Open Source</a>.</p><h2><a
name="Applicationdelalicencesurlesfi"></a>Application de la licence sur les fichiers de son projet</h2><ul><li>Tous les fichiers doivent porter le header de la licence</li><li>Un fichier LICENSE (<a
title="exemple" href="^LICENSE.txt">exemple</a>) à la racine doit être reporté dans les artefacts générés</li><li>Un fichier NOTICE (<a
title="exemple" href="^NOTICE.txt">exemple</a>) à la racine doit mentionner les copyrights des dépendances</li></ul><p>Si vous êtes dans le cas d&#8217;une licence APV2, vous pouvez toujours vous référer à ce lien : <a
title="Applying the license to new software" href="http://www.apache.org/dev/apply-license.html">Applying the license to new software</a>.</p><p>Le <a
title="apacheratplugin" href="http://incubator.apache.org/rat/apache-rat-plugin/">apache-rat-plugin</a> permet de vérifier la conformité du projet et peut <em>casser</em> le build dans le cas contraire.</p><p>Exemple de déclaration des ressources dans un pom maven pour intégrer les fichiers LICENSE et NOTICE dans les artefacts:</p><pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
 ...
 &lt;resources&gt;
  &lt;resource&gt;
   &lt;directory&gt;${basedir}/src/main/resources&lt;/directory&gt;
   &lt;filtering&gt;true&lt;/filtering&gt;
  &lt;/resource&gt;
  &lt;resource&gt;
   &lt;directory&gt;${basedir}&lt;/directory&gt;
   &lt;targetPath&gt;META-INF&lt;/targetPath&gt;
   &lt;includes&gt;
    &lt;include&gt;LICENSE&lt;/include&gt;
    &lt;include&gt;NOTICE&lt;/include&gt;
   &lt;/includes&gt;
  &lt;/resource&gt;
 &lt;/resources&gt;
 ...
&lt;/project&gt;
</pre><p>Exemple d&#8217;utilisation du apache-rat-plugin dans un pom maven:</p><pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
   ...
   &lt;plugin&gt;
    &lt;groupId&gt;org.apache.rat&lt;/groupId&gt;
    &lt;artifactId&gt;apache-rat-plugin&lt;/artifactId&gt;
    &lt;version&gt;0.7&lt;/version&gt;
    &lt;executions&gt;
     &lt;execution&gt;
      &lt;phase&gt;verify&lt;/phase&gt;
      &lt;goals&gt;
       &lt;goal&gt;check&lt;/goal&gt;
      &lt;/goals&gt;
     &lt;/execution&gt;
    &lt;/executions&gt;
   &lt;/plugin&gt;
   ...
&lt;/project&gt;
</pre><h2><a
name="Miseenconformitdupommaven"></a>Mise en conformité du pom maven</h2><p>Le fichier pom.xml doit obligatoirement porter les informations suivantes:</p><ul><li>&lt;modelVersion&gt;</li><li>&lt;groupId&gt;</li><li>&lt;artifactId&gt;</li><li>&lt;version&gt;</li><li>&lt;packaging&gt;</li><li>&lt;name&gt;</li><li>&lt;description&gt;</li><li>&lt;url&gt;</li><li>&lt;licenses&gt;</li><li>&lt;scm&gt;&lt;url&gt;</li><li>&lt;scm&gt;&lt;connection&gt;</li><li>&lt;developers&gt;</li></ul><p>Pour faciliter le déploiement des artifacts sur le repository <a
title="httposssonatypeorg" href="http://oss.sonatype.org">http://oss.sonatype.org</a> qui sert de <em>bac à sable</em> de validation, le plus simple est de référencer le pom parent &laquo;&nbsp;<code>org.sonatype.oss:oss-parent</code>&nbsp;&raquo; fourni par sonatype. Exemple :</p><pre class="brush: xml; title: ; notranslate">
&lt;project...&gt;
  &lt;parent&gt;
    &lt;groupId&gt;org.sonatype.oss&lt;/groupId&gt;
    &lt;artifactId&gt;oss-parent&lt;/artifactId&gt;
    &lt;version&gt;7&lt;/version&gt;
  &lt;/parent&gt;
  ...
&lt;/project&gt;
</pre><p>(?) De plus, il est fortement recommandé que le pom.xml ne référence pas de repository (cf. <a
title="Why Putting Repositories in your POMs is a Bad Idea" href="http://www.sonatype.com/people/2009/02/why-putting-repositories-in-your-poms-is-a-bad-idea/">Why Putting Repositories in your POMs is a Bad Idea</a>)</p><h2><a
name="SignaturedesartefactsavecGPG"></a>Signature des artefacts avec GPG</h2><p>Les artefacts publiés sur repo1.maven.org doivent être signés.</p><p>Le pom parent org.sonatype.oss:oss-parent utilise le <a
title="maven-gpg-plugin" href="http://maven.apache.org/plugins/maven-gpg-plugin/">maven-gpg-plugin</a> qui se base sur l&#8217;implémentation <a
title="GnuPG" href="http://www.gnupg.org/">GnuPG</a> du standard <a
title="OpenPGP" href="http://www.openpgp.org/about_openpgp/">OpenPGP</a> pour la signature des artefacts. Pour s&#8217;appuyer dessus, vous devez :</p><ul><li>Installer un client GPG (e.g. <a
title="Mac GNU Privacy Guard" href="http://macgpg.sourceforge.net/">Mac GNU Privacy Guard</a>)</li><li>Créer votre paire de clés GPG (privée/publique) (cf <a
title="GPG Quick Start" href="http://www.madboa.com/geek/gpg-quickstart/">GPG Quick Start</a> par Paul Heinlein)</li><li>Distribuer votre clé publique sur un serveur de clé PGP:</li></ul><pre class="brush: java; title: ; notranslate">
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys your_public_key_ID
</pre><ul><li>Tester votre clé avec maven-gpg-plugin:</li></ul><pre class="brush: java; title: ; notranslate">
mvn package gpg:sign -Dgpg.passphrase=PASSPHRASE
</pre><h2><a
name="Crationduncomptesurosssonatype"></a>Création d&#8217;un compte sur oss.sonatype.org</h2><p>La création d&#8217;un compte pour déployer sur oss.sonatype.org se fait en créant un compte <a
title="httpsissuessonatypeorg" href="https://issues.sonatype.org/">https://issues.sonatype.org/</a> .</p><h2><a
name="CrationdunticketJiradedemanded"></a>Création d&#8217;un ticket Jira de demande d&#8217;autorisation : obligatoire pour la première publication</h2><p>Il vous faut faire une demande à Sonatype en créant un ticket Jira de demande de publication d&#8217;artefact dans lequel on précise :</p><ul><li>Summary : description rapide du projet</li><li>GroupId	: groupId du projet Maven. Ce groupe doit reprendre le nom de domaine du projet (e.g. : fr.xebia, com.googlecode.myproject, etc.)</li><li>Project URL	: l&#8217;url du projet (e.g. <a
title="httpxebiafrancegooglecodecom" href="http://xebia-france.googlecode.com/">http://xebia-france.googlecode.com/</a></li><li>SCM URL : l&#8217;url du gestionnaire de source (e.g. <a
title="httpxebiafrancegooglecodecomsvn" href="http://xebia-france.googlecode.com/svn/">http://xebia-france.googlecode.com/svn/</a>)</li><li>Nexus Username : le ou les logins de connexion au JIRA  : <a
title="httpsissuessonatypeorg" href="https://issues.sonatype.org/">https://issues.sonatype.org/</a></li><li>Already Sync To Central : indique si des versions de l&#8217;artefact ont déjà été déployées sur le Maven Central Repository (si oui, Sonatype les réintégrera dans le fichier maven-metadata.xml)</li><li>Description : toute information complémentaire</li></ul><p>Exemple de demande :  <a
title="OSSRH995  Managements extras  jmxification of utilconcurrent  dbcp  jms Profiled annotation etc" href="https://issues.sonatype.org/browse/OSSRH-995">OSSRH-995 : Managements extras : jmx-ification of util.concurrent / dbcp / jms, @Profiled annotation, etc</a></p><h2><a
name="Dploiementdessnapshotsetdessta"></a>Déploiement des snapshots et des staging releases avec maven</h2><h3><a
name="ComplterllmentSCMaveclesinform"></a>Compléter l&#8217;élément SCM avec les informations de votre repository</h3><ul><li>Subversion:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
  ...
  &lt;scm&gt;
    &lt;connection&gt;scm:svn:http://host_name/svn/path_to_project/trunk/&lt;/connection&gt;
    &lt;developerConnection&gt;scm:svn:https://host_name/svn/path_to_project/trunk/&lt;/developerConnection&gt;
    &lt;url&gt;http://host_name/svn/path_to_project/&lt;/url&gt;
  &lt;/scm&gt;
  ...
&lt;/project&gt;
</pre><ul><li>Github:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;project&gt;
  ...
  &lt;scm&gt;
    &lt;connection&gt;scm:git:git@github.com:user/project_name.git&lt;/connection&gt;
    &lt;developerConnection&gt;scm:git:git@github.com:user/project_name.git&lt;/developerConnection&gt;
    &lt;url&gt;git@github.com:user/project_name.git&lt;/url&gt;
  &lt;/scm&gt;
  ...
&lt;/project&gt;
</pre><h3><a
name="Configurerlefichiersettingsxml"></a>Configurer le fichier settings.xml</h3><ul><li>Accès au repository nexus de sonatype:</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;sonatype-nexus-snapshots&lt;/id&gt;
      &lt;username&gt;your_jira_id&lt;/username&gt;
      &lt;password&gt;your_jira_pwd&lt;/password&gt;
    &lt;/server&gt;
    &lt;server&gt;
      &lt;id&gt;sonatype-nexus-staging&lt;/id&gt;
      &lt;username&gt;your_jira_id&lt;/username&gt;
      &lt;password&gt;your_jira_pwd&lt;/password&gt;
    &lt;/server&gt;
  &lt;/servers&gt;
  ...
&lt;/settings&gt;
</pre><ul><li>Accès au repository du code source</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;servers&gt;
    &lt;server&gt;
      &lt;id&gt;host_name_of_your_scm_url&lt;/id&gt;
      &lt;username&gt;user_name&lt;/username&gt;
      &lt;password&gt;password&lt;/password&gt;
    &lt;/server&gt;
  ...
&lt;/settings&gt;
</pre><h3><a
name="PrparerlareleaseCrationdunnouv"></a>Préparer la release: Création d&#8217;un nouveau tag sur le repository du code source</h3><pre class="brush: java; title: ; notranslate">
mvn release:prepare -Dresume=false (alternativement mvn release:clean release:prepare)
</pre><h3><a
name="Dployerlenouveautagdanslestagi"></a>Déployer le nouveau tag dans le staging repository</h3><pre class="brush: java; title: ; notranslate">
mvn release:perform -Darguments=-Dgpg.passphrase=&lt;&lt;PASSPHRASE&gt;&gt;
</pre><h2><a
name="Publicationdevotreartefactutil"></a>Publication de votre artefact : utilisation de <a
title="nexusmavenplugin" href="https://repository.sonatype.org/content/sites/maven-sites/nexus-maven-plugin/">nexus-maven-plugin</a></h2><h3><a
name="Ajouterorgsonatypepluginsdansl"></a>Ajouter org.sonatype.plugins dans la section &lt;pluginGroups&gt; du fichier settings.xml</h3><pre class="brush: xml; title: ; notranslate">
&lt;settings&gt;
  ...
  &lt;pluginGroups&gt;
    &lt;pluginGroup&gt;org.sonatype.plugins&lt;/pluginGroup&gt;
  &lt;/pluginGroups&gt;
  ...
&lt;/settings&gt;
</pre><h3><a
name="Afficherlalistedesstagingrepos"></a>Afficher la liste des staging repositories : un staging repository par artefact</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-list
</pre><p>Ce qui vous permettra d&#8217;obtenir la liste des repositories ouverts et clôturés si il en existe :</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-list.png"><img
class="aligncenter size-medium wp-image-8078" title="staging-list" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-list.png" alt="staging-list" width="600" height="200" /></a></p><h3><a
name="Clturerunstagingrepository"></a>Clôturer un staging repository</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-close
</pre><p>Sélectionnez à partir de la liste le repository à clôturer et suivre les instructions:</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-close.png"><img
class="aligncenter size-medium wp-image-8080" title="staging-close" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-close.png" alt="staging-close" width="600" height="300" /></a></p><h3><a
name="Publierlartefactactionirrversi"></a>Publier l&#8217;artefact : action irréversible (aucun update ou delete ne sera possible)</h3><pre class="brush: java; title: ; notranslate">
mvn nexus:staging-promote
</pre><p>Sélectionnez le repository à publier:</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-promote.png"><img
class="aligncenter size-medium wp-image-8081" title="staging-promote" src="http://blog.xebia.fr/wp-content/uploads/2011/06/staging-promote.png" alt="staging-promote" width="600" height="300" /></a></p><p>Vous pouvez maintenant retrouver votre actefact sur le <a
title="releases repository de Sonatype" href="https://oss.sonatype.org/content/repositories/releases/">releases repository de Sonatype</a> en attendant la synchronisation avec le repo1.maven.org qui vous permettra après quelques heures de le voir à partir du <a
title="Maven Central Repository Browser" href="http://search.maven.org/#browse">Maven Central Repository Browser</a></p><h2><a
name="Activerlasynchronisationavecle"></a>Activer la synchronisation avec le repository central repo1.maven.org</h2><p>Pour une première publication, vous avez besoin de compléter le ticket JIRA précédemment créé par un commentaire afin de communiquer à Sonatype que votre staging repository est passé en &laquo;&nbsp;released&nbsp;&raquo;. Après étude, Sonatype activera la synchronisation centrale et fermera votre ticket.</p><p>Désormais, vos futures publications seront synchronisées automatiquement (pas besoin de création de ticket JIRA pour les prochaines releases).</p><h2><a
name="EtlimpactduclashentreSonatypee"></a>Et l&#8217;impact du clash entre Sonatype et la Fondation Apache dans tout ça ?</h2><p>La Fondation Apache et la société Sonatype sont en grand froid en ce moment (<a
title="Maven Dev Mailing List  PMC change explanation" href="http://maven.40175.n5.nabble.com/PMC-change-explanation-tt4495131.html#none">Maven Dev Mailing List : PMC change explanation</a>). Nous ne polémiquerons pas sur le sujet. Nous n&#8217;avons pas vu d&#8217;impact sur la publication d&#8217;artefacts sur la Maven Central Repository (maven.org est géré par Sonatype, et non par la Fondation Apache).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/06/22/deployer-un-artefact-sur-repo1-maven-org/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Présentation &#171;&#160;In Memory Data Grids in Action&#160;&#187; au Paris NoSQL User Group</title><link>http://blog.xebia.fr/2011/05/27/presentation-in-memory-data-grids-in-action-au-paris-nosql-user-group/</link> <comments>http://blog.xebia.fr/2011/05/27/presentation-in-memory-data-grids-in-action-au-paris-nosql-user-group/#comments</comments> <pubDate>Fri, 27 May 2011 06:36:25 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Coherence]]></category> <category><![CDATA[Data Grid]]></category> <category><![CDATA[Oracle]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7897</guid> <description><![CDATA[Voici la présentation &#171;&#160;In Memory Data Grids in Action with Oracle Coherence&#160;&#187; que j&#8217;ai faite lundi 23 Mai au Paris No SQL User Group. Pour la partie &#171;&#160;transactions &#038; eXtreme Transaction Processing (XTP)&#160;&#187; qui est une caractéristique remarquable des datagrids et que nous n&#8217;avons hélas pas eu le temps d&#8217;aborder, je vais voir avec Olivier [...]]]></description> <content:encoded><![CDATA[<p>Voici la présentation &laquo;&nbsp;In Memory Data Grids in Action with Oracle Coherence&nbsp;&raquo; que j&#8217;ai faite lundi 23 Mai au Paris No SQL User Group.</p><p>Pour la partie &laquo;&nbsp;transactions &#038; eXtreme Transaction Processing (XTP)&nbsp;&raquo; qui est une caractéristique remarquable des datagrids et que nous n&#8217;avons hélas pas eu le temps d&#8217;aborder, je vais voir avec Olivier Malassi si nous pouvons trouver une autre date.</p><p>Merci encore à tous ceux qui sont venus, merci pour toutes les questions et remarques qui ont permis d&#8217;enrichir la soirée. J&#8217;espère que vous avez passé un aussi bon moment que moi.</p><div
style="width:100%; text-align:center" id="__ss_8102777"> <strong
style="display:block;margin:12px 0 4px"><a
href="http://www.slideshare.net/XebiaFrance/paris-nosql-user-group-in-memory-data-grids-in-action-without-transactions-chapter-8102777" title="Paris NoSQL User Group - In Memory Data Grids in Action (without transactions chapter)">Paris NoSQL User Group &#8211; In Memory Data Grids in Action (without transactions chapter)</a></strong><br
/> <iframe
src="http://www.slideshare.net/slideshow/embed_code/8102777" width="595" height="497" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p><div
style="padding:5px 0 12px"> View more <a
href="http://www.slideshare.net/">presentations</a> from <a
href="http://www.slideshare.net/XebiaFrance">Xebia France</a></div></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/27/presentation-in-memory-data-grids-in-action-au-paris-nosql-user-group/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Présentation &#171;&#160;NoSQL and In Memory Data Grids from a developer perspective&#160;&#187; à GeeCon 2011</title><link>http://blog.xebia.fr/2011/05/26/presentation-nosql-and-in-memory-data-grids-from-a-developer-perspective-a-geecon-2011/</link> <comments>http://blog.xebia.fr/2011/05/26/presentation-nosql-and-in-memory-data-grids-from-a-developer-perspective-a-geecon-2011/#comments</comments> <pubDate>Thu, 26 May 2011 14:20:34 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Data Grid]]></category> <category><![CDATA[GeeCon]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7884</guid> <description><![CDATA[Vous trouverez ci dessous les slides de &#171;&#160;NoSQL and In Memory Data Grids from a developer perspective&#160;&#187;, le sujet que nous avons présenté à GeeCon 2011. Merci encore à tous ceux qui sont venus, merci aux organisateurs. Et pour tous ceux qui ne sont pas venus à Cracovie, nous vous recommandons cette très belle conférence [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/logo_haslo.png" border="0" alt="GeeCon 2011" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Vous trouverez ci dessous les slides de &laquo;&nbsp;NoSQL and In Memory Data Grids from a developer perspective&nbsp;&raquo;, le sujet que nous avons présenté à <a
href="http://2011.geecon.org/main/home" title="GeeCon 2011" >GeeCon 2011</a>.</p><p>Merci encore à tous ceux qui sont venus, merci aux organisateurs. Et pour tous ceux qui ne sont pas venus à Cracovie, nous vous recommandons cette très belle conférence !</p><hr
/><p>Here is the &laquo;&nbsp;NoSQL and In Memory Data Grids from a developer perspective&nbsp;&raquo; presentation we made at <a
href="http://2011.geecon.org/main/home" title="GeeCon 2011" >GeeCon 2011</a>.</p><p>Thanks to all the people who came to listen to us, thanks to the organization team and for those who didn&#8217;t come to Krakow, we recommend you this wonderful conference!</p><div
style="width:100%; text-align:center" id="__ss_7986604"> <strong
style="display:block;margin:12px 0 4px"><a
href="http://www.slideshare.net/XebiaFrance/geecon-2011-nosql-and-in-memory-data-grid" title="GeeCon 2011 - NoSQL and In Memory Data Grids from a developer perspective">GeeCon 2011 &#8211; NoSQL and In Memory Data Grids from a developer perspective</a></strong><br
/> <iframe
src="http://www.slideshare.net/slideshow/embed_code/7986604?rel=0" width="595" height="497" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p><div
style="padding:5px 0 12px"> View more <a
href="http://www.slideshare.net/">presentations</a> from <a
href="http://www.slideshare.net/XebiaFrance">Xebia France</a></div></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/26/presentation-nosql-and-in-memory-data-grids-from-a-developer-perspective-a-geecon-2011/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Soirée Oracle Coherence et In Memory Data Grid inter-continentales au Paris NoSQL User Group le 23 mai</title><link>http://blog.xebia.fr/2011/05/17/soiree-oracle-coherence-et-in-memory-data-grid-inter-continentales-au-paris-nosql-user-group-le-23-mai/</link> <comments>http://blog.xebia.fr/2011/05/17/soiree-oracle-coherence-et-in-memory-data-grid-inter-continentales-au-paris-nosql-user-group-le-23-mai/#comments</comments> <pubDate>Tue, 17 May 2011 12:17:36 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Coherence]]></category> <category><![CDATA[Data Grid]]></category> <category><![CDATA[Oracle]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7736</guid> <description><![CDATA[Les grilles de données mémoire sont de plus en plus utilisées en finance de marché et dans le monde de l&#8217;eXtreme Transaction Processing (gestion de stock de sites de eCommerce, systèmes de réservation informatiques / GDS , etc). Je présenterai lundi 23 Mai au Paris NoSQL User Group un retour d&#8217;expérience sur un projet de [...]]]></description> <content:encoded><![CDATA[<p>Les grilles de données mémoire sont de plus en plus utilisées en finance de marché et dans le monde de l&#8217;<a
href="http://en.wikipedia.org/wiki/Extreme_Transaction_Processing" title="eXtreme Transaction Processing" >eXtreme Transaction Processing</a> (gestion de stock de sites de eCommerce, <a
href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_r%C3%A9servation_informatique" title="systèmes de réservation informatiques" >systèmes de réservation informatiques</a> / <a
href="http://en.wikipedia.org/wiki/Computer_reservations_system" title="GDS" >GDS</a> , etc).</p><p>Je présenterai lundi 23 Mai au Paris NoSQL User Group un retour d&#8217;expérience sur un projet de grille de données inter-continentale avec Oracle Coherence.</p><h4><a
name="Auprogramme"></a>Au programme</h4><ul><li>Valeur ajoutée d&#8217;une <em>In Memory Data Grid</em> (IMDG) dans une application d&#8217;informatique de gestion</li><li>Intégration d&#8217;une IMDG dans une application existante :<ul><li>Adaptation d&#8217;impédance : &laquo;&nbsp;modèle relationnel&nbsp;&raquo; versus &laquo;&nbsp;modèle hashtable / key-value store&nbsp;&raquo;.</li><li>Réutilisation des services métiers et asynchronisme des écritures en SGBD.</li></ul></li><li>Patterns de programmation avec une IMDG :<ul><li>Modélisation des données, Domain Driven Design et traitements au cœur des données.</li><li>Search = code !</li></ul></li><li>Évolutivité d&#8217;une IMDG : &laquo;&nbsp;<code>alter table add column</code>&nbsp;&raquo; versus &laquo;&nbsp;versionning des structures de données&nbsp;&raquo;.</li><li>Réplication inter-continentale :<ul><li>Mise en œuvre du théorème CAP : l&#8217;abaissement de la consistance.</li><li>Techniques de réplication et de résolution des collisions.</li></ul></li><li>Conclusion &#8211; Maturité des In Memory Data Grids :<ul><li>Quelle place dans le Système d&#8217;Information ? Entrepôts de données durable ou représentations optimisées de données stockées ailleurs ?</li><li>Technologie réservée à une élite chevronnée ou accessible à tous ?</li></ul></li></ul><h4><a
name="Logistique"></a>Logistique</h4><ul><li>L&#8217;heure : lundi 23 mai à 19h00.</li><li>L&#8217;adresse : OCTO Technology, 50 avenue des champs E lysées, 75008 Paris.</li><li>L&#8217;annonce sur le site du Paris NoSql User Group <a
href="https://sites.google.com/a/octo.com/nosql/23-05-2011-coherence" title="In Memory Data Grids  Retour dexprience Oracle Coherence" >In Memory Data Grids &#8211; Retour d&#8217;expérience Oracle Coherence</a>.</li><li>Inscriptions : nous vérifions mais il ne semble pas y avoir de mécanisme d&#8217;inscription.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/17/soiree-oracle-coherence-et-in-memory-data-grid-inter-continentales-au-paris-nosql-user-group-le-23-mai/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Réponses au Quizz Licences Open Source</title><link>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/</link> <comments>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#comments</comments> <pubDate>Mon, 16 May 2011 15:42:42 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[Open Source]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7723</guid> <description><![CDATA[A l&#8217;occasion de la rétrospective de notre XKE de Mai (notre journée mensuelle de partage de la connaissance), nous vous avions proposé un Quizz sur les licences Open Source. Merci à Noël Rocher (Red Hat / Jboss) pour l&#8217;éclairage officiel sur RHEL, à Bertrand Dechoux pour ses investigations sur iText, à Steve Klouvi pour les [...]]]></description> <content:encoded><![CDATA[<p>A l&#8217;occasion de la rétrospective de notre XKE de Mai <em>(notre journée mensuelle de partage de la connaissance)</em>, nous vous avions proposé un <a
href="http://blog.xebia.fr/2011/05/09/retrospective-de-notre-xke-de-mai/#QuizzlicencesOpenSource" title="Quizz sur les licences Open Source" >Quizz sur les licences Open Source</a>. Merci à Noël Rocher <em>(Red Hat / Jboss)</em> pour l&#8217;éclairage officiel sur RHEL, à Bertrand Dechoux pour ses investigations sur iText, à Steve Klouvi pour les licences Linux, gcc autre posix. Voici les réponses !</p><ul><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Commentdesditeurscommerciauxpe">Réponse 1</a> : Comment des éditeurs commerciaux peuvent-ils distribuer des programmes «&nbsp;close source&nbsp;» pour Linux alors que Linux utilise la licence «&nbsp;business unfriendly&nbsp;» GPL qui est censée être «&nbsp;contaminante&nbsp;»&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Commentahrefhttpfrwikipediaorg">Réponse 2</a> : Comment <a
href="http://fr.wikipedia.org/wiki/CentOS" title="CentOS" >CentOS</a> peut-il distribuer gratuitement une version de Linux qui reprend quasiment toute la distribution payante <a
href="http://fr.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" title="Red Hat Enterprise Linux" >Red Hat Enterprise Linux</a>&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#Pourquoiaijeledroitdedistribue">Réponse 3</a> : Pourquoi ai-je le droit de distribuer un logiciel «&nbsp;close source&nbsp;» qui embarque une JVM OpenJDK alors que celle-ci utilise la licence «&nbsp;contaminante&nbsp;» dérivée de la GPL&nbsp;? Ai-je ce droit sur toutes les plateformes&nbsp;? Y compris sur les terminaux mobiles&nbsp;?</li><li><a
href="http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/#LahrefhttpfrwikipediaorgwikiAf">Réponse 4</a> : L&#8217;<a
href="http://fr.wikipedia.org/wiki/Affero_General_Public_License" title="Affero General Public License" >Affero General Public License</a> (aka Affero GPL) étend la notion de distribution de la licence GPL à la distribution sur le réseau. Quel est l’impact sur des sites web accessibles sur Internet&nbsp;? Citer une librairie Java très connue licenciée sous AGPL&nbsp;? Utilisez-vous iText&nbsp;?</li></ul><h4><a
name="Commentdesditeurscommerciauxpe"></a>Comment des éditeurs commerciaux peuvent-ils distribuer des programmes «&nbsp;close source&nbsp;» pour Linux alors que Linux utilise la licence «&nbsp;business unfriendly&nbsp;» GPL qui est censée être «&nbsp;contaminante&nbsp;»&nbsp;?</h4><p>L&#8217;essentiel du code source de Linux est distribué sous la licence <em>business unfriendly</em> <a
href="http://en.wikipedia.org/wiki/GNU_General_Public_License" title="GPL" >GPL</a> qui est contaminante et requiert donc que le code qui lui est <em>linké</em> soit distribué sous une licence compatible GPL avec le code source disponible.</p><p>Cependant, pour s&#8217;exécuter sur Linux, un programme n&#8217;a pas besoin d&#8217;être compilé et/ou <em>linké</em> à ce code <em>contaminant</em> ; il lui suffit d&#8217;être compilé et linké sur les API <a
href="http://en.wikipedia.org/wiki/POSIX" title="POSIX / "Portable Operating System Interface for Unix"" >POSIX / &laquo;&nbsp;Portable Operating System Interface for Unix&nbsp;&raquo;</a> (e.g. <a
href="http://www.opensource.apple.com/source/file_cmds/file_cmds-45/pax/cpio.h" title="cpio.h" >cpio.h</a>) qui ont une licence non contaminante <a
href="http://en.wikipedia.org/wiki/BSD_licenses" title="BSD" >BSD</a> (en plus de licences LGPL et GPL) ou sur des librairies aux licences non contaminantes comme <a
href="http://en.wikipedia.org/wiki/GNU_C_Library" title="glibc" >glibc</a> (licence <a
href="http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License" title="LGPL" >LGPL</a>). Quant au compilateur <a
href="http://en.wikipedia.org/wiki/GCC" title="GCC" >GCC</a>, il ne contamine pas non plus avec sa <a
href="http://www.gnu.org/licenses/gcc-exception.html" title="GCC Runtime Library Exception" >GCC Runtime Library Exception</a>.</p><h4><a
name="Commentahrefhttpfrwikipediaorg"></a>Comment CentOS peut-il distribuer gratuitement une version de Linux qui reprend quasiment toute la distribution payante Red Hat Enterprise Linux&nbsp;?</h4><p>Comme Noel Rocher (Red Hat / JBoss) nous l&#8217;a expliqué, Red Hat tient à disposition de ses clients RHEL le code source de l&#8217;OS ; c&#8217;est conforme à la licence GPL de Linux. En revanche, les logos et les termes Red Hat, RHEL, etc sont sous copyright Red Hat.</p><p>Il suffit aux membres du projet CentOS d&#8217;acheter une licence RHEL, de demander le source et de faire disparaitre les logos et termes copyrightés (RHEL, Red Hat, etc) pour constituer une version qu&#8217;ils ont le droit de distribuer gratuitement.</p><p>Il est donc possible d&#8217;obtenir une quasi-RHEL gratuitement mais on perd alors le support et les services que Red Hat propose à ses clients.</p><h4><a
name="Pourquoiaijeledroitdedistribue"></a>Pourquoi ai-je le droit de distribuer un logiciel «&nbsp;close source&nbsp;» qui embarque une JVM OpenJDK alors que celle-ci utilise la licence «&nbsp;contaminante&nbsp;» dérivée de la GPL&nbsp;? Ai-je ce droit sur toutes les plateformes&nbsp;? Y compris sur les terminaux mobiles&nbsp;?</h4><p>La JVM OpenJDK est disponible sous <a
href="http://openjdk.java.net/legal/gplv2+ce.html" title="GNU General Public License version 2 with the Classpath Exception" >GNU General Public License, version 2, with the Classpath Exception</a>. Le <strong>classpath exception</strong> protège le code qui s&#8217;exécute sur la JVM de la contamination habituelle des licences GPL. Une application peut donc être livrée avec une JVM OpenJDK sans être contaminée et donc sans devoir rendre son code source disponible sous licence compatible GPL.</p><p>Cela ressemble presque plus à une licence LGPL qu&#8217;à une licence GPL.</p><p>Pour ce qui est du monde mobile, Oracle (à l&#8217;époque Sun) n&#8217;a pas posé de <strong>classpath exception</strong> à la JVM ME (aka Mobile Edition). De ce fait, une application qui embarque une JVM ME open source d&#8217;Oracle est contaminée et doit proposer son code source sous licence compatible GPL. Cette disposition a incité les fabricants de téléphones mobiles et systèmes embarqués qui utilisaient Java ME à continuer à utiliser des JVM ME commerciale.</p><p>En revanche, rien n&#8217;interdit de bénéficier de la <strong>classpath exception</strong> en utilisant un Open JDK sur téléphone mobile ou tout autre <em><a
href="http://en.wikipedia.org/wiki/Embedded_device" title="embedded device" >embedded device</a></em>. Le <a
href="http://openjdk.java.net/projects/zero/" title="OpenJDK  Zero  Assembler Project" >OpenJDK : Zero &#8211; Assembler Project</a> travaille justement à porter OpenJDK sur les processeurs ARM qui sont communément utilisés dans les smartphones.</p><h4><a
name="LahrefhttpfrwikipediaorgwikiAf"></a>L&#8217;Affero General Public License (aka Affero GPL) étend la notion de distribution de la licence GPL à la distribution sur le réseau. Quel est l’impact sur des sites web accessibles sur Internet&nbsp;? Citer une librairie Java très connue licenciée sous AGPL&nbsp;? Utilisez-vous iText&nbsp;?</h4><p>L’<a
href="http://en.wikipedia.org/wiki/Affero_General_Public_License" title="Affero General Public License" >Affero General Public License</a> a été introduite en complément de la GPL pour <em>combler l&#8217;oubli des</em> <em><a
href="http://en.wikipedia.org/wiki/Application_service_provider" title="Application Service Providers" >Application Service Providers</a></em>.</p><p>Cette licence stipule que la distribution ne se limite pas à la forme de binaires comme le définit la licence GPL mais concerne aussi la fourniture en mode service de ce logiciel au travers d&#8217;un réseau.</p><p>De ce fait, exposer un logiciel à des clients sous forme de services web relève d&#8217;une distribution aux yeux de l&#8217;Affero GPL. Par conséquent, une application web visible sur internet qui embarque une librairie Affero GPL est contaminée et doit rendre <strong>tout</strong> son code source disponible sous licence compatible AGPL !</p><p>Avis aux utilisateurs d&#8217;<a
href="http://www.itextpdf.com/" title="iText" >iText</a> : la librairie est passée en <em>dual licensing</em> Affero GPL / commercial depuis la <a
href="http://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.0.6" title="version 5" >version 5</a>. Si vous voulez continuer à bénéficier de la <em>business friendly</em> <a
href="http://en.wikipedia.org/wiki/Mozilla_Public_License" title="Mozilla Public License" >Mozilla Public License</a>, il faut rester sur la version <a
href="http://mvnrepository.com/artifact/com.lowagie/itext/2.1.7" title="217" >2.1.7</a> d&#8217;iText (merci à Bertrand Dechoux pour l&#8217;historique).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/16/reponses-au-quizz-licences-open-source/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>NoSQL &amp; DataGrids à GeeCon 2011</title><link>http://blog.xebia.fr/2011/05/06/nosql-datagrids-a-geecon-2011/</link> <comments>http://blog.xebia.fr/2011/05/06/nosql-datagrids-a-geecon-2011/#comments</comments> <pubDate>Fri, 06 May 2011 14:25:45 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Data Grid]]></category> <category><![CDATA[GeeCon]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7665</guid> <description><![CDATA[Les bases de données relationnelles constituent le stockage de facto pour les applications d&#8217;entreprises. Toutefois, pendant les années 2000, des solutions alternatives ont émergé. Du coté des applications d&#8217;entreprises, les in-memory datagrids ont été développées pour offrir une très faible latence pour l&#8217;accès aux données, principalement pour satisfaire les besoins du marché de la finance. [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2011/05/logo_haslo.png" border="0" alt="GeeCon 2011" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> Les bases de données relationnelles constituent le stockage <em>de facto</em> pour les applications d&#8217;entreprises. Toutefois, pendant les années 2000, des solutions alternatives ont émergé.<br
/> Du coté des applications d&#8217;entreprises, les <em>in-memory datagrids</em> ont été développées pour offrir une très faible latence pour l&#8217;accès aux données, principalement pour satisfaire les besoins du marché de la finance.<br
/> Du coté du Web, des bases de données distribuées, plus tard baptisées NoSQL, ont été créées pour palier à des besoins extrêmes en termes de scalabilité et de disponibilité de quelques très grands sites. Ces deux familles de technologies méritent maintenant d&#8217;être prises en compte lors du design des applications d&#8217;entreprises.</p><p>A partir de mercredi prochain se déroulera à Cracovie en Pologne la conférence <a
href="http://2011.geecon.org/main/home" title="GeeCon" >GeeCon</a> qui s&#8217;affirme année après année comme un rendez-vous incontournable de la communauté Java en Europe de l&#8217;Est. <a
href="http://2011.geecon.org/speakerdetails/23" title="Cyrille Le Clerc" >Cyrille Le Clerc</a> et <a
href="http://2011.geecon.org/speakerdetails/22" title="Michal Figuire" >Michaël Figuière</a> y présenteront une session titrée &laquo;&nbsp;<em>NoSQL &#038; DataGrid from a Developer Perspective</em>&laquo;&nbsp;, qui aura pour but d&#8217;offrir une vision claire des spécificités de ces deux technologies afin de faciliter leur choix et leur intégration au sein d&#8217;un projet.</p><p>Les bases de données NoSQL et les DataGrids sont encore rarement étudiées simultanément, aussi nous aurons très probablement l&#8217;occasion de vous reparler de ce sujet à l&#8217;avenir !</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/05/06/nosql-datagrids-a-geecon-2011/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>14 Avril &#8211; Soirée Monitoring Pragmatique d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics</title><link>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/</link> <comments>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/#comments</comments> <pubDate>Mon, 04 Apr 2011 11:48:30 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[AppDynamics]]></category> <category><![CDATA[java]]></category> <category><![CDATA[monitoring]]></category> <category><![CDATA[soirée]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=7362</guid> <description><![CDATA[Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une &#171;&#160;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;AppDynamics&#160;&#187; . Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &#171;&#160;vraie vie&#160;&#187; [...]]]></description> <content:encoded><![CDATA[<p>Cyrille Le Clerc et Pablo Lopez ont le plaisir de vous inviter Jeudi 14 Avril à 19h00 pour une <strong>&laquo;&nbsp;Soirée Monitoring d&#8217;Applications Java avec le Fondateur et CTO d&#8217;<a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a>&nbsp;&raquo; </strong>.</p><p>Nous avons profité du passage en Europe de Jyoti Bansal pour organiser avec les équipes d&#8217;AppDynamics un événement autour du monitoring de la &laquo;&nbsp;<em>vraie vie</em>&nbsp;&raquo; .</p><p>A l&#8217;heure où l&#8217;architecture des applications d&#8217;entreprise devient de plus en plus complexe et distribuée, l&#8217;outillage dans le domaine du monitoring et du troubleshooting est un élément clé du système d&#8217;information. Notre objectif est que <strong>chacun en retire des idées immédiatement applicables et se forge une vision des problématiques que les systèmes de monitoring gèrent aujourd&#8217;hui et traiteront demain</strong>.</p><p>Après avoir consulté des Dev et des Ops des secteurs Telcos, Finance, Retail et Voyage, nous avons établi un programme reprenant des cas de notre vie quotidienne illustrés dans une application transactionnelle de eCommerce &laquo;&nbsp;réaliste&nbsp;&raquo; (1) que nous avons déployée en cluster sur 5 serveurs Amazon EC2., que nous soumettrons à diverses déconvenues courantes.</p><p><u><strong>Programme</strong></u></p><ul><li>15 minutes de <strong>présentation de la nouvelle génération de systèmes de monitoring d&#8217;applications</strong> Java (AppDynamics, dynaTrace, JXInsight)</li><li>60 minutes de démonstration de <strong>cas concrets de monitoring</strong> :<ul><li>Installation et configuration : mise en place du monitoring, auto découverte, déclaration d&#8217;indicateurs applicatifs, ajout de nouveaux serveurs au cluster,</li><li>Mise en place de <strong>tableaux de bord pour les équipes d&#8217;exploitation mais aussi de marketing et de développement</strong>,</li><li><strong>Monitoring durant les situations de crise</strong> : tableaux de bord &laquo;&nbsp;sur mesure&nbsp;&raquo; temporaires pour le management, le marketing et les équipes de troubleshooting,</li><li><strong>Monitoring au service du marketing</strong> : nous simulerons la mise en place de la sécurisation <a
title="3-D Secure" href="http://fr.wikipedia.org/wiki/3-D_Secure">3-D Secure</a> des paiements carte bleue en mode <a
title="AB Testing" href="http://en.wikipedia.org/wiki/A/B_testing">A/B Testing</a>,</li></ul></li><li><strong>La place dans l&#8217;infrastructure</strong> du système de monitoring : synergies et chevauchement avec les serveurs d&#8217;application, les systèmes de gestion de logs, etc</li><li><strong>La vision de Jyoti Bansal</strong> sur les tendances du monitoring d&#8217;application, ce à quoi nous devons nous attendre</li><li><strong>Les internes des systèmes de monitoring</strong> de nouvelles génération :<ul><li>&laquo;&nbsp;java agent embarqué&nbsp;&raquo; versus &laquo;&nbsp;agent autonome&nbsp;&raquo; versus &laquo;&nbsp;sans agent&nbsp;&raquo;,</li><li>les tableaux de bords, comment faciliter leur développement et leur utilisation à l&#8217;heure des <a
title="widgets Open Social" href="http://en.wikipedia.org/wiki/OpenSocial">widgets Open Social</a> ?</li><li>scalabilité des systèmes de monitoring à l&#8217;heure où le nombre de serveurs s&#8217;envole.</li></ul></li><li><strong>Coktail avec Jyoti et son équipe.</strong></li></ul><p>N&#8217;hésitez pas à nous proposer des questions ou des cas d&#8217;utilisation que nous ajouterons à nos préparations (cleclerc@xebia.fr et plopez@xebia.fr).</p><p><strong><u>Bio</u></strong></p><p><strong><a
title="Jyoti Bansal" href="http://www.linkedin.com/in/jyotibansal">Jyoti Bansal</a></strong> est fondateur, CEO et CTO d&#8217;AppDynamics. Il a auparavant été <em>Principal Architect</em> de Wily Introscope.</p><p><strong><a
title="AppDynamics" href="http://www.appdynamics.com/">AppDynamics</a></strong> a été fondé en 2008. Cette solution de monitoring est utilisée par des clients de la génération Internet aux infrastructures avant-gardistes comme NetFlix (1700 JVM sur Amazon EC2) mais aussi des clients plus traditionnels comme l&#8217;opérateur télécoms Swisscom, l&#8217;assureur Provinzial Insurance ou l&#8217;agence de voyage <a
title="Pricelinecom" href="http://www.priceline.com/">Priceline.com</a>.</p><p><strong><u>Organisation de la soirée</u></strong></p><p>La soirée se déroulera dans les locaux de Xebia au 156, boulevard Haussmann, 75008 Paris, à partir de 19h00.<br
/> Les inscriptions peuvent se faire :</p><ul><li>Par mail : <a
title="infoxebiatrainingfr" href="mailto:info@xebia-training.fr">info@xebia-training.fr</a></li><li>Par téléphone : 01.53.89.99.93</li></ul><p>(1) Nous avons retenu Spring Travel enrichie par les <a
title="Spring Payment Services" href="http://www.springsource.org/spring-payment">Spring Payment Services</a> et une brique &laquo;&nbsp;Anti Fraude&nbsp;&raquo; pour montrer les appels inter applications java. Le code source est disponible sous licence Apache <a
title="ici" href="http://xebia-france.googlecode.com/svn/training/production-ready-application/trunk/">ici</a> .</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2011/04/04/14-avril-soiree-monitoring-pragmatique-dapplications-java-avec-le-fondateur-et-cto-dappdynamics/feed/</wfw:commentRss> <slash:comments>30</slash:comments> </item> <item><title>Java en Production &#8211; L&#8217;audit</title><link>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/</link> <comments>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/#comments</comments> <pubDate>Wed, 25 Aug 2010 11:40:04 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[aspect]]></category> <category><![CDATA[audit]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5252</guid> <description><![CDATA[Après avoir abordé la gestion des fichiers de logs, nous continuons aujourd&#8217;hui la série &#171;&#160;Applications Java prêtes pour la Production&#160;&#187; avec l&#8217;audit. Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application. Pourquoi auditer ? Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples [...]]]></description> <content:encoded><![CDATA[<p>Après avoir abordé la gestion des <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="fichiers de logs" >fichiers de logs</a>, nous continuons aujourd&#8217;hui la série &laquo;&nbsp;Applications Java prêtes pour la Production&nbsp;&raquo; avec l&#8217;audit.</p><p>Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application.</p><h3><a
name="Pourquoiauditer"></a>Pourquoi auditer ?</h3><p>Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples suffiront à nous en convaincre :</p><ul><li>Un site web de partage de photos doit pouvoir dire qui a uploadé quelle image, depuis quelle adresse IP et à quelle date.</li><li>L&#8217;application d&#8217;administration d&#8217;un site de e-commerce doit tracer toutes les modifications de prix pour empêcher un <em>employé astucieux</em> de baisser à 1 euro le prix de son téléphone préféré le temps de passer commande.</li></ul><p>Pour revenir à des explications plus théoriques, les logs d&#8217;audit nous apportent :</p><ul><li>les informations nécessaires à la justice en cas d&#8217;infraction,</li><li>la détection d&#8217;intrusions,</li><li>la reconstitution des événements en complément des logs d&#8217;exceptions pour aider au diagnostique de problèmes.</li></ul><p>Nous nous placerons dans le cas le plus fréquent où nous ne développons pas d&#8217;outil pour consulter ces informations d&#8217;audit et où un accès direct au média de stockage (<code>grep</code> sur fichier texte, sql sur base de données, etc) suffit.</p><h3><a
name="Quefautilauditer"></a>Que faut-il auditer ?</h3><p>Dans un monde idéal, le contenu des messages serait défini avec les équipes de sécurité. En pratique, nous sommes assez seuls pour les choisir et il ne faut pas dramatiser. Si l&#8217;on ne prend pas le sujet à la légère, après quelques itérations, notre bon sens est le plus souvent suffisant.</p><p>Les éléments clefs à tracer sont :</p><ul><li>L&#8217;heure exacte : il est essentiel que les serveurs soient à l&#8217;heure pour corréler les logs des différentes briques du système d&#8217;information. Le sujet est aujourd&#8217;hui censé être banal pour les équipes système (c.f. <a
href="http://en.wikipedia.org/wiki/Network_Time_Protocol" title="NTP" >NTP</a>) et nous pouvons demander le soutien des équipes sécurité pour obtenir gain de cause.</li><li>L&#8217;action réalisée : il s&#8217;agit souvent du nom de la méthode métier appelée.</li><li>L&#8217;identifiant et/ou la valeur des données métier sensibles manipulées : souvent les <code>id</code> ou le <code>toString()</code> des paramètres d&#8217;appel.</li><li>L&#8217;auteur de la manipulation : nom de l&#8217;utilisateur connecté et son adresse ip (pour plus de détails sur l&#8217;adresse ip : <a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="XForwardedFilter" >XForwardedFilter</a> et <a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat  Adresse IP de linternaute load balancer reverse proxy et header Http XForwardedFor" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>).</li><li>La description succincte des exceptions levées pour analyser les éventuelles attaques.</li></ul><h3><a
name="Pourquoileslogsdaccsdesserveur"></a>Pourquoi les logs d&#8217;accès des serveurs http ne suffisent pas ?</h3><p>La première idée serait de se contenter des logs d&#8217;accès des serveurs web et des firewalls pour auditer les accès à nos applications ; nous n&#8217;aurions alors plus rien à faire.</p><p>Hélas, cela n&#8217;est pas suffisant car il manque dans les logs http des informations clefs :</p><ul><li>Nous n&#8217;avons pas l&#8217;identité de l&#8217;appelant : on a bien l&#8217;adresse ip mais pas le login de l&#8217;utilisateur authentifié.</li><li>Nous n&#8217;avons pas les id passés en paramètre des opérations à auditer (sauf si on fait du REST) ; en SOAP, nous n&#8217;avons même pas le nom de l&#8217;opération !</li><li>Nous n&#8217;avons pas le détail des exceptions levées par l&#8217;application.</li></ul><h3><a
name="APIFrameworkdelogvsframeworkdd"></a>API : Framework de log vs. framework dédié</h3><p>Dans un monde idéal, le framework d&#8217;audit ne devrait pas dépendre de la configuration des logs pour ne pas risquer qu&#8217;une mauvaise manipulation de ces configurations de logs ne le désactive.</p><p>En pratique, les frameworks de logs sont les briques les plus performantes et les plus matures pour traiter les besoins d&#8217;écriture d&#8217;audit et la probabilité de désactiver l&#8217;audit en faisant une mauvaise manipulation sur la configuration des logs est négligeable. Ces raisons nous amènent à utiliser <a
href="http://www.slf4j.org/" title="SLF4J" >SLF4J</a> avec <a
href="http://logback.qos.ch/" title="logback" >logback</a> ou <a
href="http://logging.apache.org/log4j/1.2/" title="log4j" >log4j</a> pour gérer l&#8217;audit.</p><p>Nous encapsulerons tout de même le logger avec une couche légère <em>packagée</em> dans la librairie <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="Xebia Spring Security Extras" >Xebia Spring Security Extras</a> qui ajoutera au message l&#8217;identité de l&#8217;internaute et son adresse IP (via <a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a>). Cette librairie offre une gestion déclarative de l&#8217;audit avec une annotation <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/Audited.java">@Audited</a></code>, son aspect associé <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/AuditAspect.java">AuditAspect</a></code> et une classe utilitaire <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java">Auditor</a></code>. Nous ne rentrerons pas dans le débat annotations vs. code ; dans la majeure partie des projets, nous avons pu traiter la plupart de l&#8217;audit avec une annotation et seuls quelques cas ont nécessité de passer par du code.</p><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: java; title: ; notranslate">
@Audited(message = &quot;transferMoney(#{args[0].accountNumber}, #{args[1].accountNumber}, #{args[3]})&quot;)
public void transferMoney(Account from, Account to, Amount amount) throws BusinessException { ... }
</pre><p>L&#8217;attribut <code>message</code> est un pattern supportant <a
href="http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07.html" title="Spring Expression Language" >Spring Expression Language</a> définissant l&#8217;entrée insérée dans le fichier d&#8217;audit ; la date, le nom de l&#8217;utilisateur, l&#8217;adresse ip et l&#8217;exception s&#8217;il y en a une sont ajoutés au message.</p><p><strong>Fragment de configuration Spring Framework pour utiliser l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;beans ...
   xmlns:security-extras=&quot;http://www.xebia.fr/schema/xebia-spring-security-extras&quot;
   xsi:schemaLocation=&quot;...
        http://www.xebia.fr/schema/xebia-spring-security-extras http://www.xebia.fr/schema/security/xebia-spring-security-extras.xsd&quot;&gt;
   &lt;!-- enable Spring AOP --&gt;
   &lt;aop:aspectj-autoproxy/&gt;
  &lt;!-- activate the AutitAspect --&gt;
  &lt;security-extras:audit-aspect /&gt;
   ...
&lt;/beans&gt;
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... transferMoney(000652584515, 0000684651684, 187.53) by bdupont coming from 192.168.0.14
... transferMoney(000652584515, 0000684651684, 666666.00) threw '...BusinessException: debit amount greater than account balance'
   by bdupont coming from 192.168.0.14
</pre><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;utilitaire <a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java" title="Auditor" ><code>Auditor</code></a> :</strong></p><pre class="brush: java; title: ; notranslate">
public void transferMoney(...) throws BusinessException {
   ...
   Auditor.audit(&quot;Tranfer '&quot; + amount + &quot;' from &quot; + fromAccount + &quot; to &quot; + toAccount);
}
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... Transfer '187.53 euros' from Account[000652584515] to Account[0000684651684] by bdupont coming from 192.168.0.14
</pre><p>L&#8217;entrée d&#8217;audit est ajoutée dans un fichier d&#8217;audit géré par le logger spécifique <code>"fr.xebia.audit"</code> (<a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="voir cet article" >voir cet article</a> pour la configuration du logger).</p><p>Tous les détails sur l&#8217;annotation <code>@Audited</code> sont sur <a
href="https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation">@Audited Annotation</a>.</p><h4><a
name="Intgrationduframeworkdansuneap"></a>Intégration du framework dans une application</h4><p>Ce framework peut être intégré de différentes façons dans une application :</p><ul><li>Intégration Maven :<pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
   &lt;dependencies&gt;
      &lt;dependency&gt;
         &lt;groupId&gt;fr.xebia.springframework&lt;/groupId&gt;
         &lt;artifactId&gt;xebia-spring-security-extras&lt;/artifactId&gt;
         &lt;version&gt;1.1.6&lt;/version&gt;
      &lt;/dependency&gt;
      ...
   &lt;/dependencies&gt;
   ...
&lt;/project&gt;
</pre><p>Cet artifact est déployé sur le <a
href="http://repo1.maven.org/maven2/">Maven Central Repository</a>.</li><li>Téléchargement du jar <a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6.jar" title="xebia-spring-security-extras-1.1.6.jar" >xebia-spring-security-extras-1.1.6.jar</a> (<a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6-sources.jar" title="sources" >sources</a>).</li><li>En récupérant le code source disponible sous licence Open Source <a
href="http://www.apache.org/licenses/LICENSE-2.0" title="Apache Software Licence 2" >Apache Software Licence 2</a> dans le repository GitHub <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="GitHub xebia-france xebia-spring-security-extras" >https://github.com/xebia-france/xebia-spring-security-extras</a>.</li></ul><h3><a
name="Stockagefichiertextevsbasededo"></a>Stockage : fichier texte vs. base de données</h3><p>Le stockage des entrées d&#8217;audit en base de données permet sûrement une recherche plus fine des données que sur des fichiers mais cela ajoute de la complexité (déploiement, exploitation, backup) ainsi que des risques de pannes et impacte les performances. Les approches JMS présentent des contraintes similaires et l&#8217;utilisation de systèmes de logs distants comme <a
href="http://en.wikipedia.org/wiki/Rsyslog" title="rsyslog" >rsyslog</a> présentent un défi de fiabilité. Ces difficultés sont accentuées lorsqu&#8217;une application génère de gros volumes de logs (plusieurs Go/jour).</p><p><strong>Pour ces raisons, nous préférons stocker les messages d&#8217;audit dans un simple fichier.</strong> Les risques de saturation du système de fichiers sont <em>assez facilement</em> gérables par les équipes d&#8217;exploitation, les procédures d&#8217;archivage et de consultation très simples (<code>gzip</code>, <code>scp</code>, <code>grep</code>, etc) et il n&#8217;y a quasiment jamais de problème de performance, même avec des fichiers de quelques Go par jour.</p><p>Y-a-t-il un plus grand risque de perdre les données par de mauvaises manipulations ? Si une application est critique, les exploitants doivent déjà ne pas perdre les fichiers de log du système d&#8217;exploitation, des serveurs web et autres firewalls.</p><p>Pour la gestion des messages d&#8217;audit sous forme de fichier texte, nous aimons logback comme nous l&#8217;avons expliqué dans <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="Java en Production  Les fichiers de logs" >Java en Production &#8211; Les fichiers de logs</a> mais il est aussi possible d&#8217;utiliser Log4j.</p><p>Exemple de configuration Logback pour gérer les messages d&#8217;audit émis sur le logger <code>fr.xebia.audit</code> :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day --&gt;
      &lt;fileNamePattern&gt;/my-application-audit.%d{yyyyMMdd-HHmm}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;
      &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;
&lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
   &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
&lt;/logger&gt;
</pre><p>Exemple équivalent avec log4j (le <code>EnhancedPatternLayout</code> requiert log4j 1.2.16) :</p><pre class="brush: java; title: ; notranslate">
log4j.appender.auditfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.auditfile.datePattern='-'yyyyMMdd
log4j.appender.auditfile.file=${catalina.base}/logs/my-application-audit.log
log4j.appender.auditfile.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.auditfile.layout.conversionPattern=%m %throwable{short}n
log4j.logger.fr.xebia.audit=INFO, auditfile
</pre><h3><a
name="Quefairedeslogsdauditaprslesav"></a>Que faire des logs d&#8217;audit après les avoir générées ?</h3><p>Nous ne rentrerons pas plus dans les détails de la gestion des logs d&#8217;audit après leur génération par nos applications.</p><p>Ce sujet complexe présente aussi bien des aspects juridiques que de confidentialité ou encore de fiabilité. Schématiquement, on n&#8217;a pas le droit de garder indéfiniment des données personnelles, il faut restreindre leur consultation et empêcher leur modification et leur destruction par accident comme par malveillance.</p><p>Des professionnels de l&#8217;exploitation et de la sécurité sont beaucoup plus compétents que nous sur ce sujet <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><h3><a
name="Pourallerplusloin"></a>Pour aller plus loin</h3><p>Si le traitement de l&#8217;audit dans les applications vous a intéressé, nous avons aimé lire :</p><ul><li><a
href="http://itmanagement.earthweb.com/columns/article.php/3578916/The-Importance-of-Audit-Logs.htm" title="The Importance of Audit Logs" >The Importance of Audit Logs</a> par George Spafford,</li><li><a
href="http://www.slideshare.net/anton_chuvakin/nist-80092-log-management-guide-in-the-real-world" title="NIST 800-92 Log Management Guide in the Real World" >NIST 800-92 Log Management Guide in the Real World</a> et <a
href="http://www.slideshare.net/anton_chuvakin/presentations" title="lensemble des prsentations" >l&#8217;ensemble des présentations</a> de Anton Chukavin.</li></ul><h3><a
name="Synthse"></a>Synthèse</h3><p>Nous avons vu aujourd&#8217;hui une façon simple de gérer l&#8217;audit d&#8217;applications java en reposant sur le framework de log de l&#8217;application (Logback voire Log4j) pour écrire les messages dans de simples fichiers texte avec une surcouche très légère composée d&#8217;une annotation <code>@Audited</code> et d&#8217;un utilitaire <code>Auditor</code>.</p><p><strong>Historique</strong><br
/> 25/11/2010 : passage à la version 1.1.5 de la librarie xebia-spring-security-extras avec utilisation du namespace de configuration.<br
/> 20/12/2011 : xebia-spring-security-extras : passage à la version 1.1.6 et aux URLs GitHub</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/feed/</wfw:commentRss> <slash:comments>16</slash:comments> </item> <item><title>Java en Production &#8211; Les fichiers de logs</title><link>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/</link> <comments>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/#comments</comments> <pubDate>Wed, 07 Jul 2010 13:06:35 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[log4j]]></category> <category><![CDATA[logback]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5013</guid> <description><![CDATA[Tout a déjà été dit sur les logs. Pour preuve, ce n&#8217;est plus un sujet chaud, les équipes d&#8217;exploitation sont très contentes avec les logs de nos applications . D&#8217;accord, l&#8217;envers du décor est moins reluisant et il reste une marge de progression. Nous avions proposé dans Les 10 commandements des logs applicatives des suggestions [...]]]></description> <content:encoded><![CDATA[<p>Tout a déjà été dit sur les logs. Pour preuve, ce n&#8217;est plus un sujet chaud, les équipes d&#8217;exploitation sont très contentes avec les logs de nos applications <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>D&#8217;accord, l&#8217;envers du décor est moins reluisant et il reste une marge de progression. Nous avions proposé dans <a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/" title="Les 10 commandements des logs applicatives" >Les 10 commandements des logs applicatives</a> des suggestions focalisées sur le contenu des fichiers de logs ; voici aujourd&#8217;hui des propositions pour gérer les fichiers eux-mêmes. Même si le sujet peut sembler trivial, ces bonnes pratiques peuvent grandement simplifier le quotidien des équipes de production et améliorer les relations tumultueuses entre exploitants et développeurs.</p><p>Au risque de surprendre certains, les exemples de ce billet utilisent <a
href="http://logback.qos.ch/" title="Logback" >Logback</a> plutôt que le standard de-facto <a
href="http://logging.apache.org/log4j/" title="Log4j" >Log4j</a> car certaines bonnes pratiques que je proposerai sont impossibles à mettre en oeuvre avec Log4j. Aujourd&#8217;hui, je préfère utiliser Logback à Log4j pour gérer les logs de mes applications &#8230; même si je suis nostalgique du format &#8216;.properties&#8217; pour la configuration de ces dernières <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><p>Bien que Logback ne soit pas le sujet de ce billet, j&#8217;ai ajouté à l&#8217;article initial un paragraphe &laquo;&nbsp;Pourquoi je préfère Logback à Log4j&nbsp;&raquo; pour expliquer ce choix.</p><h3><a
name="Diffrentsfichiersdelogspourdif"></a>Différents fichiers de logs pour différents besoins</h3><p>On utilise souvent un seul fichier <code>mon-application.log</code> pour écrire toutes les logs : les informations d&#8217;audit, les logs d&#8217;exception avec des stack traces sans fins aussi bien que les informations de diagnostique/troubleshooting. Ce fichier se remplit de centaines de lignes par minute, et c&#8217;est alors la déception pour tous ses utilisateurs :</p><ul><li>l&#8217;exploitant est incapable de dire si une application a un problème en regardant les logs sans un astucieux système de &#8216;<code>grep</code>&#8216; et d&#8217;expressions régulières,</li><li>l&#8217;administrateur système et les responsables de la collecte des logs sont incapables de dimensionner les disques pour des logs dont la taille explose au moindre grain de sable à coup de stack traces dont il est pourtant inutile de conserver le détail,</li><li>les équipes de diagnostique/troubleshooting sont noyées dans la masse des informations lorsqu&#8217;elles doivent intervenir.</li></ul><p>Au final, c&#8217;est l&#8217;échec de la transmission de l&#8217;application du développement à la production et les exploitants prennent les développeurs pour des inconscients. Je ne saurais leur donner tort sur ce problème et voici ma proposition de découpage des fichiers de logs.</p><h4>Les logs applicatives</h4><p>Ce fichier ne trace que les dysfonctionnements, il n&#8217;est pas censé se remplir quand l&#8217;application fonctionne normalement et est archivé pendant plusieurs années par l&#8217;exploitant.</p><p>Ses caractéristiques sont :</p><ul><li>seuls les messages de dysfonctionnement (ie >= WARN) y apparaissent,</li><li>ce fichier tourne (&#8216;est rotationné&#8217; en franglais) chaque jour pour être archivé,</li><li>les stack traces seront compactes pour éviter de saturer le système de fichiers. Compacter à deux lignes par cause d&#8217;une exception est un bon compromis entre le niveau de détail utile au diagnostic et la taille occupée sur disque.</li></ul><p>Remarques :</p><ul><li>que faire si l&#8217;exploitant utilise l&#8217;augmentation de la taille du fichier de logs comme indicateur de disponibilité de l&#8217;application ? Cette technique de monitoring me semble très discutable sur le fond et je proposerai dans un autre billet d&#8217;utiliser des compteurs JMX pour ce besoin. Cependant, si votre exploitant tient absolument à suivre l&#8217;augmentation de la taille d&#8217;un fichier de logs, je vous propose de l&#8217;orienter vers le fichier d&#8217;audit décrit plus bas.</li><li>ajouter le nom de l&#8217;instance dans le préfixe de chaque message de logs ? Cette technique est parfois utilisée pour agréger les logs provenant de plusieurs serveurs. Cependant, je préfère que le script de collecte reporte le nom d&#8217;instance dans le nom des fichiers collectés. Cela consomme moins de disque et, de toutes façons, la fusion de fichiers de logs en conservant la chronologie est très délicate car toutes les lignes de nos fichiers ne sont pas préfixées (stack traces, sauts de ligne dans les message, etc).</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un fichier de logs filtré à <code>WARN</code>, à rotation quotidienne et dont les stack traces sont compactées à 2 lignes par cause d&#8217;une exception :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;my-application.log&lt;/file&gt;
   &lt;filter class=&quot;ch.qos.logback.classic.filter.ThresholdFilter&quot;&gt;
      &lt;!-- only log problems, not debugging info --&gt;
      &lt;level&gt;WARN&lt;/level&gt;
   &lt;/filter&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day for log collection and archiving --&gt;
      &lt;fileNamePattern&gt;my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- only log 2 lines of stack trace per cause of an exception --&gt;
      &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m %throwable{2}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
</pre><h4>Les logs de diagnostic/troubleshooting</h4><p>Ce fichier est destiné aux équipes de diagnostic/troubleshooting qui peuvent ajouter ou retirer des informations de debug selon leurs besoins. Ces logs ne sont pas archivées et doivent être très détaillées sans pour autant saturer le système de fichiers.</p><p>Ses caractéristiques sont :</p><ul><li>aucun filtrage sur le niveau de log (TRACE, &#8230;),</li><li>reconfiguration à chaud du framework de log pour ajouter/supprimer des informations selon les besoins,</li><li>rotation avec écrasement des fichiers pour éviter de saturer le système de fichiers.</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un rechargement de la configuration toutes les 30 secondes et un fichier de logs de troubleshooting</p><pre class="brush: xml; title: ; notranslate">
&lt;configuration scan=&quot;true&quot; scanPeriod=&quot;30 seconds&quot;&gt;
  ...
   &lt;appender name=&quot;troubleshooting-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;my-application-troubleshooting.log&lt;/file&gt;
      &lt;!-- 10x10Mo files to limit size on disk --&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;my-application-troubleshooting.%i.log&lt;/fileNamePattern&gt;
         &lt;maxIndex&gt;10&lt;/maxIndex&gt;
      &lt;/rollingPolicy&gt;
      &lt;triggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;&gt;
         &lt;maxFileSize&gt;10MB&lt;/maxFileSize&gt;
      &lt;/triggeringPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
&lt;/configuration&gt;
</pre><h4>Logs d&#8217;audit</h4><p>Ce fichier est destiné à l&#8217;audit de sécurité, on y trace &laquo;&nbsp;qui a fait quoi à quelle heure&nbsp;&raquo;, il grossit donc en permanence et peut dépasser le Go chaque jour.</p><p>Ses caractéristiques sont :</p><ul><li>seuls les messages d&#8217;audit y apparaissent,</li><li>ce fichier tourne chaque jour pour être archivé.</li></ul><p>Remarques :</p><ul><li>Certains estiment que le framework de logs n&#8217;a pas vocation à gérer les informations d&#8217;audit. Bien que je comprenne la théorie, je trouve en pratique bien plus simple de gérer simultanément les deux pour les raisons suivantes:</li><ul><li>l&#8217;audit doit tracer toutes les erreurs pour permettre d&#8217;analyser les problèmes de sécurité, il faudrait donc tracer les exceptions à la fois dans les logs et dans l&#8217;audit,</li><li>les frameworks de logging sont très efficaces pour gérer l&#8217;écriture de gros volumes de messages sur disque,</li><li>bien qu&#8217;il existe théoriquement un risque qu&#8217;une équipe de diagnostic fasse une erreur de configuration et désactive l&#8217;audit, je n&#8217;ai jamais entendu parler de ce genre de bourde.</li></ul><li>Faut-il augmenter la fréquence de rotation pour prévenir une dégradation des performances lorsque les fichiers d&#8217;audit dépassent le Go chaque jour ? Je ne pense pas : j&#8217;ai travaillé récemment sur une application Linux RHEL 5 / JVM Hotspot 6 / Tomcat / Log4j qui générait plus d&#8217;un Go de logs d&#8217;audit chaque jour. L&#8217;impact sur les performances était négligeable et l&#8217;augmentation de la fréquence de rotation n&#8217;a eu aucun impact. En revanche, en cas d&#8217;écriture massive sur disque, il faut collaborer avec l&#8217;administrateur système pour qu&#8217;il vérifie ses configurations OS et disques (c.f. <a
href="http://en.wikipedia.org/wiki/RAID_1#RAID_1" title="RAID 1" >RAID 1</a>) ; les administrateurs sont habitués à ces problèmes avec les fichiers de logs des bases de données.</li></ul><p>Exemple de fichier <code>logback.xml</code> avec un fichier d&#8217;audit avec rotation quotidienne qui ne traite que les loggers ayant la racine &#8216;fr.xebia.audit&#8217; :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day --&gt;
      &lt;fileNamePattern&gt;/my-application-audit.%d{yyyyMMdd}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;
      &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;
&lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
   &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
&lt;/logger&gt;
</pre><h3><a
name="Unrpertoireddipourlesfichiersd"></a>Un répertoire dédié pour les fichiers de logs archivés</h3><p>Une fois nos fichiers bien séparés, nous pouvons encore faciliter le travail des équipes d&#8217;exploitation avec une astuce très simple : stocker dans un autre répertoire les fichiers qui ont tourné. Il suffit de déclarer un répertoire <code>logs-to-collect</code> à côté de notre répertoire <code>logs</code>. Les bénéfices sont nombreux :</p><ul><li>Le script de collecte des logs (compression et transfert sur un serveur de backup) est grandement simplifié. Il n&#8217;est plus nécessaire d&#8217;utiliser un astucieux mécanisme de pattern sur le nom des fichiers pour exclure ceux qui sont en cours d&#8217;utilisation. Tous les fichiers du répertoires <code>logs-to-collect</code> peuvent être collectés à n&#8217;importe quel moment.</li></ul><ul><li>L&#8217;équipe de collecte de logs peut conserver autant de fichiers de logs d&#8217;archive sur le serveur sans nuire à la lisibilité du répertoire <code>logs</code> en y laissant des centaines d&#8217;entrées.</li></ul><ul><li>Il n&#8217;y a plus de risques de perdre les fichiers créés dans des circonstances exceptionnelles (opération de diagnostic, etc) et dont le nom ne correspondrait pas aux patterns du script de collecte, il suffit de déplacer ces fichiers dans le répertoire <code>logs-to-collect</code>.</li></ul><p>Remarque : seules les logs applicatives et d&#8217;audit ont vocation à être reversées dans ce répertoire. Les logs de diagnostic/troubleshooting ne sont pas archivées et restent donc dans le répertoire <code>logs</code>.</p><p><strong>Structure de répertoires avec un répertoire <code>logs-to-collect</code> dédié aux fichiers à archiver</strong><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2010/07/logs-to-collect-folder.jpg" alt="logs-to-collect folder" /></p><p><strong>Exemple de configuration avec logback</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
  &lt;file&gt;logs/my-application.log&lt;/file&gt;
  &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
    &lt;!-- roll every day in a dedicated non-active folder --&gt;
    &lt;fileNamePattern&gt;logs-to-collect/my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
  &lt;/rollingPolicy&gt;
  ...
&lt;/appender&gt;
</pre><h3><a
name="Compresserlesfichierslorsdeleu"></a>Compresser les fichiers lors de leur rotation</h3><p>Dernière astuce pour faire plaisir aux équipes d&#8217;exploitation en limitant la consommation d&#8217;espace disque : nos frameworks de logs savent maintenant compresser les fichiers (zip ou gzip) lors des rotations. Cette compression n&#8217;a en général aucun impact sur les performances de nos applications grâce aux CPU multi-cœurs, cela simplifiera encore le script de collecte des logs.</p><p>Pour la recherche dans des fichiers compressés, il faut garder en tête <code>zcat</code> et <code>gzcat</code> qui permettent d&#8217;extraire simplement les informations utiles.</p><p>Exemple de fichier <code>logback.xml</code> avec un fichier d&#8217;audit avec rotation quotidienne qui ne traite que les loggers ayant la racine &#8216;fr.xebia.audit&#8217; :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;zipped-archive&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   ...
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate and zip every day --&gt;
      &lt;fileNamePattern&gt;my-log-file.%d{yyyyMMdd}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   ...
&lt;/appender&gt;
</pre><h3><a
name="Unfichierdeconfigurationdelogs"></a>Un fichier de configuration de logs prêt pour la production</h3><p>Voici un fichier de configuration <a
href="http://blog.xebia.fr/wp-content/uploads/2011/07/logback.xml" title="logback.xml" >logback.xml</a> prêt pour la production qui reprend toutes les bonnes pratiques de ce billet; il tient en 50 lignes <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><pre class="brush: xml; title: ; notranslate">
&lt;configuration scan=&quot;true&quot;&gt;
  &lt;property name=&quot;LOGS_FOLDER&quot; value=&quot;${catalina.base}/logs&quot; /&gt;
  &lt;property name=&quot;LOGS_TO_COLLECT_FOLDER&quot; value=&quot;${catalina.base}/logs-to-collect&quot; /&gt;
   &lt;appender name=&quot;log-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application.log&lt;/file&gt;
      &lt;filter class=&quot;ch.qos.logback.classic.filter.ThresholdFilter&quot;&gt;
         &lt;level&gt;WARN&lt;/level&gt;
      &lt;/filter&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_TO_COLLECT_FOLDER}/my-application.%d{yyyyMMdd}.log&lt;/fileNamePattern&gt;
      &lt;/rollingPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m %throwable{0}%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_TO_COLLECT_FOLDER}/my-application-audit.%d{yyyyMMdd}.log.gzip&lt;/fileNamePattern&gt;
      &lt;/rollingPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;appender name=&quot;troubleshooting-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
      &lt;file&gt;${LOGS_FOLDER}/my-application-troubleshooting.log&lt;/file&gt;
      &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;&gt;
         &lt;fileNamePattern&gt;${LOGS_FOLDER}/my-application-troubleshooting.%i.log&lt;/fileNamePattern&gt;
         &lt;maxIndex&gt;10&lt;/maxIndex&gt;
      &lt;/rollingPolicy&gt;
      &lt;triggeringPolicy class=&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;&gt;
         &lt;maxFileSize&gt;10MB&lt;/maxFileSize&gt;
      &lt;/triggeringPolicy&gt;
      &lt;encoder&gt;
         &lt;pattern&gt;%d{yyyy/MM/dd HH:mm:ss,SSS} [%thread] %-5level %logger{36} - %m%n&lt;/pattern&gt;
      &lt;/encoder&gt;
   &lt;/appender&gt;
   &lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
      &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
   &lt;/logger&gt;
   &lt;root level=&quot;WARN&quot;&gt;
      &lt;appender-ref ref=&quot;log-file&quot; /&gt;
      &lt;appender-ref ref=&quot;troubleshooting-file&quot; /&gt;
   &lt;/root&gt;
&lt;/configuration&gt;
</pre><h3><a
name="PourquoijeprfreLogbackLogj"></a>Pourquoi je préfère Logback à Log4j</h3><p>Au delà du comparatif <a
href="http://logback.qos.ch/reasonsToSwitch.html" title="Reasons to prefer logback over log4j" >Reasons to prefer logback over log4j</a> que maintient le projet Logback avec un zest de chauvinisme, je trouve que le <strong>compactage des stack traces en préservant les causes d&#8217;une exception</strong> est vraiment différenciant. Je ne vois pas de solution pour le faire avec Log4j sans <em>hacker</em> la librairie. J&#8217;ai proposé le patch <a
href="https://issues.apache.org/bugzilla/show_bug.cgi?id=48902" title=""Bug 48902 - log4j-extras - Enhancement : add %throwable{compact} to EnhancedPatternLayout"" >&laquo;&nbsp;Bug 48902 &#8211; log4j-extras &#8211; Enhancement : add %throwable{compact} to EnhancedPatternLayout&nbsp;&raquo;</a> mais la gestion des causes de l&#8217;exception n&#8217;a pas été intégrée.</p><p>Conservation de la cause d&#8217;une exception avec Logback et le pattern &laquo;&nbsp;<a
href="%thread" title="thread" >%thread</a> %-5level %logger{36} &#8211; %msg %throwable{1}%n&nbsp;&raquo;</p><pre class="brush: java; title: ; notranslate">
[main] ERROR fr.xebia.test.LoggerTest - Logged by Logback java.lang.RuntimeException: Ze caller
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:52)
	at fr.xebia.test.LoggerTest.testLogback(LoggerTest.java:38)
Caused by: java.lang.RuntimeException: Ze cause
	at fr.xebia.test.LoggerTest.nestedMethod(LoggerTest.java:45)
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:50)
</pre><p>Perte de la cause d&#8217;une exception avec Log4j et le pattern &laquo;&nbsp;<a
href="%t" title="t" >%t</a> %5p  %c &#8211; %m %throwable{3}%n&nbsp;&raquo; :</p><pre class="brush: java; title: ; notranslate">
[main] ERROR  fr.xebia.test.LoggerTest - Logged by Log4j java.lang.RuntimeException: Ze caller
	at fr.xebia.test.LoggerTest.callingMethod(LoggerTest.java:52)
	at fr.xebia.test.LoggerTest.testLog4j(LoggerTest.java:28)
</pre><p>J&#8217;apprécie aussi le fichier de configuration de test <code>logback-test.xml</code>, l&#8217;activation du rafraichissement de la configuration avec <code>scan="true"</code> et bien d&#8217;autres détails de Logback qui pourraient faire l&#8217;objet d&#8217;un prochain billet.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/feed/</wfw:commentRss> <slash:comments>27</slash:comments> </item> <item><title>KawaCamp jeudi 27 chez Xebia</title><link>http://blog.xebia.fr/2010/05/24/kawacamp-jeudi-27-chez-xebia/</link> <comments>http://blog.xebia.fr/2010/05/24/kawacamp-jeudi-27-chez-xebia/#comments</comments> <pubDate>Mon, 24 May 2010 12:21:53 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[KawaCamp]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[TDD]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=4711</guid> <description><![CDATA[Xebia a le plaisir d&#8217;accueillir le deuxième KawaCamp dans ses locaux jeudi 27 Mai 2010. Qu&#8217;est ce qu&#8217;un KawaCamp ? C&#8217;est un BarCamp dédié aux sujets qui gravitent autour de l&#8217;écosystème Java ! Et qu&#8217;est-ce qu&#8217;un BarCamp alors ? Pour résumer voici la définition de Wikipedia. Nous allons nous retrouver entre passionnés pour discuter de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2010/05/barcamp.png" alt="barcamp" title="barcamp" style="margin: 1em 1em 1em 2em; float: right;" /><br
/> Xebia a le plaisir d&#8217;accueillir le <a
href="http://barcamp.org/KawaCampParis2" title="deuxime KawaCamp" >deuxième KawaCamp</a> dans ses locaux jeudi 27 Mai 2010.</p><p>Qu&#8217;est ce qu&#8217;un KawaCamp ? C&#8217;est un BarCamp dédié aux sujets qui gravitent autour de l&#8217;écosystème Java ! Et qu&#8217;est-ce qu&#8217;un BarCamp alors <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ? Pour résumer voici la <a
href="http://fr.wikipedia.org/wiki/BarCamp" title="dfinition de Wikipedia" >définition de Wikipedia</a>. Nous allons nous retrouver entre passionnés pour discuter de sujets qui nous tiennent à coeur autour de tables rondes/ateliers durant lesquels chacun participe et donne son point de vue.</p><p>Les sujets sont choisis grâce aux centres d&#8217;intérêts que chacun exprime sur la <a
href="http://barcamp.org/KawaCampParis2" title="page dinscription" >page d&#8217;inscription</a>. Cette session s&#8217;oriente vers les sujets d&#8217;actualité avec beaucoup de <strong>HTML5</strong> et d&#8217;<strong>Android</strong> sans oublier <strong>NoSQL</strong>, <strong>TDD</strong>, <strong>Agilité</strong>, &#8230;</p><p>Si vous aimez les discussions passionnées autour d&#8217;un verre, le KawaCamp vous comblera en organisant nos débats ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p><strong>Informations pratiques :</strong></p><ul><li>La page d&#8217;inscription : <a
href="http://barcamp.org/KawaCampParis2" title="Kawa Camp Paris 2" >Kawa Camp Paris 2</a>.</li><li>Les organisateurs : Luc Bizeul et Philippe Antoine.</li><li>La date : Jeudi 27 Mai 2010 à partir de 19h00.</li><li>L&#8217;adresse : <a
href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=156+Boulevard+Haussmann,+75008+Paris,+France&#038;sll=48.884769,2.348363&#038;sspn=0.009313,0.022681&#038;ie=UTF8&#038;hq=&#038;hnear=156+Boulevard+Haussmann,+75008+Paris,+Ile-de-France,+France&#038;ll=48.875696,2.312107&#038;spn=0.009314,0.022681&#038;z=16&#038;iwloc=A" title="Xebia  156 boulevard Haussmann 75008 Paris" >Xebia &#8211; 156 boulevard Haussmann, 75008 Paris</a>.</li></ul><p><strong>Ils en parlent :</strong></p><ul><li><a
href="http://www.frandroid.com/18124/barcamp-kawacampparis2/" title="FrAndroid  Barcamp  KawaCampParis2 " >FrAndroid &#8211; Barcamp : KawaCampParis2 </a>.</li><li><a
href="http://groups.google.com/group/duchessfr/msg/b90e75d9d7c08482" title="Le Calendrier des JDuchess" >Le Calendrier des JDuchess</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/05/24/kawacamp-jeudi-27-chez-xebia/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Tomcat load balancing &#8211; mod_proxy vs mod_jk le match</title><link>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/</link> <comments>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/#comments</comments> <pubDate>Wed, 03 Feb 2010 15:21:18 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Load Balancer]]></category> <category><![CDATA[Reverse Proxy]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3952</guid> <description><![CDATA[Dans notre article sur l&#8217;utilisation de HTTPS avec Tomcat en production, nous avons étudié les solutions reposant sur la mise en place d&#8217;un reverse proxy HTTP. Nous n&#8217;avons pas oublié pour autant le protocole AJP. Ce protocole est né pour faciliter et accélérer les communications entre un serveur web frontal et le serveur d&#8217;application JServ [...]]]></description> <content:encoded><![CDATA[<p>Dans notre article sur l&#8217;<a
href="http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/" title="utilisation de HTTPS avec Tomcat en production" >utilisation de HTTPS avec Tomcat en production</a>, nous avons étudié les solutions reposant sur la mise en place d&#8217;un reverse proxy HTTP. Nous n&#8217;avons pas oublié pour autant le protocole AJP. Ce protocole est né pour faciliter et accélérer les communications entre un serveur web frontal et le serveur d&#8217;application JServ en back-end d&#8217;Apache. Avec le temps, Tomcat a remplacé Apache JServ mais AJP est resté. Jusqu&#8217;en 2003, AJP était la seule solution viable permettant de placer le serveur d&#8217;application derrière un serveur Apache. Avec la maturation de la fonctionnalité Proxy dans Apache est née la solution tout HTTP. Nous avons donc décidé d&#8217;organiser un match opposant la solution AJP à la solution HTTP.</p><h2><a
name="Unpeudhistoire"></a>Un peu d&#8217;histoire</h2><p>Tout commence en 1997 avec la création d&#8217;Apache JServ. A l&#8217;époque, il s&#8217;agit d&#8217;un serveur de Servlet qui supporte uniquement le protocole AJP créé pour l&#8217;occasion. Dans l&#8217;architecture initiale, c&#8217;est Apache 1.1 qui fournit le serveur web et transfère les requêtes par socket au moteur de Servlet. C&#8217;est la naissance du protocole <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv1.html" title="AJP dans sa premire version" >AJP dans sa première version</a> implémentée par le mod_jserv. L&#8217;Apache JServ Protocol fonctionne au départ comme un proxy qui redirige le flux vers JServ. Le protocole est en texte clair et utilise un caractère en début de ligne pour distinguer les différents éléments de la requête.</p><p>Rapidement, le protocole initial est considéré comme trop limité car il fonctionne uniquement en loopback et possède une authentification pauvre. En 1998, le protocole <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv11.html" title="AJP 1.1" >AJP 1.1</a> permet à JServ de tourner sur une autre machine que le serveur web et d&#8217;assurer une authentification forte basée sur md5. Avec le développement de JServ appparaît un problème de performance important : le coût d&#8217;ouverture d&#8217;une socket et la vitesse des réseaux. Ils sont considérés à l&#8217;époque comme les principaux goulets d&#8217;étranglement. Pour résoudre ces problèmes, le protocole passe à la version 1.2 dont vous trouverez le draft initial <a
href="http://sciencedesk.arc.nasa.gov/jservdocs/protocol/AJPv21.html" title="ici" >ici</a>. AJP 1.2 est un protocole binaire orienté paquets qui permet de recycler la ou les sockets connectées à JServ. Le passage au binaire permet aussi d&#8217;améliorer les performances car il diminue la taille des données qui transitent et simplifie le traitement.</p><p>En 1999, Sun offre son implémentation de référence des Servlets à la fondation Apache. C&#8217;est le point de départ des projets Tomcat et Ant. Commence alors une période de transition qui finira par l&#8217;abandon d&#8217;Apache JServ. Pendant cette transition, AJP sera porté sur Tomcat qui bénéficiera d&#8217;emblée d&#8217;une facilité d&#8217;interconnexion avec Apache. Aux alentours de 2000, le mod_jk est développé pour étendre AJP qui pourra supporter le transport des données SSL. C&#8217;est la version 1.3 que l&#8217;on retrouve aujourd&#8217;hui supportée par les dernières générations de Tomcat. Après toutes ces années de développement, le mod_jk est maintenu par le projet <a
href="http://tomcat.apache.org/connectors-doc/" title="Tomcat Connectors" >Tomcat Connectors</a> et n&#8217;a jamais été intégré aux projets Apache.</p><p>La création d&#8217;AJP résulte donc de la simplicité et de la rapidité de développement souhaitées par les auteurs. Il fallait aller vite, et implémenter un proxy pleinement compatible HTTP aurait été trop long. Le module mod_proxy existe depuis 1996 dans Apache 1.1. Mais il s&#8217;agissait d&#8217;une fonctionnalité expérimentale qui n&#8217;offrait ni performance ni stabilité. A la sortie d&#8217;Apache 2, le proxy a même été dé-scopé car il ne fonctionnait plus du tout. Les développeurs vont pourtant rapidement le corriger et le réintégrer comme solution pour faire des reverse proxies. Pour la sortie d&#8217;Apache 2.2, le mod_proxy est entièrement réécrit pour supporter le load-balancing. Il offre, pour la première fois dans Apache, une solution capable de concurrencer le mod_jk en performance et en scalabilité. Cerise sur le gâteau, Apache a décidé de supporter nativement le protocole AJP en ajoutant un mod_proxy_ajp à la solution mod_proxy.</p><h2><a
name="Installation"></a>Installation</h2><h3><a
name="modproxy"></a>mod_proxy</h3><p>Le mod_proxy fait partie de la distribution standard d&#8217;Apache HTTPD. Il est livré avec le mod_proxy_http, le mod_proxy_ajp et le mod_proxy_balancer. Il suffit donc de s&#8217;assurer que ces modules sont bien chargés au démarrage d&#8217;Apache.</p><h3><a
name="modjk"></a>mod_jk</h3><p>Si mod_jk était autrefois très délicat à installer avec la compilation du code sur un serveur similaire au serveur cible, la situation s&#8217;est grandement simplifiée. Le projet <em><a
href="http://tomcat.apache.org/connectors-doc/" title="Apache Tomcat Connector" >Apache Tomcat Connector</a></em> fournit désormais <a
href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/" title="les binaires" >les binaires</a> pour les principales plateformes (Linux, Windows, Free BSD, Mac, Solaris, AIX, etc). Il faut donc télécharger le binaire du module et le copier dans le répertoire contenant les modules Apache.</p><h2><a
name="Configuration"></a>Configuration</h2><p>Pour mieux comparer les deux solutions, nous avons choisi de prendre comme exemple l&#8217;utilisation d&#8217;Apache en front desservant deux Tomcat en load-balancing. Nous ne nous intéresserons ici qu&#8217;à la configuration d&#8217;Apache HTTPD. La configuration AJP de Tomcat étant déjà largement documentée sur le web et celle via HTTP dans nos articles précédents, nous n&#8217;aborderons pas ces problématiques.</p><h3><a
name="modproxyhttpmodproxybalancer"></a>mod_proxy_http &#038; mod_proxy_balancer</h3><p>La configuration du mod_proxy consiste d&#8217;abord à s&#8217;assurer que les modules soient bien chargés avec les directives <code>LoadModule</code>. Nous activons ensuite le <code>server-status</code> ainsi que le <code>balancer-manager</code> pour obtenir une interface de surveillance / administration du load-balancer. Enfin, nous avons configuré le <code>Proxy balancer</code> nommé <code>my-application-cluster</code> pour contenir nos 2 serveurs Tomcat. La dernière ligne de configuration active le reverse proxy pour que les requêtes sur <code>/my-application</code> soient redirigées vers le <code>/my-application</code> du load-balancer.</p><p><strong>Configuration avec mod_proxy_http &#038; mod_proxy_balancer &#8211; httpd.conf</strong></p><pre class="brush: xml; title: ; notranslate">
# LOAD MODULES
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
# STATUS AND MONITORING
# Display proxy balancer status in /server-status page
ProxyStatus On
&lt;Location /server-status&gt;
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
&lt;Location /balancer-manager&gt;
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
# APPLICATIONS CONFIGURATION
&lt;Proxy balancer://my-application-cluster&gt;
   BalancerMember      http://node-1:8080 route=node-1 disablereuse=On
   # ...
   BalancerMember      http://node-n:8081 route=node-n disablereuse=On
&lt;/Proxy&gt;
ProxyPreserveHost On
ProxyPass /my-application balancer://my-application-cluster/my-application stickysession=JSESSIONID
</pre><p>Vous pouvez le constater, la configuration est parfaitement intégrée à la configuration standard d&#8217;Apache HTTPD. Les équipes de production n&#8217;auront à priori pas de grandes difficultés à prendre en main ce type de configuration qui nécessite seulement de savoir parcourir la <a
href="http://httpd.apache.org/docs/2.2/" title="documentation Apache" >documentation Apache</a> déjà bien connue des administrateurs.</p><h3><a
name="modjk"></a>mod_jk</h3><p>La première étape consiste à configurer le serveur Apache pour qu&#8217;il utilise le mod_jk. Tout commence par le chargement du module avec la directive <code>LoadModule</code>. Ensuite nous fournissons le chemin du deuxième fichier de configuration définissant les <code>workers</code>.  La directive <code>JkMount</code> permet ensuite d&#8217;associer un worker du mod_jk à un pattern d&#8217;url du serveur. Pour chaque requête dont l&#8217;URL correspond au pattern, Apache va déléguer le traitement au mod_jk. Nous montons d&#8217;abord le worker <code>jkstatus</code> sur <code>/jkmanager</code> en autorisant l&#8217;accès uniquement depuis le système local. C&#8217;est ensuite au tour du <code>loadbalancer</code> qui servira notre application.</p><p><strong>Configuration avec mod_jk &#8211; httpd.conf</strong></p><pre class="brush: xml; title: ; notranslate">
# LOAD MODULES
LoadModule jk_module libexec/apache2/mod_jk.so
# MOD_JK CONFIGURATION FILE
JkWorkersFile /etc/apache2/other/workers.properties
# MOD_JK PROPRIETARY LOG FILE
JkLogFile     /var/log/apache2/mod_jk.log
# NEEDED ON MAC SNOW LEOPARD
JkShmFile     /var/log/apache2/
# STATUS AND MONITORING
JkMount /jkmanager/* jkstatus
&lt;Location /jkmanager&gt;
    Order deny,allow
    Deny from all
    Allow from localhost
&lt;/Location&gt;
# APPLICATIONS CONFIGURATION
JkMount /my-application/* loadbalancer
</pre><p>Il faut maintenant configurer le mod_jk proprement dit dans son fichier de configuration spécifique. Il s&#8217;agit d&#8217;une liste de propriétés commençant toujours par <code>worker.</code>. La propriété <code>worker.list</code> fournit les noms des workers actifs. Le nom est ensuite utilisé pour paramétrer le worker avec des clés de la forme <code>worker.nomWorker.parametre</code>. Le premier worker activé <code>jkstatus</code> utilise le type spécial <code>status</code> qui correspond à l&#8217;interface de suivi et de gestion du mod_jk. Le deuxième worker <code>loadbalancer</code> est en fait chargé de répartir les sessions entre le worker1 et le worker2 via le type <code>lb</code>. Ce sont finalement les workers 1 à n qui assurent le transport des requêtes sur AJP1.3  vers le port 8009 d&#8217;un Tomcat distant.<br
/> <strong>Configuration avec mod_jk &#8211; workers.properties</strong></p><pre class="brush: xml; title: ; notranslate">
# WORKERS AND PSEUDO WORKER
worker.list=jkstatus, loadbalancer
# STATUS AND MANAGEMENT PSEUDO WORKER
worker.jkstatus.type=status
# WORKER 1 TO N
worker.worker1.type=ajp13
worker.worker1.host=node-1
worker.worker1.port=8009
# ...
worker.worker2.port=8009
worker.worker2.host=node-n
worker.worker2.type=ajp13
# LOAD BALANCER PSEUDO WORKER
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
</pre><p>Avec ses deux fichiers de configurations séparés et la syntaxe <em>&laquo;&nbsp;rustique&nbsp;&raquo;</em> du <code>worker.properties</code>, la configuration est définitivement le point faible du mod_jk. L&#8217;un des seuls avantages réside dans le nombre impressionnant de paramètres supportés qui permet un paramétrage fin si le besoin s&#8217;en fait sentir. Si seulement nous n&#8217;étions pas forcés à tant de verbosité !</p><h2><a
name="Interfacesgraphiques"></a>Interfaces graphiques</h2><p>Les deux modules fournissent des interfaces web pour assurer la supervision du load-balancer. Cette fois, le mod_proxy se contente de fournir des statistiques réduites dans une interface minimaliste. L&#8217;interface liste principalement le statut de chaque nœud du load-balancer ainsi que la quantité de données envoyée et reçue par nœud.</p><p> <a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-server-status-proxy-balancer.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-server-status-proxy-balancer.png" alt="screenshot-apache-server-status--proxy-balancer" title="screenshot-apache-server-status--proxy-balancer" width="450" class="aligncenter size-medium wp-image-3959" /></a></p><p>Outre le suivi des statistiques du load-balancer, le Balancer Manager permet aussi de faire des modifications à chaud, éditer les workers, les passer en offline, voire même changer la méthode de répartition utilisée.</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/loadBalancerManagerModProxy.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/loadBalancerManagerModProxy.png" alt="screenshot-apache-server-status--balancer-manager" title="screenshot-apache-server-status--balancer-manager"  class="alignnone size-medium wp-image-3964"  width="450"/></a></p><p>De son côté, le mod_jk prouve sa maturité avec son interface <em>rustique</em> elle aussi, mais plus voire trop complète. Elle est composée de plusieurs pages dont une page d&#8217;accueil similaire en tout point à l&#8217;interface du mod_proxy. L&#8217;avantage réside dans la fourniture d&#8217;une page détaillant l&#8217;état complet pour chaque nœud.</p><p>Mais le mod_jk ne se contente pas de cela : il fournit aussi une page permettant de modifier à chaud la configuration du load-balancer. Il est parfaitement envisageable pour le déploiement en production d&#8217;une nouvelle version de l&#8217;application de couper les nœuds un à un au moment de leur mise à jour puis de les réactiver sans interruption du service.</p><p>Attention toutefois, car les modifications faites par ce biais sont uniquement enregistrées en mémoire, la nouvelle configuration sera perdue au prochain redémarrage d&#8217;Apache.</p><p><a
href="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-jkmanager.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2010/02/screenshot-apache-jkmanager.png" alt="screenshot-apache-jkmanager" title="screenshot-apache-jkmanager" width="450" class="alignnone size-medium wp-image-3966" /></a></p><p>La mince différence vient probablement de la jeunesse de la solution de load-balancing du mod_proxy face à la longue expérience de production du mod_jk. Mais elle ne saurait justifier une préférence pour l&#8217;un des deux modules, qui sur ce point sont très proches.</p><h2><a
name="LoadBalancingetgestionderreur"></a>LoadBalancing et gestion d&#8217;erreur</h2><p>Outre la configuration et l&#8217;interface graphique, les deux solutions disposent de quelques fonctions avancées notamment en ce qui concerne la gestion d&#8217;erreur et la gestion des sockets réseaux.  Les deux modules utilisent des pools de connexion rangés par Thread du serveur Apache et par membres du cluster.<br
/> Avec le mod_proxy, il est possible de choisir parmi trois algorithmes de répartition de charge :</p><ul><li>Par requête : la charge est répartie pour chaque requête entrante en fonction de la session si elle existe.</li><li>Par trafic réseau : les requêtes sont envoyées vers le membre du cluster ayant reçu le moins de trafic.</li><li>Par taux d&#8217;occupation : la charge est répartie en fonction du nombre de requêtes en cours de traitement ou en attente.</li></ul><p>En ce qui concerne la gestion d&#8217;erreur, il n&#8217;y a pas grand chose à dire car il n&#8217;y a pas grand chose de fait. Si un timeout claque, un certain nombre de tentatives de reconnexion seront réalisées jusqu&#8217;à ce que le noeud soit marqué en erreur et n&#8217;en décolle plus.</p><p>C&#8217;est sur la gestion d&#8217;erreur que le mod_jk possède une plus grande sophistication que son récent concurrent.<br
/> Tout d&#8217;abord le protocole AJP fournit un mécanisme de <em>health check</em> (CPing/CPong) qui permet de tester l&#8217;état du lien entre le serveur frontal et un membre du cluster. Cependant, c&#8217;est beaucoup plus limité que les <em>heart beat</em> des load balancer hardware, il n&#8217;est pas possible de tester une url pour détecter des indisponibilités applicatives (échec de démarrage de la web app, web app KO à cause de l&#8217;indisponibilité d&#8217;un backend clef).<br
/> D&#8217;autre part, le module fait une distinction entre les erreurs locales temporaires qui sont sans impact particulier, un code d&#8217;erreur HTTP par exemple, et les erreurs globales qui indiquent que le serveur est clairement en erreur et ne recevra plus de nouvelles requêtes. Il existe un système d&#8217;escalade qui, en cas de répétition trop fréquente d&#8217;erreurs locales sur un noeud se charge de le passer en erreur globale. Le module se charge de réactiver le noeud en mode recovery après un délai paramétré.</p><p>Côté répartition de charge, mod_jk apporte un dernier algorithme de répartition reposant sur le nombre de sessions HTTP en cours par serveur. Cette méthode est relativement récente puisqu&#8217;elle est apparue dans la version 1.2.20 du mod_jk, actuellement en version 1.2.29. Elle est recommandée pour les applications chargeant fortement la session et de ce fait, supportant un nombre limité de sessions par serveur ; ce cas d&#8217;utilisation est assez marginal.<br
/> Dans les deux modules, l&#8217;algorithme de répartition est pondéré par un facteur nommé &laquo;&nbsp;lbfactor&nbsp;&raquo;, qui permet d&#8217;appliquer des quotas de travail aux serveurs. Ce système s&#8217;avère utile si les serveurs sont de puissances différentes par exemple.</p><p>Le mod_jk marque ici un petit point sur le mod_proxy grâce à sa gestion d&#8217;erreur plus fine. Attention aux effets de bord, le <em>retry</em> sur timeout en a surpris plus d&#8217;un et l&#8217;éviction de serveurs tomcat pour cause de répétition d&#8217;erreur est un beau sujet de déni de service <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Pour le reste, le mod_proxy colle au fonctionnement du mod_jk, ce qui ne manquera pas de faciliter son utilisation aux habitués du mod_jk.</p><h2><a
name="Exploitationetdiagnostiquedesp"></a>Exploitation et diagnostic des problèmes</h2><p>mod_proxy_http présente sur mod_jk le très grand avantage d&#8217;utiliser un protocole standard, HTTP, connu de tous les acteurs d&#8217;un système d&#8217;information alors que mod_jk repose sur le protocole AJP que quasiment personne ne connait. Les administrateurs systèmes et réseaux sont habitués à HTTP et notamment à ses connections persistantes (aka HTTP keepAlive) ; ils savent ajuster leurs algorithmes de load balancing, les timeouts des firewalls et le dimensionnement des piles tcp/ip des serveurs (<code>ulimit</code>, <code>tcp_keepalive_intvl</code>, <code>tcp_tw_bucket</code>, etc).</p><p>Un autre atout de mod_proxy est la facilité de diagnostic. N&#8217;importe quel acteur du système d&#8217;information peut utiliser <code>curl</code>, <code>wget</code>, <code>telnet</code>, <code>elinks</code> voire wireshark pour <em>troubleshooter</em> un problème de communication HTTP; ce n&#8217;est pas le cas avec le protocole AJP qui n&#8217;est pas <em>human readable</em> et encore moins <em>human writable</em>. Choisir AJP mérite de former les administrateurs systèmes et réseaux et de prévoir des outils de tests permettant de requêter un connecteur AJP mais ce n&#8217;est hélas que très rarement fait.</p><p>En cas de problème réseau avec HTTP comme avec AJP, n&#8217;oubliez pas que désactiver les connections persistantes simplifie grandement les investigations et n&#8217;a rien de scandaleux en 2010 (cf <a
href="http://haproxy.1wt.eu/" title="HAProxy" >HAProxy</a>) ; c&#8217;est &laquo;&nbsp;<code>disablereuse=On</code>&nbsp;&raquo; pour mod_proxy_http et  &laquo;&nbsp;<code>JkOptions +DisableReuse</code>&nbsp;&raquo; pour mod_jk <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h2><a
name="Conclusion"></a>Conclusion</h2><p>Avec sa simplicité de configuration, sa répartition de charge calquée sur le mod_jk, le mod_proxy conviendra parfaitement dans la grande majorité des cas. Il s&#8217;accommode de clusters répartissant la charge sur plusieurs noeuds ou bien en tant que simple reverse proxy. La cerise sur le gateau étant l&#8217;utilisation du protocole HTTP qui permet de garantir la portabilité des services et facilite grandement l&#8217;analyse du trafic.</p><p><strong>A nos yeux, avec l&#8217;intégration native de mod_proxy_http et mod_proxy_balancer à Apache, il n&#8217;y a plus de justification à ajouter le module additionnel mod_jk ni d&#8217;introduire le protocole méconnu AJP. Les optimisations d&#8217;AJP ne sont plus de mise aujourd&#8217;hui et ne justifient donc pas l&#8217;utilisation d&#8217;un mod_jk.</strong></p><p>Il reste, dans les deux cas, quelques efforts à faire pour permettre de plus facilement monter des serveurs à chaud dans un cluster. Pour la haute disponibilité sans perte, il faudra mettre en place un <a
href="http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html" title="cluster Tomcat" >cluster Tomcat</a> assurant la réplication des sessions utilisateur entre les serveurs. Encore faut-il en avoir vraiment besoin &#8230;</p><p>Attention, la recommandation de Tomcat est encore le mod_jk et, il est important de garder fonctionnel ce qui marche déjà. Donc, quoiqu&#8217;il arrive, si vous avez déjà une solution fonctionnelle avec le mod_jk, inutile de migrer. Pour ce qui est de l&#8217;interface et de la gestion d&#8217;erreur, nous parions sur l&#8217;avenir du mod_proxy qui est en développement intensif et bénéficie des corrections de bug de son ainé. Reste un nouveau venu dans le paysage développé par Jboss qui attire déjà notre attention c&#8217;est le <a
href="http://www.jboss.org/mod_cluster/" title="modcluster" >mod_cluster</a> actuellement, il n&#8217;est utilisable qu&#8217;avec Jboss AS. L&#8217;avantage de cette nouvelle solution en devenir est de suivre le cycle de vie des applications via un protocole spécifique MCMP reposant tout de même sur HTTP.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/02/03/tomcat-load-balancing-mod_proxy-vs-mod_jk-le-match/feed/</wfw:commentRss> <slash:comments>75</slash:comments> </item> <item><title>Tomcat, SSL, communications sécurisées et X-Forwarded-Proto</title><link>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/</link> <comments>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/#comments</comments> <pubDate>Fri, 13 Nov 2009 15:19:42 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[ssl]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[x-forwarded-for]]></category> <category><![CDATA[x-forwarded-proto]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=3092</guid> <description><![CDATA[Suite à vos retours nombreux, aux différents articles touchant à la sécurisation par SSL de Tomcat en production (Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For, Sécuriser Tomcat 5 derrière un proxy Apache 2 HTTPS), nous commençons une série sur Tomcat en production. Dans ce premier article, nous abordons [...]]]></description> <content:encoded><![CDATA[<p>Suite à vos retours nombreux, aux différents articles touchant à la sécurisation par SSL de Tomcat en production (<a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat : Adresse IP de l'internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header HTTP X-Forwarded-For</a>, <a
href="http://blog.xebia.fr/2009/09/23/securiser-tomcat-5-derriere-un-proxy-apache-2-https/" title="Scuriser Tomcat 5 derrire un proxy Apache 2 HTTPS" >Sécuriser Tomcat 5 derrière un proxy Apache 2 HTTPS</a>), nous commençons une série sur Tomcat en production.<br
/> Dans ce premier article, nous abordons l&#8217;utilisation de SSL pour sécuriser les communications. Pourquoi utiliser SSL ? Comment SSL est-il intégré avec le moteur de Servlet ? Et surtout quelle configuration correspond à votre application, qu&#8217;elle soit hébergée sur un serveur Tomcat seul, avec un serveur Apache Httpd en frontal, avec un accélérateur SSL ou avec un load-balancer <em>hardware</em>.</p><h3><a
name="PourquoiutilisonsnousSSLQuestc"></a>Pourquoi utilisons nous SSL ? Qu&#8217;est ce qu&#8217;une communication sécurisée ?</h3><p>Il est souvent nécessaire de protéger les accès à différents services d&#8217;une application web. C&#8217;est le cas par exemple des formulaires d&#8217;authentification. Il faut donc sécuriser tout ou partie des services de l&#8217;application. Mais qu&#8217;est-ce qu&#8217;une application sécurisée ? La sécurité informatique repose sur quatre grande règles: confidentialité, intégrité, disponibilité et non répudiation. Si votre application respecte ces 4 règles, alors elle est sécurisée.</p><p>La plupart du temps, SSL est utilisé pour adresser la confidentialité et l&#8217;intégrité des communications web échangées entre le client et le serveur. Schématiquement, SSL encapsule le protocole HTTP dans un canal sécurisé. Le canal utilise un chiffrage fort qui garantie la confidentialité de la communication. Pour garantir que les données ne sont ni modifiées ni rejouées par un tiers, SSL signe et numérote les messages échangés. De plus, SSL supporte l&#8217;utilisation de certificats qui vont permettre de garantir l&#8217;identité des interlocuteurs. S&#8217;il est possible d&#8217;utiliser un certificat client pour authentifier l&#8217;utilisateur, dans la grande majorité des cas, seul le serveur possède son certificat. La mise en place de certificats clients à grande échelle, via une <a
href="http://fr.wikipedia.org/wiki/Infrastructure_de_gestion_des_cles" title="PKI" >PKI</a> par exemple, est un sujet à part entière que nous n&#8217;aborderons pas ici.<br
/> Dans le schéma ci-dessous, les communications provenant d&#8217;Internet sont sécurisées grâce à l&#8217;utilisation de SSL. Les communications provenant des autres serveurs de la &laquo;&nbsp;zone de confiance&nbsp;&raquo; du data center n&#8217;utilisent pas SSL. Certains estiment que cette dispense vient du fait que tous les messages doivent passer en clair dans la zone de confiance pour que les outils de sécurité puissent surveiller tout ce qui transite ; d&#8217;autres avanceront que SSL est inutile car d&#8217;autres techniques de sécurisation sont utilisées (audit de la couche réseau, gestion des permissions sur les serveurs, etc). Quelle que soit la motivation, il est fréquent de ne pas utiliser SSL pour les communications internes ; cela simplifie le tuning et le dimensionnement de nos applications.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-secured-communications.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-secured-communications-300x238.png" alt="tomcat-secured-communications" title="tomcat-secured-communications" width="300" height="238" class="alignnone size-medium wp-image-3096" /></a></div><h3><a
name="CommentsavoirenJavasiunerequte"></a>Comment savoir en Java si une requête HTTP est sécurisée ou utilise SSL ?</h3><p>L&#8217;API Servlet offre une méthode générique <strong><a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="<strong>ServletRequest.isSecure()</strong>&nbsp;&raquo; ><strong>ServletRequest.isSecure()</strong></a></strong> qui indique si une requête a emprunté un canal sécurisé. Nous noterons que cette méthode est plus générique que l&#8217;utilisation spécifique de SSL et permet notamment d&#8217;identifier comme <code>secure</code>, bien que non SSL, une requête provenant, par exemple, du même data center. Une autre méthode plus spécifique mais souvent inutile si l&#8217;on repose sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a> est <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getScheme()" title="ServletRequest.getScheme()" >ServletRequest.getScheme()</a> qui indique le protocole utilisé : <code>http</code>, <code>https</code>, etc</p><h3><a
name="Commentforcerlutilisationdecom"></a>Comment forcer l&#8217;utilisation de communications sécurisées (SSL) en Java</h3><p>Les frameworks web communément utilisés en Java permettent de forcer de façon déclarative l&#8217;utilisation d&#8217;un canal sécurisé (ie. <code>https</code>) pour les requêtes entrantes. Dans les faits, ils interdisent l&#8217;accès à la ressource via un canal non sécurisé en retournant l&#8217;erreur HTTP 403. Ils peuvent aussi forcer la redirection sur HTTPS.</p><h4><a
name="SpringSecurity"></a>Spring Security</h4><p><a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a> utilise l&#8217;attribut <code><strong>requires-channel="https"</strong></code> qui est hélas légèrement trompeur puisqu&#8217;il repose sur la méthode <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a> plutôt que sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getScheme()" title="ServletRequest.getScheme()" >ServletRequest.getScheme()</a> et ne vérifie donc pas l&#8217;utilisation du protocole <code>https</code> mais le fait que la requête est <code>secure</code> pour le moteur de servlet.</p><pre class="brush: xml; title: ; notranslate">
&lt;beans
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:sec=&quot;http://www.springframework.org/schema/security&quot;
   xsi:schemaLocation=&quot;
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd
   &quot;&gt;
   &lt;sec:http auto-config=&quot;true&quot;&gt;
      &lt;sec:intercept-url pattern=&quot;/services/**&quot; requires-channel=&quot;https&quot; access=&quot;IS_AUTHENTICATED_FULLY&quot; /&gt;
   &lt;/sec:http&gt;
&lt;/beans&gt;
</pre><p><em>Configuration Spring Security forçant SSL</em></p><h4><a
name="APIServlet"></a>API Servlet</h4><p>L&#8217;API Servlet offre une approche déclarative similaire dans le fichier <code>web.xml</code> avec l&#8217;instruction <code><strong>&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;</strong></code> qui repose elle aussi sur <a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#isSecure()" title="ServletRequest.isSecure()" >ServletRequest.isSecure()</a>.</p><pre class="brush: xml; title: ; notranslate">
&lt;web-app
   xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
   xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
   version=&quot;2.5&quot;&gt;
   ...
   &lt;security-constraint&gt;
      &lt;web-resource-collection&gt;
         &lt;web-resource-name&gt;restricted web services&lt;/web-resource-name&gt;
         &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
      &lt;/web-resource-collection&gt;
      &lt;user-data-constraint&gt;
         &lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;
      &lt;/user-data-constraint&gt;
   &lt;/security-constraint&gt;
   ...
&lt;/web-app&gt;
</pre><p><em>Configuration web.xml forçant SSL</em></p><h3><a
name="Commenttransmettreaumoteurdese"></a>Comment transmettre au moteur de servlet l&#8217;information qu&#8217;une requête est sécurisée (SSL) ?</h3><p>Puisqu&#8217;il existe deux ports standards respectivement réservés au HTTP et au HTTPS, le standard des serveurs J2EE est d&#8217;utiliser une approche multi-canaux dans laquelle un port est réservé au canal sécurisé via HTTPS et l&#8217;autre non sécurisé via HTTP.<br
/> Avec la généralisation des proxy, des load-balancers et des cartes accélératrices SSL, il est maintenant fréquent que les requêtes HTTPS soient décryptées bien avant les serveurs JavaEE sur lesquels elles arrivent <em>en clair</em>.</p><p>Il existe alors deux approches pour différencier les requêtes HTTP et HTTPS :</p><ul><li>S&#8217;inspirer de la différenciation de ports utilisés par HTTPS et HTTP en faisant emprunter des canaux différents aux requêtes sécurisées et non sécurisées, même après le décryptage des premières.</li><li>S&#8217;inspirer de l&#8217;ajout par les proxys du header <code>X-Forwarded-For</code> pour propager l&#8217;adresse IP de l&#8217;appelant (cf <a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat  Adresse IP de linternaute load balancer reverse proxy et header Http XForwardedFor" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>) et introduire un header <code>X-Forwarded-Proto</code> pour indiquer le protocole utilisé.</li></ul><h4><a
name="Configurationmulticanauxutilis"></a>Configuration multi-canaux : utiliser des connecteurs/ports différents</h4><p>L&#8217;approche <em>historique</em> de Tomcat pour différencier les requêtes qui sont entrées en HTTPS de celles qui sont entrées en HTTP est de définir plusieurs connecteurs. Cette approche permet aussi bien de gérer l&#8217;encryption SSL dans Tomcat que, depuis la version 6, de la faire en amont dans le serveur web ou un load balancer hardware par exemple. Dans ce deuxième cas, un connecteur est configuré pour recevoir des communications en HTTP tout en valorisant <code>request.isSecure()</code> à <code>true</code> et <code>request.getScheme()</code> à <code>https</code>.</p><p>Hélas, cette configuration rend la gestion de requêtes sécurisées non SSL (<code>&lt;Connector ... secure="true" scheme="http" /&gt;</code>) très délicate, car la spécification Servlet stipule que le conteneur doit émettre un cookie de session &#8216;secure&#8217; si la requête HTTP à l&#8217;occasion de laquelle la session a été créée est &#8216;request.secure = true&#8217;.<br
/> Le problème vient du fait que des clients HTTP comme <a
href="http://hc.apache.org/httpclient-3.x/index.html" title="Jakarta Commons Http Client" >Jakarta Commons Http Client</a> traitent automatiquement les connections non SSL comme non sécurisées et ne renvoient donc pas le cookie <code>JSESSIONID</code> pour les appels non SSL même si celui ci a été défini comme <code>secure</code> par le conteneur. La définition de requêtes comme sécurisée mais non SSL est alors incompatible avec l&#8217;utilisation de sessions http avec une erreur très difficile à diagnostiquer. Du fait de ce problème, nous ne traiterons pas dans ce billet de la configuration Tomcat multi-canaux pour gérer les requêtes sécurisées qui n&#8217;utilisent pas SSL.</p><p>Exemple de configuration Tomcat multi-connecteurs pour dissocier les requêtes HTTP de requêtes HTTPS :</p><pre class="brush: xml; title: ; notranslate">
&lt;server&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;!-- Connecteur pour les requêtes non SSL --&gt;
      &lt;Connector ... scheme=&quot;http&quot; /&gt;
      &lt;!-- Connecteur pour les requêtes SSL --&gt;
      &lt;Connector ... secure=&quot;true&quot; scheme=&quot;https&quot; /&gt;
      ...
&lt;/server&gt;
</pre><p><em>Extrait de server.xml utilisant les attributs secure et scheme pour différencier les requêtes SSL</em></p><h4><a
name="Configurationmonocanalavechead"></a>Configuration mono-canal avec header HTTP : utiliser le header X-Forwarded-Proto</h4><p>Une autre approche, disponible dès le prochain Tomcat 6.0.21, est d&#8217;utiliser un header http pour indiquer si le protocole était http ou https. Ce header est communément nommé <code><strong>X-Forwarded-Proto: https|http</strong></code> (Microsoft Internet Security and Acceleration Server utilise <code>Front-End-HTTPS:on|off</code>). Ce header est souvent associé au header <code>X-Forwarded-For</code> déjà utilisé par les load balancers et proxys pour transmettre l&#8217;adresse IP de l&#8217;appelant.</p><p>Pour prévenir tout &#8216;<a
href="http://fr.wikipedia.org/wiki/Usurpation_d%27adresse_IP" title="spoofing" >spoofing</a>&#8216; des requêtes, il faut s&#8217;assurer que les points d&#8217;entrée HTTP/HTTPS de la plate-forme écrasent la valeur de ce header http <code>X-Forwarded-Proto</code> avec le protocole utilisé (<code>http</code> ou <code>https</code>) ; il s&#8217;agit de supprimer les headers nommés <code>X-Forwarded-Proto</code> s&#8217;ils existent et d&#8217;en insérer un nouveau ; omettre l&#8217;étape de suppression des headers <code>X-Forwarded-Proto</code> éventuellement existants serait une faille de sécurité.</p><p><strong>Gestion du header X-Forwarded-Proto avec une valve Tomcat</strong></p><p>La solution la plus simple pour gérer le header X-Forwarded-Proto sur un serveur Tomcat est de déclarer la valve RemoteIpValve dans le serveur Tomcat :</p><ol><li>En attendant Tomcat 6.0.21 qui embarquera la <code>RemoteIpValve</code>, télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0.jar" title="xebia-tomcat-extras-1.0.0.jar" >xebia-tomcat-extras-1.0.0.jar</a> ou compiler <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValvejava" >RemoteIpValve.java</a> et déployer le jar sous <code>TOMCAT_HOME/lib</code>.</li><li>Déclarer la <code>RemoteIpValve</code> (<a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve" title="doc" >doc</a>) dans <code>server.xml</code>. Cette valve doit être déclarée avant les autres valves qui s&#8217;appuient sur le protocole ou l&#8217;adresse IP de l&#8217;internaute. Il est possible de déclarer aussi la <code>SecuredRemoteAddressValve</code> (<a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressValve" title="doc" >doc</a>, également incluse dans xebia-tomcat-extras-1.0.0.jar) pour bénéficier du mécanisme de requête sécurisée non SSL :</li></ol><pre class="brush: xml; title: ; notranslate">
&lt;Server ...&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;Connector ... /&gt;
      &lt;Engine ...&gt;
         &lt;!-- Process x-Forwarded-For to get remote address and X-Forwarded-Proto to identify SSL requests --&gt;
         &lt;Valve className=&quot;org.apache.catalina.connector.RemoteIpValve&quot; protocolHeader=&quot;X-Forwarded-Proto&quot; /&gt;
         &lt;!-- Flag as secure all requests coming from private network IP address blocks. Must be declared after RemoteIpValve --&gt;
         &lt;Valve className=&quot;org.apache.catalina.connector.SecuredRemoteAddressValve&quot; /&gt;
         &lt;!-- AccessLogValve must be declared after RemoteIpValve to get the remote address and the scheme https/http --&gt;
         &lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; pattern=&quot;common&quot; prefix=&quot;access_log.&quot;
            resolveHosts=&quot;false&quot; suffix=&quot;.txt&quot; /&gt;
         ...
         &lt;/Host&gt;
      &lt;/Engine&gt;
   &lt;/Service&gt;
&lt;/Server&gt;
</pre><p><em>Gestion de SSL et des communications sécurisées avec des valves Tomcat</em></p><p><strong>Gestion du header X-Forwarded-Proto avec un filtre Servlet API</strong></p><p>Si vous ne pouvez pas changer la configuration Tomcat ou si vous utilisez un autre moteur de servlet (Glassfish, Websphere, Weblogic, etc), il est possible de gérer le header X-Forwarded-For grâce à un Servlet Filter de l&#8217;application web :</p><ol><li>Télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-servlet-extras-1.0.2.jar" title="xebia-servlet-extras-1.0.2.jar" >xebia-servlet-extras-1.0.2.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedFilter.java</a> ou ajouter la dépendance maven <code>fr.xebia.web.extras:xebia-servlet-extras:1.0.2</code> à votre <code>pom.xml</code> (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="doc" >doc</a>).</li><li>Déclarer <code>XForwardedFilter</code> (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="doc" >doc</a>) dans <code>web.xml</code> Cet filtre doit être déclaré avant les autres filtres qui s&#8217;appuient sur le protocole ou l&#8217;adresse IP de l&#8217;internaute. Il est possible de déclarer aussi le <code>SecuredRemoteAddressFilter</code> (<a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressFilter" title="doc" >doc</a>, intégré dans xebia-servlet-extras-1.0.2.jar) pour gérer les requêtes sécurisées non SSL :</li></ol><pre class="brush: xml; title: ; notranslate">
&lt;web-app ...&gt;
   ...
   &lt;filter&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;description&gt;Process x-Forwarded-For to get remote address and X-Forwarded-Proto to identify SSL requests&lt;/description&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.XForwardedFilter&lt;/filter-class&gt;
      &lt;init-param&gt;
         &lt;param-name&gt;protocolHeader&lt;/param-name&gt;
         &lt;param-value&gt;x-forwarded-proto&lt;/param-value&gt;
      &lt;/init-param&gt;
   &lt;/filter&gt;
   &lt;filter&gt;
      &lt;filter-name&gt;SecuredRemoteAddressFilter&lt;/filter-name&gt;
      &lt;description&gt;Flag as secure all requests coming from private network IP address blocks.
Must be declared after XForwardedFilter&lt;/description&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.SecuredRemoteAddressFilter&lt;/filter-class&gt;
   &lt;/filter&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;SecuredRemoteAddressFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   ...
&lt;/web-app&gt;
</pre><p><em>Gestion de SSL et des communications sécurisées avec des Servlet Filters</em></p><h3><a
name="Miseenoeuvremulticanauxetheade"></a>Mise en oeuvre multi-canaux et header X-Forwarded-Proto suivant les topologies Tomcat</h3><h4><a
name="TopologieLoadBalancerHardwareA"></a>Topologie Load Balancer Hardware Apache Httpd Tomcat</h4><p>Il est très fréquent, lorsqu&#8217;une application web doit être hautement disponible, de faire précéder les serveurs web d&#8217;un Load Balancer Hardware qui devient alors un <a
href="http://fr.wikipedia.org/wiki/Spof" title="Single Point Of Failure" >Single Point Of Failure</a> extrêmement fiable. Nous prendrons pour ce paragraphe l&#8217;hypothèse que le load balancer hardware prend en charge l&#8217;encryption HTTPS.</p><p><strong>Remarque SSL et load balancer</strong></p><p>La pertinence de gérer SSL dans le load balancer est très discutée ; certains y sont farouchement opposés (cf <a
href="http://www.loadbalancing.org/" title="loadbalancing.org" >loadbalancing.org</a>), d&#8217;autres sont plus mesurés (c.f. <a
href="http://haproxy.1wt.eu/" title="HAProxy" >HAProxy</a>) et enfin les vendeurs de load balancers hardware y sont très favorables <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Ce débat, qui porte aussi sur la pertinence de déléguer la compression (aka gzip ou deflate) au load balancer, dépasse le cadre de ce billet et le domaine de compétence des architectes applicatifs. Pour aller plus loin, nous vous recommandons <a
href="http://1wt.eu/articles/2006_lb/" title="Making applications scalable with Load Balancing" >Making applications scalable with Load Balancing</a> de Willy Tarreau (<a
href="http://haproxy.1wt.eu/" title="HA Proxy" >HA Proxy</a>).</p><p><strong>Remarque Apache et mod_proxy_http</strong></p><p>Nous utiliserons dans ce billet Apache Httpd en version 2.2.11 avec le connecteur mod_proxy_http / mod_proxy_balancer. Il serait également possible d&#8217;utiliser le protocole AJP (avec mod_jk, mod_proxy_ajp ou mod_cluster) ; nous expliquerons notre préférence pour mod_proxy_http dans un prochain billet.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-load-balancing.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-load-balancing-300x178.png" alt="tomcat-load-balancing" title="tomcat-load-balancing" width="300" height="178" class="alignnone size-medium wp-image-3094" /></a></div><p><strong>Gestion du paramètre X-Forwarded-Proto dans les load balancers</strong></p><p>L&#8217;utilisation du header X-Forwarded-Proto nécessite une configuration très simple : le load balancer valorise le header X-Forwarded-Proto, les serveurs web et Tomcat écoutent sur un seul port et la RemoteIpValve Tomcat (ou le XForwardedFilter) traite le header X-Forwarded-Proto pour valoriser request.isSecure() et request.getScheme() .</p><p>Note : cette approche permet très facilement de gérer les communications sécurisées non SSL en utilisant une <a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressValve" title="SecuredRemoteAddressValve" >SecuredRemoteAddressValve</a> Tomcat (ou un <a
href="http://code.google.com/p/xebia-france/wiki/SecuredRemoteAddressFilter" title="SecuredRemoteAddressFilter" >SecuredRemoteAddressFilter</a>) qui marquera request.isSecure() des requêtes non SSL émises depuis des plages d&#8217;adresses IP pré-déterminées.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-mono-channel-with-x-forwarded-proto-header.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-mono-channel-with-x-forwarded-proto-header-300x176.png" alt="tomcat-ssl-mono-channel-with-x-forwarded-proto-header" title="tomcat-ssl-mono-channel-with-x-forwarded-proto-header" width="300" height="176" class="alignnone size-medium wp-image-3098" /></a></div><p>Sur un F5 Big-IP, le header X-Forwarded-Proto sera défini grâce à une iRule de type :</p><pre class="brush: xml; title: ; notranslate">
when HTTP_REQUEST {
   HTTP::header remove X-Forwarded-Proto
   HTTP::header insert X-Forwarded-Proto http
}
when HTTPS_REQUEST {
   HTTP::header remove X-Forwarded-Proto
   HTTP::header insert X-Forwarded-Proto https
}
</pre><p>Source : <a
href="http://devcentral.f5.com/wiki/default.aspx/iRules/HTTP__header.html" title="F5 DevCentral wiki  HTTPheader" >F5 DevCentral wiki &#8211; HTTP::header</a></p><p><strong>Astuce Big-IP iRules: &#8216;remove&#8217; versus &#8216;replace&#8217;</strong></p><p>Par rigueur, nous avons préféré utiliser <code>HTTP::header remove</code> puis <code>HTTP::header insert</code> plutôt que <code>HTTP::header replace</code> qui ne traite que la première occurence du header. Si une personne malveillante injecte plusieurs headers <code>X-Forwarded-Proto</code>, <code>HTTP::header replace</code> n&#8217;écrasera que la première occurence alors que le duo <code>HTTP::header remove</code> &#038; <code>HTTP::header insert</code> les supprimera toutes avant d&#8217;en insérer une valide.</p><p>La configuration du serveur Http est alors triviale, il suffit d&#8217;écouter sur le seul port 80 et de transmettre au serveur Tomcat en <em>passe plat</em>.</p><pre class="brush: xml; title: ; notranslate">
..
# 'myapplication' cluster
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
ProxyPreserveHost On
ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
</pre><p><em>Configuration Apache httpd.conf</em></p><p><strong>Gestion multi-canaux depuis le load balancer</strong></p><p>La configuration multi-canaux du load balancer nécessite une configuration plus lourde des serveurs Apache et Tomcat puisque le nombre de canaux (port d&#8217;écoute, etc) est doublé.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-dual-channels.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-ssl-dual-channels-300x199.png" alt="tomcat-ssl-dual-channels" title="tomcat-ssl-dual-channels" width="300" height="199" class="alignnone size-medium wp-image-3097" /></a></div><pre class="brush: xml; title: ; notranslate">
# 'myapplication' non ssl and ssl clusters
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;Proxy balancer://myapplicationssl&gt;
   BalancerMember      http://node-1:8083 route=node-1
   ...
   BalancerMember      http://node-n:8083 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:83&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
</pre><p><em>Configuration Apache httpd.conf multi canaux</em></p><h4><a
name="TopologieApacheHttpdTomcat"></a>Topologie Apache Httpd &#8211; Tomcat</h4><p><strong>Gestion du paramètre X-Forwarded-Proto dans Apache</strong></p><p>Bien qu&#8217;il soit possible de décrypter SSL sur les serveur web Apache Httpd, nous préférons largement la déléguer au load balancer pour les raisons suivantes :</p><ul><li>Sécurité : la passphrase d&#8217;un certificat SSL est un secret très sensible qu&#8217;il est plus facile de gérer sur un nombre très limité de load balancers à l&#8217;accès très restreint plutôt que sur les serveurs web qui sont plus nombreux et sur lesquels de nombreuses équipes interviennent. Il est certes possible de protéger la passphrase d&#8217;un serveur Apache en limitant l&#8217;acccès au user <code>root</code> mais on voit souvent sur le terrain le user <code>root</code> de serveur web utilisé par beaucoup d&#8217;intervenants pour faciliter le travail au quotidien. Il est beaucoup plus simple de limiter les accès sur des serveurs ultra spécialisés comme les load balancers.</li><li>Performance : HTTPS est très consommateur en CPU et son tuning est délicat (réutilisation des sessions SSL, etc). Pour plus de détails, <a
href="http://people.apache.org/~sctemme/ApconEU2008/Performance_Up.pptx" title="Apache Con EU 2008  Apache Performance Tuning" >Apache Con EU 2008 &#8211; Apache Performance Tuning</a> par Sander Temme.</li><li>Simplicité : grâce à l&#8217;utilisation d&#8217;un header X-Forwarded-Proto pour indiquer le protocole utilisé, la configuration du serveur se limite au seul port d&#8217;écoute 80.</li></ul><p>Si vous avez malgré tout besoin de décrypter HTTPS dans les serveurs web, voici un exemple de configuration Apache Httpd.</p><pre class="brush: xml; title: ; notranslate">
# 'myapplication' cluster
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
# Declare X-Forwarded-Proto as &quot;http&quot; for incoming request
RequestHeader set X-Forwarded-Proto &quot;http&quot;
...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:443&gt;
# mod_ssl configuration
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile &quot;/private/etc/apache2/server.crt&quot;
SSLCertificateKeyFile &quot;/private/etc/apache2/server.key&quot;
# Overwrite X-Forwarded-Proto declaration for port 443, request are &quot;https&quot;
RequestHeader set X-Forwarded-Proto &quot;https&quot;
...
&lt;/VirtualHost&gt;
..
ProxyPreserveHost On
ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
</pre><p><em>Configuration Apache httpd.conf portant le header X-Forwarded-Proto</em></p><p><strong>Remarque Apache Httpd</strong> : Il n&#8217;est pas possible de déclarer deux points de configuraiton pour un même <code>&lt;VirtualHost /&gt;</code>, par conséquent, si votre configuration référence un fragment <code>extra/httpd-ssl.conf</code> pour gérer SSL, vous devez modifier ce fragment pour ajouter la directive <code>RequestHeader set ...</code>, plutôt que d&#8217;utiliser un fragment <em>&#8216;maison&#8217;</em> <code>extra/httpd-myconfig.conf</code>.</p><h4><a
name="Gestionmultirseaux"></a>Gestion multi-réseaux</h4><p>La gestion multi-réseaux avec Apache n&#8217;est pas particulièrement compliquée mais introduit une duplication de code verbeux qu&#8217;il est agréable d&#8217;éviter car il faut déclarer deux balancers qui ne diffèrent que par leur port d&#8217;écoute.</p><pre class="brush: xml; title: ; notranslate">
# 'myapplication' non ssl and ssl clusters
&lt;Proxy balancer://myapplication&gt;
   BalancerMember      http://node-1:8080 route=node-1
   ...
   BalancerMember      http://node-n:8080 route=node-n
&lt;/Proxy&gt;
&lt;Proxy balancer://myapplicationssl&gt;
   BalancerMember      http://node-1:8083 route=node-1
   ...
   BalancerMember      http://node-n:8083 route=node-n
&lt;/Proxy&gt;
&lt;VirtualHost default:80&gt;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplication/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
&lt;VirtualHost default:443&gt;
   SSLEngine on
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
   SSLCertificateFile &quot;/private/etc/apache2/server.crt&quot;
   SSLCertificateKeyFile &quot;/private/etc/apache2/server.key&quot;
   ...
   ProxyPreserveHost On
   ProxyPass /mypath balancer://myapplicationssl/mypath stickysession=JSESSIONID
   ...
&lt;/VirtualHost&gt;
</pre><p><em>Configuration Apache httpd.conf multi canaux</em></p><h4><a
name="Tomcatseul"></a>Tomcat seul</h4><p>L&#8217;utilisation de Tomcat seul, sans serveur web ni load balancer en amont, simplifie le choix. Tomcat écoute à la fois en http et https (généralement respectivement les ports 80 et 443). Seule l&#8217;approche multi-connecteurs s&#8217;applique. La littérature regorge de mises en oeuvre de SSL avec Tomcat. Le principal point d&#8217;attention est la délégation de l&#8217;encryption SSL à OpenSSL grâce au connecteur APR (Http11AprConnector) plutôt que de reposer sur l&#8217;implémentation SSL des JVM (JSSE) qui est beaucoup moins performante.</p><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-openssl.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2009/11/tomcat-openssl-300x179.png" alt="tomcat-openssl" title="tomcat-openssl" width="300" height="179" class="alignnone size-medium wp-image-3095" /></a></div><pre class="brush: xml; title: ; notranslate">
&lt;server&gt;
   ...
   &lt;Listener className=&quot;org.apache.catalina.core.AprLifecycleListener&quot; SSLEngine=&quot;on&quot; SSLRandomSeed=&quot;builtin&quot; /&gt;
   ...
   &lt;Service name=&quot;Catalina&quot;&gt;
      &lt;Connector protocol=&quot;org.apache.coyote.http11.Http11AprProtocol&quot;
           port=&quot;8443&quot; minSpareThreads=&quot;5&quot; maxSpareThreads=&quot;75&quot;
           enableLookups=&quot;true&quot; disableUploadTimeout=&quot;true&quot;
           acceptCount=&quot;100&quot;  maxThreads=&quot;200&quot;
           scheme=&quot;https&quot; secure=&quot;true&quot; SSLEnabled=&quot;true&quot;
           SSLCertificateFile=&quot;/usr/local/ssl/server.crt&quot;
           SSLCertificateKeyFile=&quot;/usr/local/ssl/server.pem&quot;
           clientAuth=&quot;false&quot; sslProtocol=&quot;TLS&quot;/&gt;
      ...
&lt;/server&gt;
</pre><p><em>Extrait de server.xml</em></p><p><strong>Astuce : comment éviter de démarrer le serveur Tomcat avec les privilèges <code>root</code> ?</strong></p><p>Sur les serveur Unix/Linux, écouter sur les ports <1024 requiert les privilèges <code>root</code> ; faire écouter un serveur Tomcat sur les ports 80 (http) et 443 (https) devient donc très délicat pour la sécurité de la plate-forme. Une astuce est d'utiliser <code>iptables</code> pour faire du <em>port forwarding</em> de 80 et 443 vers 8080 et 8443. Plus de détails dans <a
href="http://wiki.apache.org/tomcat/HowTo#head-18d1c3f3fa702a1be769340784515eecce6e0ac9" title="Tomcat Wiki - How to run Tomcat without root priviledges?" >Tomcat Wiki - How to run Tomcat without root priviledges?</a> ou <a
href="http://rifers.org/wiki/display/RIFE/Installing+Tomcat+on+port+80+with+iptables" title="Rife   Installing Tomcat on port 80 with iptables" >Rife -  Installing Tomcat on port 80 with iptables</a>.</p><h3><a
name="QuechoisirMulticanauxouheaderX"></a>Que choisir ? Multi-canaux ou header X-Forwarded-Proto ?</h3><p>Si l'approche multi-canaux avec un premier connecteur pour les communications non http  et un second pour les communications https/ssl a le mérite d'être l'approche "historique", elle présente les défauts de :</p><ul><li>ne pas gérer les communications sécurisées non http,</li><li>complexifier sensiblement les configurations Apache Httpd et, dans une moindre mesure, Tomcat.</li></ul><p>Notre préférence va à l'utilisation d'un header http X-Forwarded-Proto qui permet de simplifier les configurations Apache Httpd et Tomcat et aussi de permettre des communications sécurisées non SSL.</p><p>L'argument d'une complexification de la configuration Tomcat par l'ajout de la RemoteIpValve (ou du XForwardedFilter) est discutable puisque cette valve est la plupart du temps nécessaire pour gérer le header X-Forwarded-For qui permet d'obtenir l'adresse IP de l'internaute, élément important pour l'audit d'actions qui requièrent SSL.</p><p>2010/01/31 : Montée de version de xebia-servlet-extras en version 1.0.2 pour corriger <a
href="http://code.google.com/p/xebia-france/issues/detail?id=4">Issue 4 - XForwardedFilter : request.secure and request.scheme are not forced to "false" and "http" if X-Forwarded-Proto=http</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/11/13/tomcat-ssl-communications-securisees-et-x-forwarded-proto/feed/</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Java Cloud : après Tomcat, c&#8217;est au tour de Jetty !</title><link>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/</link> <comments>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/#comments</comments> <pubDate>Thu, 03 Sep 2009 17:24:25 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Jetty]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Tomcat]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2774</guid> <description><![CDATA[Après Tomcat qui rentrait cet été de plain-pied dans l&#8217;univers du Java Platform as a Service avec le mariage de SpringSource à VMWare et à CloudFoundry, c&#8217;est au tour de l&#8217;autre moteur léger de servlets, Jetty/Webtide, de s&#8217;adosser à un acteur du Cloud Computing, Intalio, pour développer son offre. Une reconnaissance méritée C&#8217;est une très [...]]]></description> <content:encoded><![CDATA[<p>Après Tomcat qui rentrait cet été de plain-pied dans l&#8217;univers du Java Platform as a Service avec le mariage de SpringSource à VMWare et à CloudFoundry, c&#8217;est au tour de l&#8217;autre moteur léger de servlets, Jetty/<a
href="http://www.webtide.com/">Webtide</a>, de s&#8217;adosser à un acteur du Cloud Computing, <a
href="http://www.intalio.com">Intalio</a>, pour développer son offre.</p><p><strong>Une reconnaissance méritée</strong><br
/> C&#8217;est une très belle opportunité pour Jetty qui était jusqu&#8217;à présent beaucoup plus embarqué que Tomcat par des grands projets de Cloud Computing (Google App Engine, Hadoop, Gigaspace XAP, etc) mais n&#8217;avait pas constitué sa propre offre.</p><p><strong>Sur les pas d&#8217;Amazon ?</strong><br
/> Le mariage d&#8217;Intalio avec Webtide est assez différent de celui de SpringSource avec VMWare et Cloud Foundry. Alors que la deuxième union concerne des spécialistes de l&#8217;infrastructure, Intalio est lui issu de l&#8217;univers des applications CRM et s&#8217;étend vers les infrastructures de Cloud Computing comme l&#8217;a fait Amazon auparavant.</p><p><strong>Des serveurs J2EE <em>lourds</em> absents</strong><br
/> Nous remarquerons à l&#8217;occasion que les serveurs J2EE <em>heavyweight</em> se font très discrets dans cette période d&#8217;avalanche d&#8217;annonces sur Java Platform as a Service, on peut s&#8217;attendre à ce qu&#8217;ils répondent sur cette tendance qui va bouleverser les modes de fonctionnement dans les data centers et menacer leurs parts de marché.</p><p><strong>Ils en parlent</strong></p><ul><li><a
href="http://www.intalio.com/news/press-releases/intalio-acquires-webtide-developer-of-the-jetty-application-server/">L&#8217;annonce officielle par Intalio</a></li><li><a
href="http://blogs.webtide.com/gregw/entry/urbanization_in_the_noosphere_intalio">L&#8217;annonce par Greg Wilkins, co-fondateur de Webtide</a></li><li>InfoQ : <a
href="http://www.infoq.com/news/2009/09/intalio-acquires-webtide">Intalio acquires Webtide</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/03/java-cloud-apres-tomcat-cest-au-tour-de-jetty/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Java Platform As A Service : SpringSource accélère</title><link>http://blog.xebia.fr/2009/08/19/java-platform-as-a-service-springsource-accelere/</link> <comments>http://blog.xebia.fr/2009/08/19/java-platform-as-a-service-springsource-accelere/#comments</comments> <pubDate>Wed, 19 Aug 2009 14:29:46 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Amazon]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[EC2]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2679</guid> <description><![CDATA[SpringSource continue à dérouler son plan de Java Platform As A Service avec le rachat de Cloud Foundry, le spécialiste de plate-forme Apache / Tomcat / MySQL sur Amazon EC2. Rod Johnson annonce dans SpringSource Launches Enterprise Java Cloud que SpringSource offrira à ses clients non seulement la possibilité de déployer sur le cloud public [...]]]></description> <content:encoded><![CDATA[<p>SpringSource continue à dérouler son plan de <strong>Java Platform As A Service</strong> avec le rachat de <a
href="http://www.cloudfoundry.com/">Cloud Foundry</a>, le spécialiste de plate-forme Apache / Tomcat / MySQL sur Amazon EC2.</p><p>Rod Johnson annonce dans <a
href="http://blog.springsource.com/2009/08/19/cloud-foundry/">SpringSource Launches Enterprise Java Cloud</a> que SpringSource offrira à ses clients non seulement la possibilité de déployer sur le cloud public Amazon EC2 mais aussi et surtout sur des clouds privés.</p><p>Il s&#8217;agira vraisemblablement de la mutualisation de nos plates-formes Java actuelles avec un <em>chef d&#8217;orchestre</em> Hyperic et des serveurs tc Server (Tomcat augmenté de fonctionnalités d&#8217;administration) ; la JVM sera Sun HotSpot et l&#8217;OS de prédilection sera RehHat  Enterprise Linux <em>(RHEL)</em> même si Windows, Solaris et MacOSX seront proposés <em>(détails <a
href="http://static.springsource.com/projects/tc-server/6.0/getstart/rgssupplat.html">ici</a>)</em>.</p><p>Il ne nous faudra que quelques minutes pour déployer de nouvelles applications web ou pour ajuster les ressources CPU et mémoire allouée à une application par l&#8217;ajout ou la suppression de nœuds dans un cluster.</p><p>Techniquement, il n&#8217;y a pas de rupture par rapport à ce qu&#8217;offrent depuis longtemps les serveurs JEE &laquo;&nbsp;lourds&nbsp;&raquo; <em>(IBM WebSphere, Oracle/BEA Weblogic, RedHat JBoss App Server ou Sun Glassfish)</em>.</p><p>Cependant, les mentalités ont changé, les esprits sont marqués par la simplicité d&#8217;exploitation des Public Clouds. Les équipes d&#8217;exploitation sont en train de se transformer, les processus s&#8217;allègent et l&#8217;offre <em>lightweight</em> de SpringSource tombe à point nommé.</p><p>Et la virtualisation matérielle dans tout ça ? Rod Johnson nous dit que la <strong>Tomcat Platform As A Service</strong> s&#8217;exécutera <em>&laquo;&nbsp;aussi sur vSphere&nbsp;&raquo;</em>, le produit phare de son récent acquéreur VMWare. La nuance est forte entre <em>&laquo;&nbsp;aussi sur&nbsp;&raquo;</em> et <em>&laquo;&nbsp;principalement sur&nbsp;&raquo;</em>.<br
/> Nous le verrons à l&#8217;usage, le duo RHEL / Sun JVM sera la couche d&#8217;abstraction suffisante pour exécuter la plupart de nos applications Java. Le renfort de la virtualisation matérielle ne se justifiera que dans un nombre limité de cas comme les serveurs J2EE s&#8217;avèrent rarement nécessaire face aux simples Tomcat, Jetty ou Glassfish V3 &#8230;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/08/19/java-platform-as-a-service-springsource-accelere/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Pourquoi VMWare / SpringSource ? Virtualisation matérielle vs. Cloud</title><link>http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/</link> <comments>http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#comments</comments> <pubDate>Mon, 17 Aug 2009 11:16:27 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Cloud / NoSQL]]></category> <category><![CDATA[Cloud Computing]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Virtualisation]]></category> <category><![CDATA[VMWare]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2637</guid> <description><![CDATA[Pourquoi VMWare a racheté SpringSource dont le métier et la culture sont si différents ? Pourquoi un tel prix ? Mon analyse est que VMWare a racheté SpringSource parce que le cloud computing de forme Platform As A Service (PaaS) à la Google App Engine va bientôt mieux répondre que la virtualisation matérielle aux besoins [...]]]></description> <content:encoded><![CDATA[<p>Pourquoi VMWare a racheté SpringSource dont le métier et la culture sont si différents ? Pourquoi un tel prix ?</p><p>Mon analyse est que VMWare a racheté SpringSource parce que <strong>le cloud computing de forme Platform As A Service (PaaS) <em>à la Google App Engine</em> va bientôt mieux répondre que la virtualisation matérielle aux besoins d&#8217;optimisation des data centers Java</strong>. Selon l&#8217;adage &laquo;&nbsp;Si quelqu&#8217;un scie la branche sur laquelle je suis assis, mieux vaut que ce soit moi&nbsp;&raquo;, VMWare s&#8217;est dotée de l&#8217;expertise de SpringSource sur Tomcat et Hyperic.<br
/> Je parlerai des applications Java <em>légères</em> (Servlets, JDBC, JPA et JMS) qui sont aujourd&#8217;hui largement majoritaires dans nos data centers Java. Billy Newport, IBM WebSphere, <a
href="http://www.devwebsphere.com/devwebsphere/2009/08/why-java-is-so-important-to-vmware.html" title="reconnait quelles reprsentent 80 des cas" >reconnait qu&#8217;elles représentent 80% des cas</a>, SpringSource aurait sûrement des chiffres plus élevés.</p><ul><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#OptimiserlaCPUdesdatacenters">Optimiser la CPU des data centers</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#Lesatoutsdelavirtualisationmat">Les atouts de la virtualisation matérielle</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#Leslimitationsdelavirtualisati">Les limitations de la virtualisation matérielle pour Java</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#MutualisationenJavaDesimplesse">Mutualisation en Java : De simples serveurs Linux-Tomcat suffisent</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#AdaptationCPUetRAMenJavaLemodl">Adaptation CPU et RAM en Java : Le modèle &#8216;scale out&#8217;</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#VirtualisationmatrielUnmarchpl">Virtualisation matériel : Un marché plus concurrentiel et moins lucratif</a></li><li><a
href="http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/#OnesizedoesnotfitallConcilierv">One size does not fit all : Concilier virtualisation matérielle et cloud pour optimiser l&#8217;utilisation des data centers</a></li></ul><h4><a
name="OptimiserlaCPUdesdatacenters"></a>Optimiser la CPU des data centers</h4><p>Les data centers débordent, l&#8217;électricité manque, les climatisations saturent, les planchers s&#8217;effondrent, les racks sont pleins et pourtant, les serveurs ne font rien, les CPU ne sont utilisées qu&#8217;à quelques pourcents !<br
/> La virtualisation matérielle, dont VMWare est un des leaders, propose d&#8217;adresser ce problème en introduisant une couche d&#8217;abstraction appelée hyperviseur entre le matériel et le système d&#8217;exploitation : plusieurs instances de système d&#8217;exploitation s&#8217;exécutent ainsi sur la même machine.<br
/> Considérons 10 serveurs qui consomment chacun en moyenne 5% de CPU, la virtualisation matérielle permet de les regrouper sur une seule machine physique qui atteindrait alors un taux d&#8217;utilisation de l&#8217;ordre de 50%. Malgré la chute du prix de la RAM, la mémoire vive de ce serveur mutualisé risque fort d&#8217;être insuffisante, l&#8217;hyperviseur règlera ce problème en recourant à la pagination de la mémoire (swap) comme un système d&#8217;exploitation le fait déjà à son niveau.<br
/> Et si par malheur ces serveurs venaient à être sollicités en même temps et à saturer la machine qui les héberge, les solutions de virtualisation parviennent maintenant à déplacer certaines instances sur d&#8217;autres serveurs physiques de façon transparente, sans même arrêter le service.</p><h4><a
name="Lesatoutsdelavirtualisationmat"></a>Les atouts de la virtualisation matérielle</h4><p>Un atout essentiel de la virtualisation est le <strong>très faible coût d&#8217;adaptation des applications existantes</strong> puisqu&#8217;elles continuent à s&#8217;exécuter sur le même système d&#8217;exploitation avec le même voisinage. <strong>La virtualisation matérielle est transparente pour les applications</strong>, elle n&#8217;exige pas de changement de version du système d&#8217;exploitation, des librairies utilisées, des répertoires de travail ou des ports d&#8217;écoute.<br
/> Si une application est tellement exigeante qu&#8217;elle requiert une version de système d&#8217;exploitation dépassée ou qu&#8217;elle a été compilée avec la version très ancienne d&#8217;un driver de base de données, ce n&#8217;est pas grave. La virtualisation matérielle maintiendra cette application revêche isolée dans sa bulle et elle sera mutualisée comme les autres.<br
/> Un autre atout de la virtualisation est l&#8217;<strong>adaptation de la CPU et de la RAM allouée à chaque application selon ses besoins</strong>. De la même façon qu&#8217;un système d&#8217;exploitation sait allouer du temps CPU et de la RAM à une application qui a un pic d&#8217;utilisation, l&#8217;hyperviseur sait privilégier une instance parmi toutes celles qu&#8217;il exécute simultanément. Considérons 20 applications qui s&#8217;exécutent chacune sur un serveur bi-processeurs, la virtualisation matérielle permet de les regrouper sur un seul serveur quadri-processeurs et en cas de pic, allouer quatre processeurs à une seule application, le double de ce qu&#8217;offrait la solution non virtualisée.</p><h4><a
name="Leslimitationsdelavirtualisati"></a>Les limitations de la virtualisation matérielle pour Java</h4><p>La première limitation de Java à la virtualisation matérielle est la gestion de la mémoire par les machines virtuelles. Les JVM assument que toute la mémoire qu&#8217;on leur alloue est en RAM, elles accèdent indifféremment à tout cet espace mémoire et le parcourent intégralement très souvent pour les garbage collections. De ce fait, <strong>la performance des applications Java s&#8217;effondre dès que leur mémoire est paginée</strong>. Pire encore, certains composants comme les timers des caches ou des gestionnaires de transactions échouent lorsque les temps de réponse sont anormalement longs et les applications tombent alors en erreur.<br
/> Ce problème est d&#8217;autant plus crucial pour la virtualisation matérielle que, du fait des techniques de garbage collection, les <strong>JVM libèrent peu de mémoire quand les applications sont moins utilisées</strong>.<br
/> Par ailleurs, l&#8217;<strong>adaptation à l&#8217;exécution de la CPU et de la RAM allouée à chaque application selon ses besoins est inadaptée en Java.</strong><br
/> Le premier point bloquant est que l&#8217;espace mémoire utilisé par une JVM est défini au démarrage (Xmx) et ne peut changer lors de l&#8217;exécution. Ensuite, augmenter la puissance de traitement d&#8217;une application web Java nécessite non seulement d&#8217;allouer de la CPU et de la RAM, mais aussi de redimensionner les pools de threads http ou de connexions à la base de données ainsi que la taille de nombreux caches applicatifs (sessions http, objet venant de la base, etc).<br
/> Il faudrait donc que l&#8217;hyperviseur change les configurations Java, cela nécessite aujourd&#8217;hui d&#8217;interrompre le service pour redémarrer les applications. La promesse de transparence de la virtualisation matérielle devient caduque, le palliatif est d&#8217;avoir des middlewares qui interagissent avec la virtualisation matérielle.</p><h4><a
name="MutualisationenJavaDesimplesse"></a>Mutualisation en Java : De simples serveurs Linux-Tomcat suffisent</h4><p>Si certaines applications sont revêches à la mutualisation, Java fait plutôt preuve de très bon voisinage.<br
/> Une application Java est quasiment agnostique du système d&#8217;exploitation et des libraires qui l&#8217;entourent, il lui suffit d&#8217;un répertoire pour &#8216;dezipper&#8217; une JVM (<20 Mo), un moteur d'exécution (Tomcat < 5 Mo) et l'application.<br
/> Cette facilité d'installation est utilisée au quotidien. Nous développons sous Windows, MacOS ou Ubuntu pour déployer sur RHEL, AIX ou Solaris. Beaucoup d'équipes qui déploient en production sur un 'gros serveur' J2EE poussent même souvent plus loin cette portabilité en préférant utiliser pour le développement un serveur léger : Tomcat ou Jetty.<br
/> Pour ce qui est des problèmes de voisinage liés au port d'écoute ou aux répertoires utilisés, le monde Java, particulièrement sous Tomcat, a déjà banalisé ce partage en démarrant une instance de serveur par application web. De ce fait, il est fréquent de voir sur de simples serveurs bi-processeurs plus de quatre instances Tomcat démarrées.<br
/> Grâce à la faible adhérence d'une application Java à son environnement d'exécution et à l'habitude d'installer plusieurs serveurs « à la Tomcat », <strong>le niveau naturel de</strong> <strong>mutualisation des ressources CPU et RAM pour des applications Java est au dessus du système d&#8217;exploitation</strong>. La complexité et les coûts de la virtualisation matérielle sont très rarement justifiés avec Java. Une simple batterie de serveur Linux avec des serveurs Java &#8216;légers&#8217; comme Tomcat, Jetty ou Glassfish V3 répond au besoin d&#8217;optimisation des data centers Java en conciliant simplicité et faible coût.</p><h4><a
name="AdaptationCPUetRAMenJavaLemodl"></a>Adaptation CPU et RAM en Java : Le modèle &#8216;scale out&#8217;</h4><p>A la différence du modèle &#8216;scale-up&#8217; de la virtualisation matérielle qui augmente la CPU et la RAM d&#8217;une instance pour tenir la charge, Java utilise un modèle &#8216;scale-out&#8217; qui consiste à augmenter le nombre d&#8217;instances de l&#8217;application. Pour garantir la haute disponibilité ou la tenue à la charge, nous déployons des clusters de 2, plutôt 3, voire plus, instances de nos applications Java.<br
/> Déployer un nouveau nœud se fait aujourd&#8217;hui en moins d&#8217;une heure pour une équipe entrainée et ce délai va sensiblement diminuer. <strong>La roadmap de SpringSource Tc Server permettra d&#8217;adapter les ressources CPU et RAM d&#8217;une application Java en moins de 5 minutes d&#8217;ici deux ans au plus</strong> par simple démarrage ou arrêt de nœuds d&#8217;un cluster.<br
/> Les tâches à accomplir sont limitées pour SpringSource, IBM le propose depuis des années sur son sophistiqués mais complexe WebSphere eXtended Deployment et Gigaspace vient de l&#8217;introduire sur sa grille XAP sur un socle Jetty, SpringSource doit principalement ajouter un mécanisme de déploiement de Tomcat à l&#8217;agent Hyperic/AMS et améliorer le scripting de la gestion de configuration Tomcat du serveur d&#8217;administration Hyperic/AMS.</p><h4><a
name="VirtualisationmatrielUnmarchpl"></a>Virtualisation matériel : Un marché plus concurrentiel et moins lucratif</h4><p>En plus d&#8217;être remise en cause par la rupture technologique du cloud computing, la virtualisation matérielle est aujourd&#8217;hui confrontée à une baisse des marges. VMWare a connu des années très lucratives pendant lesquelles elle a été pionnière &#8216;pure player&#8217;. Certains disaient que « VMWare a porté sur architecture x86 la virtualisation des mainframes ».<br
/> Le marché de la virtualisation est aujourd&#8217;hui mature, les grands acteurs des systèmes d&#8217;exploitation se jettent dans la bataille et la concurrence s&#8217;annonce rude pour VMWare.<br
/> L&#8217;univers Windows est condamné à rétrécir mécaniquement pour VMWare avec l&#8217;arrivée en force de Microsoft. Les perspectives sont toutes aussi dures dans le monde Linux avec la montée en puissance des offres de RedHat ou de Sun. Nous avons vu par le passé que toutes les fonctionnalités clefs des gros Unix sont arrivées dans Linux ; les zones Solaris et les partitions AIX sont aujourd&#8217;hui banalisées, il n&#8217;y a pas de raison que ces technologies n&#8217;arrivent pas dans le système d&#8217;exploitation au pingouin.</p><h4><a
name="OnesizedoesnotfitallConcilierv"></a>One size does not fit all : Concilier virtualisation matérielle et cloud pour optimiser l&#8217;utilisation des data centers</h4><p>A l&#8217;époque où les applications n&#8217;étaient pas <em>friendly</em> à la mutualisation, la virtualisation était la technologie de prédilection pour optimiser l&#8217;utilisation des ressources des data centers. Aujourd&#8217;hui, les applications java légères déployées sous forme de cloud Platform As A Service sont très <em>friendly</em> à la mutualisation et se passent de la virtualisation matérielle. <strong>VMWare a suivi cette redistribution des cartes en achetant la solution de cloud computing Hyperic-TcServer-Tomcat de SpringSource.</strong><br
/> La virtualisation matérielle risque de ne pas être utilisée sur les applications légères (Java, .Net, PHP, etc) qui représentent aujourd&#8217;hui la tendance dominante mais garde sa position de leader pour optimiser l&#8217;utilisation des ressources CPU et RAM des autres types d&#8217;applications.</p><h4><a
name="Ressources"></a>Ressources</h4><ul><li>&laquo;&nbsp;<a
href="http://blog.springsource.com/2009/08/10/springsource-chapter-two/" title="SpringSource Chapter Two" >SpringSource: Chapter Two</a>&nbsp;&raquo; : L&#8217;annonce du rachat par Rod Johnson, fondateur de SpringSource.</li><li>&laquo;&nbsp;<a
href="http://blogs.vmware.com/console/2009/08/vmware-acquires-springsource.html" title="VMWare to acquire SpringSource" >VMWare to acquire SpringSource</a>&nbsp;&raquo; : L&#8217;annonce par Steve Herrod, CTO de VMWare.</li><li>&laquo;&nbsp;<a
href="http://www.devwebsphere.com/devwebsphere/2009/08/why-java-is-so-important-to-vmware.html" title="Why Java is important to VMware but may not matter long term" >Why Java is important to VMware but may not matter long term</a>&nbsp;&raquo; par Billy Newport, IBM WebSphere.</li><li>&laquo;&nbsp;<a
href="http://www.touilleur-express.fr/2009/08/11/springsource-rachete-par-vmware/" title="SpringSource rachet par VMware" >SpringSource racheté par VMware</a>&nbsp;&raquo; par Le Touilleur Express.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/08/17/pourquoi-vmware-springsource-virtualisation-materielle-vs-cloud/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>SpringOne 2009 &#8211; Sécurisation d&#8217;Apache Tomcat</title><link>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/</link> <comments>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/#comments</comments> <pubDate>Thu, 07 May 2009 12:31:25 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Sécurité]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1945</guid> <description><![CDATA[Depuis le rachat de Covalent en Janvier 2008, SpringSource est le premier contributeur au projet Apache Tomcat avec plus de 80% des commits ; Mark Thomas et Philip Thomas en sont les principaux acteurs. Tomcat est la pierre angulaire de l&#8217;offre middleware de SpringSource aujourd&#8217;hui composée de tc Server, une version professionnelle Open Source de [...]]]></description> <content:encoded><![CDATA[<p>Depuis le rachat de Covalent en Janvier 2008, SpringSource est le premier contributeur au projet Apache Tomcat avec plus de 80% des commits ; Mark Thomas et Philip Thomas en sont les principaux acteurs.</p><p>Tomcat est la pierre angulaire de l&#8217;offre middleware de SpringSource aujourd&#8217;hui composée de <a
href="http://www.springsource.com/products/tcserver" title="tc Server" >tc Server</a>, une version professionnelle Open Source de Tomcat et <a
href="http://www.springsource.com/products/dmserver" title="dm Server" >dm Server</a>, un serveur OSGi (le format d&#8217;assemblage que SpringSource préfère aux classiques .war).</p><p>Mark Thomas a présenté lors de <a
href="http://europe.springone.com/europe-2009/file?path=/springone-amsterdam-2009/slides/MarkThomas_SecuringApacheTomcatForYourEnvironment.pdf" title="SpringOne 2009  Securing Apache Tomcat For Your Environment" >SpringOne 2009 : Securing Apache Tomcat For Your Environment</a> les points essentiels sur ce sujet qui se décompose en trois thèmes : la confidentialité, l&#8217;intégrité et la disponibilité.</p><h3><a
name="Planifierlacorrectiondesvulnra"></a>Planifier la correction des vulnérabilités</h3><p>Même si les failles de sécurité sont extrêmement rares dans l&#8217;écosystème Java, il est nécessaire de se préparer à répondre à une vulnérabilité en ayant élaboré un plan d&#8217;application de correctifs. La réalité sera sûrement différente des plans, mais il est important d&#8217;avoir imaginé les rôles et responsabilités de chaque équipe (administrateurs, développement, support, recette, etc.) et de savoir quelle équipe fournira le chef de projet qui coordonnera tous les acteurs. Un plan de correction de vulnérabilités Tomcat comprendra typiquement les étapes suivantes :</p><ol><li>Prise de connaissance de la vulnérabilité : ces informations sont publiées sur le <a
href="http://tomcat.apache.org/security.html" title="site web de Tomcat" >site web de Tomcat</a>, diffusées sur les <a
href="http://tomcat.apache.org/lists.html" title="mailing lists Tomcat" >mailing lists Tomcat</a> (une liste dédiée aux annonces de sécurité et de mises à jour sera bientôt disponible) ; un contrat de support Tomcat permettra aussi d&#8217;être averti. Il faut également identifier l&#8217;équipe (admin, dév, support, etc.) responsable de suivre ces informations.</li><li>Lorsqu&#8217;une vulnérabilité est connue, il faut déterminer si elle s&#8217;applique à l&#8217;architecture mise en place (e.g. un problème AJP ne concernera pas les utilisateurs de mod_proxy_http, etc.) ; les équipes d&#8217;admin et de dév seront vraisemblablement impliquées dans cette étape. Un contrat de support pourra faciliter cette tâche.</li><li>S&#8217;il s&#8217;avère nécessaire d&#8217;appliquer le correctif, l&#8217;équipe de développement réalisera les premiers tests de non-régression sur un poste de travail avant que l&#8217;équipe d&#8217;administrateurs installe le fix sur un environnement de validation (e.g. intégration ou pré-production) pour que les équipes de recette réalisent des tests de non-régression plus poussés.</li><li>Une fois la non-régression confirmée par les équipes de recette, l&#8217;équipe d&#8217;administrateurs déploiera le correctif en production.</li><li>Le chef de projet qui gère la correction d&#8217;une vulnérabilité de sécurité pourra à tout moment décider d&#8217;arrêter tout ou partie de l&#8217;application en production pour prévenir une attaque.</li></ol><p>Ce type de plan pourrait sembler alarmiste ou excessif pour le monde Java mais il faut garder en tête que nous développons des applications critiques dont la compromission pourrait avoir des impacts autant financier que de notoriété.</p><h3><a
name="BonnespratiquesdinstallationTo"></a>Bonnes pratiques d&#8217;installation Tomcat</h3><h4><a
name="PermissionsOSJVMetrseau"></a>Permissions OS, JVM et réseau</h4><ul><li>Pour limiter l&#8217;impact en cas d&#8217;attaque réussie, créer un utilisateur dédié à l&#8217;exécution des serveurs tomcat (e.g. &#8216;tomcat&#8217;) aux droits limités à l&#8217;arborescence de répertoires utilisés par Tomcat. On pourra compléter cette approche par la création d&#8217;un groupe &#8216;tomcat&#8217; dont feront partie les utilisateurs qui auront accès en lecture seule aux fichiers de l&#8217;arborescence Tomcat. Sous Linux/Unix, cela correspond à une politique de répertoire <code>owner=rwx, group=r, other=none</code>.</li><li>En cas de doute sur la bienveillance des applications web déployées sur le serveur Tomcat, utiliser le Security Manager Java pour limiter les droits d&#8217;accès (fichiers, socket, etc.) de ces applications.</li><li>Utiliser des firewalls aussi bien entrants que sortants. Si les premiers sont le plus souvent installés, il est hélas fréquent de ne pas avoir les seconds. Sans cela, du code malicieux pourra sans difficulté faire sortir sur Internet des informations sensibles ou télécharger des programmes malveillants (chevaux de Troie, etc.).</li></ul><h4><a
name="Applicationspardfaut"></a>Applications par défaut</h4><p>Il ne faut installer les applications fournies par défaut dans Tomcat que si elles sont utilisées :</p><ul><li>Supprimer les applications <code>docs</code> et <code>examples</code>.</li><li>Remplacer l&#8217;application ROOT par une version épurée (e.g. <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05/root.war" title="ROOT.war" >ROOT.war</a>). Notez qui si vous ne spécifiez pas d&#8217;application ROOT, les appels à des URLs non définies par une des applications déployées retourneront un message &laquo;&nbsp;400 Bad Request&nbsp;&raquo; qui surprendra beaucoup plus que le traditionnel &laquo;&nbsp;404 Not Found&nbsp;&raquo;.</li><li>Supprimer les applications <code>manager</code> et <code>balancer-manager</code> si vous reposez sur le classique déploiement d&#8217;applications par copie de fichier.</li></ul><h4><a
name="Realms"></a>Realms</h4><p>Les Realms fournis avec Tomcat avaient jusqu&#8217;à présent pour forte limitation de ne pas offrir de mécanisme de verrouillage des comptes utilisateurs et étaient donc exposés aux <a
href="http://fr.wikipedia.org/wiki/Attaque_par_force_brute" title="attaques par force brute" >attaques par force brute</a>. Tomcat 6.0.19 introduit un <a
href="http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_19/java/org/apache/catalina/realm/LockOutRealm.java" title="LockOutRealm" >LockOutRealm</a> qui offre ce verrouillage ainsi qu&#8217;un <a
href="http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_19/java/org/apache/catalina/realm/CombinedRealm.java" title="CombinedRealm" >CombinedRealm</a> qui permet de combiner des users déclarés dans plusieurs realms. Par ailleurs, les <a
href="http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html#MemoryRealm" title="MemoryRealm" >MemoryRealm</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html#JDBCRealm" title="JDBCRealm" >JDBCRealm</a> ne devraient pas être utilisés en production respectivement parce que le premier ne permet pas de rechargement des users sans redémarrage et le second parce qu&#8217;il est limité à une seule connexion JDBC simultanée.</p><h4><a
name="ShutdownPortunreliquatdespremi"></a>Shutdown Port, un reliquat des premières heures de Java</h4><p>Le shutdown port servait pour les JVM inférieures à 1.3 qui ne supportaient pas les <a
href="http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)" title="shutdownHook" >shutdownHook</a> mais représente aujourd&#8217;hui une faille de sécurité : n&#8217;importe quel utilisateur connecté sur la machine peut arrêter le serveur Tomcat avec un simple telnet ; les mécanismes de permissions liés au propriétaire du processus sont ignorés.</p><p>Ce shutdown port doit être désactivé (<code>server port="-1" ... </code>) au profit du classique kill Unix ou d&#8217;un service Windows . Désactiver ce mécanisme nécessite une adaptation du script <code>catalina.sh</code> et, sur les plateformes linux/unix qui utilisent <code>kill</code>, s&#8217;accompagne de la déclaration dans <code>setenv.sh</code> de la variable <code>CATALINA_PID</code> pour créer un fichier qui porte l&#8217;id du processus Tomcat.</p><p>Si vous ne pouvez désactiver le shutdown port, remplacez la commande d&#8217;arrêt par défaut &laquo;&nbsp;SHUTDOWN&nbsp;&raquo; par un mot secret imprédictible. Il n&#8217;est hélas pas possible de filtrer l&#8217;adresse IP de l&#8217;appelant.<br
/> Exemple (Shutdown port avec un commande d&#8217;arrêt imprédictible) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Server port=&quot;8005&quot; shutdown=&quot;gat6eSpU&quot;/&gt;
</pre><h4>Logs et audit</h4><p>L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/AccessLogValve.html">AccessLogValve</a> doit être utilisée pour tracer les requêtes HTTP. On déclarera communément un fichier de log par host pour identifier le host saisi dans l&#8217;url d&#8217;appel qui, à la différence de l&#8217;URI, n&#8217;apparaît pas dans le fichier access_log. Si Tomcat est positionné derrière un load balancer ou un reverse proxy, il faut gérer le header X-Forwarded-For (voir &laquo;&nbsp;<a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/">Tomcat &#8211; Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>&laquo;&nbsp;).</p><p>Ces fichiers de log, au même titre que les logs applicatives, doivent être archivés.</p><p>Exemple (configuration d&#8217;un Access Log par Host) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
suffix=&quot;.txt&quot; pattern=&quot;common&quot; resolveHosts=&quot;false&quot; /&gt;
</pre><h4><a
name="Filtragedesrequtesentrantes"></a>Filtrage des requêtes entrantes</h4><p>Tomcat permet de filtrer les requêtes en fonction de l&#8217;adresse IP ou du host de l&#8217;appelant (respectivement <a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/RemoteAddrValve.html" title="RemoteAddrValve" >RemoteAddrValve</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/RemoteHostValve.html" title="RemoteHostValve" >RemoteHostValve</a>). Le deuxième filtre connaît peu de scénarios d&#8217;utilisation. Comme pour l&#8217;AccessLogValve, si Tomcat est positionné derrière un load balancer ou un reverse proxy, il faut gérer le header X-Forwarded-For (voir infra &laquo;&nbsp;Adresse IP de l&#8217;internaute, reverse proxy et header Http X-Forwarded-For&nbsp;&raquo;). Exemple (Filtrage des IP appelantes) :</p><pre class="brush: xml; title: ; notranslate">
&lt;Valve className=&quot;org.apache.catalina.valves.RemoteAddrValve&quot; allow=&quot;127.0.0.1&quot; /&gt;
</pre><h4>Protection des mots de passe présents dans la configuration</h4><p>Tomcat a exclu la mise en oeuvre de mécanismes de protection des mots de passe saisis dans les fichiers de configuration au motif que ces mécanismes nécessitent l&#8217;utilisation d&#8217;un nouveau secret d&#8217;obfuscation qui devient alors difficile à protéger et conduirait donc à un problème de type &laquo;&nbsp;serpent qui se mord la queue&nbsp;&raquo;.</p><p>Nous corroborerons ce raisonnement remettant en cause les mécanismes de type &laquo;&nbsp;protection pour qu&#8217;on ne se souvienne pas du mot de passe en regardant par dessus l&#8217;épaule d&#8217;un administrateur&nbsp;&raquo; : si un mot de passe est vraiment compliqué (majuscules, minuscules, chiffres et caractères de ponctuation), il n&#8217;est pas mémorisable d&#8217;un simple coup d&#8217;oeil ; la génération de tels mots de passe est très simple avec les nombreux sites web qui offrent gratuitement ce service (e.g. <a
href="http://www.pctools.com/guides/password/">PC Tools Secure Password Generator</a>).</p><h4>Limitations des déploiements d&#8217;applications</h4><p>Tomcat offre le déploiement de nouvelles applications lorsque le serveur est déjà démarré. Cette fonctionnalité se désactive en positionnant la propriété <code>autoDeploy</code> à <code>false</code> :<br
/> Désactivation du déploiement d&#8217;applications lorsque Tomcat est démarré :</p><pre class="brush: xml; title: ; notranslate">
&lt;Host autoDeploy=&quot;false&quot; ... &gt;
</pre><p>Tomcat permet également de déployer de nouvelles applications présentes sous le répertoire <code>webapps</code> (nom de répertoire défini par la propriété <code>appbase</code>). Cette fonctionnalité se désactive en positionnant la propriété <code>deployOnStartup</code> à <code>false</code> :<br
/> Désactivation du déploiement d&#8217;applications au démarrage de Tomcat :</p><pre class="brush: xml; title: ; notranslate">
&lt;Host deployOnStartup=&quot;false&quot; ...&gt;
</pre><p>Lorsque ces deux propriétés sont désactivées, seules les applications déclarées dans <code>server.xml</code> sont déployées.</p><p>Par ailleurs, la propriété <code>deployXML</code> permet, en la mettant à <code>false</code>, de désactiver les éléments de configuration embarqués par les web applications dans le fichier <code>/META-INF/context.xml</code></p><h4>Protection contre les dénis de service</h4><p>Les connecteurs <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/http.html">Http</a> et <a
href="http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html">AJP</a> intègrent une protection contre les <a
href="http://fr.wikipedia.org/wiki/D%C3%A9ni_de_service">dénis de service</a> en limitant la taille des requêtes (attribut <code>maxPostSize</code> dont la limite par défaut est de 2 Mo) et limitant la taille des requêtes lors d&#8217;authentification par certificat client ou formulaire géré par Tomcat (attribut <code>maxSavePostSize</code> dont la limite par défaut est de 4 Ko). Cette limite s&#8217;applique au corps de la requête et pas aux uploads de fichiers dont la limitation est déléguée au framework qui gère l&#8217;upload. Par exemple, <a
href="http://commons.apache.org/fileupload/">Apache Commons File Upload</a> offre pour cela un paramètre <a
href="http://commons.apache.org/fileupload/using.html">maxSize</a>.</p><p>Apache Httpd offre un mécanisme similaire avec la directive <a
href="http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody">LimitRequestBody</a> mais cette protection n&#8217;est pas activée par défaut.</p><h4>Autres bonnes pratiques de sécurité</h4><p>La taille d&#8217;un fichier <code>server.xml</code> ne devrait pas dépasser un écran, il faut retirer ce qui est inutile (dans l&#8217;hypothèse où les applications ne sont pas déclarées dans ce fichier).</p><p>Si vous migrez de Tomcat 5.5 ou inférieur à Tomcat 6.0, il ne faut pas réutiliser les anciens fichiers server.xml mais en réécrire de nouveau, à partir du modèle standard livré avec Tomcat.</p><p>L&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/servlets/InvokerServlet.html">InvokerServlet</a> doit rester désactivée. D&#8217;ailleurs, elle sera retirée de Tomcat 7. La [Default Servlet|http://tomcat.apache.org/tomcat-6.0-doc/default-servlet.html] doit conserver le paramètre <code>readonly</code> à <code>true</code> (désactivation des requêtes <code>PUT</code> et <code>DELETE</code> sur les contenus statiques) et le paramètre <code>listings</code> à <code>false</code> (désactivation de la liste des fichiers d&#8217;un répertoire).</p><p>La possibilité d&#8217;utiliser des request dispatchers inter web applications (attribut <code>crossContext</code> ) devrait rester désactivée comme l&#8217;autorisation d&#8217;accéder à des composants internes Tomcat depuis les web applications (attribut <code>privileged</code>) et la possibilité d&#8217;utiliser des liens symboliques dans les web applications ( attribut <code>allowLinking</code>). L&#8217;activation de cette dernière option exposerait le serveur à des risques de type <a
href="http://en.wikipedia.org/wiki/Directory_traversal">directory traversal</a>.</p><h3>Pour aller plus loin</h3><p>* <a
href="http://www.springsource.com/webinars/download/tomcat_tips_tricks_pros">Apache Tomcat Tips and Tricks from the Pros</a> (webinar),<br
/> * <a
href="http://www.springsource.com/webinars/download/performance_tuning_tomcat">Performance Tuning Apache Tomcat for Production</a> (webinar),<br
/> * <a
href="http://europe.springone.com/europe-2009/file?path=/springone-amsterdam-2009/slides/MarkThomas_PerformanceTuningForApacheTomcat.pdf">Performance Tuning for Apache Tomcat</a> (slides de SpringOne 2009),<br
/> * The Center for Internet Security : <a
href="http://cisecurity.org/en-us/?route=downloads.show.single.tomcat.100">CIS Apache Tomcat Server Benchmark v.1.0.0</a>. 55 pages très instructives sur la sécurisation de Tomcat. Si vous avez aimé, regardez aussi <a
href="http://cisecurity.org/en-us/?route=downloads.form.apache.220">CIS Apache Web Server 1.3.37/2.0.59/2.2.4 Benchmark v2.2.0</a>.</p><p>11/05/2009 : prise en compte de la remarque d&#8217;Arnaud : <i>&laquo;&nbsp;n&#8217;importe qui peut arrêter le serveur Tomcat avec un simple telnet&nbsp;&raquo;</i> -> <i>&laquo;&nbsp;n&#8217;importe quel utilisateur connecté sur la machine peut arrêter le serveur Tomcat avec un simple telnet ; les mécanismes de permissions liés au propriétaire du processus sont ignorés&nbsp;&raquo;</i>.<br
/> 27/01/2010 : ajout des références à &laquo;&nbsp;CIS Apache Tomcat Server Benchmark v.1.0.0&#8243; et &laquo;&nbsp;CIS Apache Web Server 1.3.37/2.0.59/2.2.4 Benchmark v2.2.0&#8243;</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/07/springone-2009-securisation-dapache-tomcat/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</title><link>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/</link> <comments>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/#comments</comments> <pubDate>Tue, 05 May 2009 17:49:12 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[header]]></category> <category><![CDATA[Load Balancer]]></category> <category><![CDATA[Reverse Proxy]]></category> <category><![CDATA[Tomcat]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1914</guid> <description><![CDATA[Note du 24/01/2010 : La RemoteIpValve et le XForwardedFilter ont été intégrés au projet Tomcat. La RemoteIpValve est disponible depuis Tomcat 6.0.24, le XForwardedFilter a été renommé RemoteIpFilter et sera disponible dans Tomcat 7. Une conférence est l&#8217;occasion de discuter avec les ingénieurs des difficultés que nous rencontrons à utiliser leurs produits. J&#8217;ai profité de [...]]]></description> <content:encoded><![CDATA[<table
border="1"><tr><td>Note du 24/01/2010 : La RemoteIpValve et le XForwardedFilter ont été intégrés au projet Tomcat. La <a
href="http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RemoteIpValve.java?annotate=833535&#038;pathrev=833536">RemoteIpValve est disponible depuis Tomcat 6.0.24</a>, le <a
href="http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java?annotate=833155">XForwardedFilter a été renommé RemoteIpFilter et sera disponible dans Tomcat 7</a>.</td></tr></table><p>Une conférence est l&#8217;occasion de discuter avec les ingénieurs des difficultés que nous rencontrons à utiliser leurs produits. J&#8217;ai profité de ma participation à SpringOne 2009 pour échanger avec Mark Thomas sur le suivi de l&#8217;adresse IP des internautes dans les logs d&#8217;audit d&#8217;applications web. Mark Thomas est des principaux committer du projet Tomcat et de SpringSource tc Server.</p><p>Le problème se présente lorsqu&#8217;un serveur Tomcat est précédé d&#8217;un reverse proxy (e.g. <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" title="mod_proxy" >mod_proxy</a>, <a
href="http://www.squid-cache.org/" title="Squid Cache" >Squid Cache</a>, etc) ou d&#8217;un load balancer (<a
href="http://www.1st-computer-networks.co.uk/alteon-application-switch.php" title="Nortel Alteon" >Nortel Alteon</a>, <a
href="http://www.f5.com/products/big-ip/" title="F5 Big-IP" >F5 Big-IP</a>, etc) : La méthode <code><a
href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getRemoteAddr()" title="HttpServletRequest.getRemoteAddr()" >HttpServletRequest.getRemoteAddr()</a></code> ne retourne plus l&#8217;adresse IP de l&#8217;internaute mais celle du composant réseau qui précède le serveur Tomcat.</p><p>Cette perte d&#8217;information a été compensée par les reverse-proxy en ajoutant un header http <a
href="http://en.wikipedia.org/wiki/X-Forwarded-For" title="XForwardedFor" >X-Forwarded-For</a> à toutes les requêtes qu&#8217;ils font transiter. Bien que ce header ne soit pas standard (son nom commence d&#8217;ailleurs par &laquo;&nbsp;X-&nbsp;&raquo;), il est devenu un standard de facto utilisé par la très grande majorité des reverse proxy et load balancers (paramètre <code>xforward=enable</code> pour les Alteon d&#8217;après <a
href="http://www116.nortel.com/docs/bvdoc/alteon/appl_switch/asos_23.0.2_asem_4.0.2/320506-A_00.pdf">Command Reference</a> ; propriété <code>Insert XForwarded For</code> de la <a
href="http://devcentral.f5.com/weblogs/images/devcentral_f5_com/weblogs/macvittie/125/o_enablexforward.JPG">GUI du profile http</a> ou règle <code>when HTTP_REQUEST { HTTP::header insert "X-Forwarded-For" [IP::client_addr] }</code> pour les Big-IP d&#8217;après <a
href="http://devcentral.f5.com/weblogs/macvittie/archive/2008/06/02/3323.aspx">F5 Dev Central : Using &laquo;&nbsp;X-Forwarded-For&nbsp;&raquo; in Apache or PHP</a> ).</p><p>Cependant, les implémentations de l&#8217;API Servlet ne sont pas tenues de prendre en compte ce paramètre dans la méthode <code>request.getRemoteAddr()</code> dont la javadoc stipule bien <em>Returns the Internet Protocol (IP) address of the client or last proxy that sent the request.</em> . Tomcat est d&#8217;ailleurs autant concerné que ses concurrents Websphere ou Weblogic, pour ne citer qu&#8217;eux.</p><p>Toutes les couches sont impactées : l&#8217;<a
href="http://tomcat.apache.org/tomcat-6.0-doc/api/index.html?org/apache/catalina/valves/AccessLogValve.html" title="Access Log" >Access Log</a> Tomcat dont les patterns <code>common</code> et <code>combined</code> utilisent le remote host name (%h) et les frameworks de sécurité et d&#8217;audit comme Spring Security (cf <code><a
href="http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/ui/WebAuthenticationDetails.html#getRemoteAddress()" title="WebAuthenticationDetails.getRemoteAddress()" >WebAuthenticationDetails.getRemoteAddress()</a></code>) ou <a
href="http://www.ja-sig.org/wiki/display/CASUM/Auditing+and+Statistics+Via+Inspektr" title="CAS Inskektr" >CAS Inskektr</a> <code><a
href="http://code.google.com/p/inspektr/source/browse/tags/inspektr-0-7-0/inspektr-core/src/main/java/org/inspektr/common/web/ClientInfo.java" title="ClientInfo" >ClientInfo</a></code>).</p><h3><a
name="AccessLogTomcatetApacheHttpdmo"></a>Access Log Tomcat et Apache Httpd : modification du pattern de log</h3><table
border="1"><tr><td> Depuis l&#8217;intégration de la RemoteIpValve dans Tomcat 6.0.24, il est plus élégant d&#8217;utiliser cette <code>RemoteIpValve</code> (voir infra) que d&#8217;utiliser le <code>%{X-Forwarded-For}i</code> dans le pattern de l&#8217;<code>AccessLogValve</code>.</td></tr></table><p>Pour corriger l&#8217;access log Tomcat, il est possible de configurer l&#8217;utilisation du header X-Forwarded-For plutôt que de l&#8217;ip distante dans le pattern de log (pratique relativement bien documenté).</p><div
align="center"><strong>AccessLogValve utilisant le header X Forwarded For</strong></div><pre class="brush: xml; title: ; notranslate">
...
&lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
       suffix=&quot;.txt&quot; pattern=&quot;%{X-Forwarded-For}i %l %u %t %r %s %b&quot; resolveHosts=&quot;false&quot; /&gt;
...
</pre><p>Si les serveurs Apache Httpd sont précédés d&#8217;un load balancer, la modification est très similaire, <a
href="http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats" title="modlogconfig" >mod_log_config</a> permet de définir les informations affichées dans l&#8217;accès log. On modifie la pattern de log pour utiliser le header http <code>X-Forwarded-For</code> ( <code>%{X-Forwarded-For}i</code> ) plutôt que le remote host ( <code>%h</code>) :</p><div
align="center"><strong>Access Log Apache utilisant le header X Forwarded For</strong></div><pre class="brush: xml; title: ; notranslate">
LogFormat &quot;%{X-Forwarded-For}i %l %u %t &quot;%r&quot; %&gt;s %b&quot; common
CustomLog logs/access_log common
</pre><p>La prise en compte du header <code>X-Forwarded-For</code> dans Apache Httpd sera bientôt simplifiée avec la récente introduction dans le trunk du module <a
href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/manual/mod/mod_remoteip.xml" title="modremoteip" >mod_remoteip</a> qui permettra de prendre en compte ce header avec une simple configuration <code>RemoteIPHeader X-Forwarded-For</code> ; il ne sera plus nécessaire de manipuler le pattern des logs.</p><h3><a
name="FrameworksJavaextensiondesappl"></a>Frameworks Java : extension des applications ou du moteur de servlet</h3><p>S&#8217;il est simple de prendre en compte le paramètre <code>X-Forwarded-For</code> dans les access log Tomcat et Apache Httpd, il est sensiblement plus complexe de l&#8217;intégrer dans les frameworks de sécurité et d&#8217;audit. Ces briques sont souvent des librairies tierces et modifier leur code est fastidieux voire impossible si elles sont &#8216;close source&#8217;. Il est donc nécessaire de se placer en amont de ces frameworks pour modifier le comportement de la méthode <code>ServletRequest.getRemoteAddr()</code>.</p><h4><a
name="ServletAPIXForwardedForAsRemot"></a>Servlet API : XForwardedForFilter</h4><p>La première solution est de développer un Servlet Filter que l&#8217;on déploie dans chaque web application.</p><ul><li>Avantage : Simple à implémenter grâce aux interfaces Filter, HttpServletRequest et à l&#8217;HttpServletRequestWrapper qui est destiné à faciliter ce type de développement, ce Filter est utilisable aussi bien avec Tomcat qu&#8217;avec Glassfish, JBoss, Jetty, WebSphere, Weblogic ou tout autre moteur de servlet.</li><li>Inconvénient : lourd à déployer sur toutes les web applications.</li><li>Exemple d&#8217;implémentation: <a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter">XForwardedFilter</a> (<a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedFilter.java</a>) gère les headers <code>X-Forwarded-For</code> et <code>X-Forwarded-Proto</code></li></ul><p>Pour installer cette solution :</p><ol><li>Télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-servlet-extras-1.0.2.jar" title="xebia-servlet-extras-1.0.2.jar" >xebia-servlet-extras-1.0.2.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/web/xebia-servlet-extras/tags/xebia-servlet-extras-1.0.2/src/main/java/fr/xebia/servlet/filter/XForwardedFilter.java" title="XForwardedFilter.java" >XForwardedForFilter.java</a> et déployer le jar sous WEB_APP_HOME/WEB-INF/lib ou ajouter la dépendance maven <code>fr.xebia.web.extras:xebia-servlet-extras:1.0.2</code> à votre pom.xml (<a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter">doc</a>).</li><li>Déclarer dans <code>web.xml</code> le <code>filter XForwardedFilter</code> :</li></ol><div
align="center"><strong>Declaration du XForwardedFilter</strong></div><pre class="brush: xml; title: ; notranslate">
...
   &lt;filter&gt;
      &lt;filter-name&gt;XForwardedForFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;fr.xebia.servlet.filter.XForwardedFilter&lt;/filter-class&gt;
   &lt;/filter&gt;
   &lt;filter-mapping&gt;
      &lt;filter-name&gt;XForwardedFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
      &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
   &lt;/filter-mapping&gt;
   ...
</pre><ol><li>Tester le résultat avec <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jsp" title="x-forwarded-for_as_remote-addr.jsp" >x-forwarded-for_as_remote-addr.jsp</a>, le résultat devrait ressembler à <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jpeg" title="x-forwarded-for_as_remote-addr.jpeg" >x-forwarded-for_as_remote-addr.jpeg</a>.</li></ol><h4><a
name="ExtensionTomcatXForwardedForAs"></a>Extension Tomcat : RemoteIpValve</h4><p>La deuxième solution est d&#8217;ajouter une extension au serveur Tomcat pour en modifier le comportement ; il ne s&#8217;agit plus alors de Servlet Filter et d&#8217;HttpServletRequest mais de Valve et de Request :</p><ul><li>Avantage : solution centralisée gérée par l&#8217;administrateur Tomcat sans intrusion dans les web applications. Cette solution permet de traiter dans le même temps l&#8217;AccessLogValve.</li><li>Inconvénient : intégré à Tomcat seulement depuis la version 6.0.24 ; pour les version antérieures, il faut déployer un jar additionnel.</li><li>Exemple d&#8217;implémentation : <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValve.java" >RemoteIpValve.java</a> gère les headers <code>X-Forwarded-For</code> et <code>X-Forwarded-Proto</code></li><li>RemoteIpValve.java a été intégré au projet Tomcat <a
href="https://issues.apache.org/bugzilla/show_bug.cgi?id=47330"> Bug 47330 &#8211;  proposal : port of mod_remoteip in Tomcat as RemoteIpValve</a> et est documentée sur <a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve">GoogleCode : RemoteIpValve</a></li></ul><p>Pour installer cette RemoteIpValve :</p><ol><li>Pour les versions de Tomcat antérieures à la 6.0.24, télécharger <a
href="http://xebia-france.googlecode.com/files/xebia-tomcat-extras-1.0.0.jar" >xebia-tomcat-extras-1.0.0.jar</a>, compiler <a
href="http://xebia-france.googlecode.com/svn/tomcat/xebia-tomcat-extras/tags/xebia-tomcat-extras-1.0.0/src/main/java/org/apache/catalina/connector/RemoteIpValve.java" title="RemoteIpValve.java" >RemoteIpValve.java</a> et déployer le jar sous TOMCAT_HOME/lib.</li><li>Déclarer la <code>RemoteIpValve</code> dans <code>server.xml</code> :</li></ol><div
align="center"><strong>Declaration de la RemoteIpValve</strong></div><pre class="brush: xml; title: ; notranslate">
...
   &lt;Valve className=&quot;org.apache.catalina.connector.RemoteIpValve&quot; /&gt;
   &lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot; directory=&quot;logs&quot; prefix=&quot;localhost_access_log.&quot;
      suffix=&quot;.txt&quot; pattern=&quot;common&quot; resolveHosts=&quot;false&quot; /&gt;
   ...
</pre><ol><li>Tester le résultat avec <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jsp" title="x-forwarded-for_as_remote-addr.jsp" >x-forwarded-for_as_remote-addr.jsp</a>, le résultat devrait ressembler à <a
href="http://blog.xebia.fr/wp-content/uploads/2009/05//x-forwarded-for_as_remote-addr.jpeg" title="x-forwarded-for_as_remote-addr.jpeg" >x-forwarded-for_as_remote-addr.jpeg</a>.</li></ol><p>Mark Thomas reconnaît l&#8217;intérêt de faciliter le développement d&#8217;extensions pour Tomcat et la tâche devrait grandement se simplifier avec le projet <a
href="http://socghop.appspot.com/student_project/show/google/gsoc2009/asf/t124021713512" title="Convert current Tomcat valves to Servlet Filters for The Apache Software Foundation" >Convert current Tomcat valves to Servlet Filters for The Apache Software Foundation</a> du <a
href="http://socghop.appspot.com/program/home/google/gsoc2009" title="Google Summer of Code 2009" >Google Summer of Code 2009</a>. Cette évolution ouvre la perspective de développer des filtres d&#8217;infrastructure similaires aux modules écrits en C pour Httpd mais avec la souplesse du langage Java.</p><h4><a
name="Pourallerplusloin"></a>Pour aller plus loin</h4><ul><li>Apache Httpd mod_proxy : <a
href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers" title="Reverse Proxy Request Headers" >Reverse Proxy Request Headers</a></li><li>Squid Cache : <a
href="http://www.squid-cache.org/Doc/config/forwarded_for/" title="forwardedfor configuration parameter" >forwarded_for configuration parameter</a></li><li>Xebia-france Google Code : <a
href="http://code.google.com/p/xebia-france/wiki/RemoteIpValve">RemoteIpValve</a></li></ul><p>2009/05/17 : Ajout des paramètres de configuration des Alteon et BIG-IP pour activer l&#8217;insertion du header <code>x-forwarded-for</code><br
/> 2009/07/12 : Mise à jour du paragraphe sur la Valve tomcat pour utiliser la RemoteIpValve<br
/> 2009/07/17 : Mise à jour du paragraphe sur le servlet filter  XForwardedFilter<br
/> 2009/10/13 : Montée de version de xebia-servlet-extras en version 1.0.1 pour corriger le bug soulevé par Alexandre Victoor<br
/> 2009/11/08 : Ajout de la remarque préliminaire : la valve et le filtre ont été intégrés dans le projet Tomcat.<br
/> 2010/01/24 : Mise à jour de l&#8217;article pour prendre en compte la disponibilité de la RemoteIpValve dans la distribution standard Tomcat depuis la version 6.0.24.<br
/> 2010/01/31 : Montée de version de xebia-servlet-extras en version 1.0.2 pour corriger <a
href="http://code.google.com/p/xebia-france/issues/detail?id=4">Issue 4 &#8211; XForwardedFilter : request.secure and request.scheme are not forced to &laquo;&nbsp;false&nbsp;&raquo; and &laquo;&nbsp;http&nbsp;&raquo; if X-Forwarded-Proto=http</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/feed/</wfw:commentRss> <slash:comments>41</slash:comments> </item> <item><title>Nouvelle politique de maintenance de Spring : La très périlleuse route de la monétisation de l&#8217;open source</title><link>http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/</link> <comments>http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/#comments</comments> <pubDate>Mon, 22 Sep 2008 16:05:40 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=716</guid> <description><![CDATA[Spring Source a publié l&#8217;information sous la forme d&#8217;une modification sibylline de la note d&#8217;Enterprise Maintenance Policy : Seuls les clients commerciaux bénéficieront des patchs publiés après les trois mois qui suivent le lancement d&#8217;une version majeure des projets majeurs Spring (framework, security, web flow, etc). L&#8217;objectif annoncé de Spring Source est de réduire les [...]]]></description> <content:encoded><![CDATA[<p>Spring Source a publié l&#8217;information sous la forme d&#8217;une modification sibylline de la note d&#8217;<a
href="http://www.springsource.com/node/558" title="Enterprise Maintenance Policy" >Enterprise Maintenance Policy</a> : Seuls les clients commerciaux bénéficieront des patchs publiés après les trois mois qui suivent le lancement d&#8217;une version majeure des projets majeurs Spring <em>(framework, security, web flow, etc)</em>. L&#8217;objectif annoncé de Spring Source est de réduire les coûts de maintenance des anciennes versions de ses projets en incitant les utilisateurs à migrer vers les versions récentes.<br
/> Concrètement, les utilisateurs non commerciaux du framework seraient limités aux versions 2.0.1 <em>(contre 2.0.8 pour les clients commerciaux)</em> et 2.5.3 (contre 2.5.5) [1]. Une telle limitation serait bloquante pour la plupart des projets.<br
/> Au delà de l&#8217;objectif annoncé, on peut y voir la tentative de créer un modèle de monétisation de l&#8217;open source : <em>&laquo;&nbsp;payer pour les mises à jour&nbsp;&raquo;</em>.<br
/> Ce qui est sûr, c&#8217;est que cette annonce, au delà des sempiternels débats stériles que nous offre internet <em>(Cf. : <a
href="http://www.theserverside.com/news/thread.tss?thread_id=50727" title="TSS" >TSS</a>)</em>, laisse quelques questions en suspens.</p><ul><li><a
href="http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/#Versunduallicensing">Vers un dual licensing ?</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/#UnecommunautOpenSourceSpringdm">Une communauté Open Source Spring démotivée ?</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/#Uneconfiancebranle">Une confiance ébranlée ?</a></li><li><a
href="http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/#Affairesuivre">Affaire à suivre &#8230;</a></li></ul><h4><a
name="Versunduallicensing"></a>Vers un dual licensing ?</h4><p>Légalement, l&#8217;<a
href="http://www.apache.org/licenses/LICENSE-2.0" title="Apache License, Version 2.0" >Apache License, Version 2.0</a> utilisée pour le code de Spring Framework précise la gratuité de l&#8217;utilisation et de la redistribution du code. Spring Source va-t-il introduire un nouveau type de licence pour les patchs <em>&laquo;&nbsp;post trois mois&nbsp;&raquo;</em> et mettre en place un <a
href="http://en.wikipedia.org/wiki/Dual_license" title="dual licensing" >dual licensing</a> qui nous rappellera la licence MySQL ?<br
/> Dans le cas contraire, si les patchs restent disponibles sous licence Apache sur le gestionnaire public de code de Spring Source, la prolifération de versions non maîtrisées risque d&#8217;être fatale au framework.<br
/> Un autre scénario serait que Spring publie les sources des patchs et <em>tag</em> les versions sur le gestionnaire de code public de Spring Source. Il suffirait alors que quelqu&#8217;un publie les jars compilés sur le <code>repository repo1.maven.org</code>. La prolifération de versions serait alors empêchée. Ce scénario est peu probable car l&#8217;action de Spring deviendrait alors caduque, le serveur de téléchargement de Spring serait juste remplacé par celui de maven.</p><h4><a
name="UnecommunautOpenSourceSpringdm"></a>Une communauté Open Source Spring démotivée ?</h4><p>Cette mesure démotivera sûrement les contributeurs indépendants qui ne verraient pas leur travail reversé à la communauté. Cependant, l&#8217;effet devrait être négligeable car les contributeurs des projets Spring sont quasiment tous employés par Spring Source <em>(Cf. : &laquo;&nbsp;<a
href="http://www.mularien.com/blog/2008/09/19/how-open-source-is-spring-an-analytical-investigation/" title="How Open Source is Spring?: An Analytical Investigation" >How Open Source is Spring?: An Analytical Investigation</a>&nbsp;&raquo; par Patrick Mularien)</em>. Spring Framework n&#8217;est pas un projet Open Source à la gouvernance partagée comme nous les connaissons avec la fondation Apache mais un projet à la gouvernance exclusive de Spring Source à l&#8217;instar de Glassfish avec Sun ou JBoss avec Redhat/JBoss.</p><h4><a
name="Uneconfiancebranle"></a>Une confiance ébranlée ?</h4><p>L&#8217;image de Spring Source avait déjà été touchée par la polémique autour de l&#8217;utilisation d&#8217;une licence open source <em>&laquo;&nbsp;business unfriendly&nbsp;&raquo;</em> GPL v3 pour Spring Source Application Platform plutôt que de continuer à utiliser la <em>&laquo;&nbsp;business friendly&nbsp;&raquo;</em> Apache Software License <em>(Cf. : &laquo;&nbsp;<a
href="http://blog.xebia.fr/2008/05/01/springsource-application-platform-la-breche-dans-java-ee/" title="SpringSource Application Platform : la brèche dans Java EE">SpringSource Application Platform : la brèche dans Java EE</a>&laquo;&nbsp;)</em>.<br
/> Rod Johnson avait adouci sa méthode de communication en expliquant sa stratégie dans <em>&laquo;&nbsp;<a
href="http://blog.springsource.com/2008/05/27/open-source-open-strategy-the-springsource-manifesto/" title="Open Source, Open Strategy: The SpringSource Manifesto" >Open Source, Open Strategy: The SpringSource Manifesto</a>&laquo;&nbsp;</em>. On pouvait y lire en gras encadré <strong><em>&laquo;&nbsp;We are not changing and will not change the license of any existing project. The Spring Portfolio will remain under the Apache License. This covers the Spring Framework, Spring Security, Spring Web Flow and the rest of the Spring Portfolio&nbsp;&raquo;</em></strong>.<br
/> Aujourd&#8217;hui, la communication de Spring Source par mise à jour de <em>&laquo;&nbsp;note contractuelle&nbsp;&raquo;</em> est plus abrupte que jamais et l&#8217;impact sur les licences semble en contradiction avec le Spring Source Manifesto publié en mai dernier. La polémique est déjà très forte et l&#8217;impact sur la confiance dans la roadmap de Spring sera durable.</p><h4><a
name="Affairesuivre"></a>Affaire à suivre &#8230;</h4><p>La mise en oeuvre de l&#8217;annonce de Spring Source peut rendre le framework inutilisable pour les clients non commerciaux et tourner la page de la période Open Source de ce framework. Des alternatives à la roadmap plus rassurantes existent, notamment au sein de la fondation Apache, et cette aventure pourrait se révéler fatale à ce projet qui a modelé le monde Java actuel.<br
/> La communication abrupte et le manque d&#8217;explication sur la modalité de mise en oeuvre des licences laissent penser que Spring Source n&#8217;est pas à l&#8217;aise avec une annonce derrière laquelle on peut imaginer la pression d&#8217;investisseurs soucieux des revenus de l&#8217;entreprise.<br
/> La monétisation de l&#8217;Open Source est un sujet très difficile et les innovations de Spring Source en la matière très périlleux.<br
/> En attendant que la situation s&#8217;éclaircisse, cet épisode nous rappellera qu&#8217;il ne faut pas associer trop rapidement Open Source et pérennité. Les utilisateurs de Spring Framework se doivent de réfléchir à un avenir exclusivement commercial de leur framework.</p><p>[1] Voir Spring Framework <a
href="http://static.springframework.org/spring/docs/2.5.x/changelog.txt" title="changelog" >changelog</a></p><p>Liens connexes et autres avis :</p><ul><li><a
href="http://marxsoftware.blogspot.com/2008/09/thoughts-on-springsources-enterprise.html" title="Thoughts on SpringSource's Enterprise Maintenance Policy" >Thoughts on SpringSource&#8217;s Enterprise Maintenance Policy</a></li><li><a
href="http://denverdev.blogspot.com/2008/09/spring-framework-license-change.html" title="Spring Framework License Change" >Spring Framework License Change</a></li><li><a
href="http://impalablog.blogspot.com/2008/09/is-case-for-forking-spring-building.html" title="Is the case for forking Spring building? " >Is the case for forking Spring building? </a></li><li><a
href="http://blogs.sun.com/alexismp/entry/modèles_open_source_spring" title="Modèles open source Spring, JavaEE, ..." >Modèles open source Spring, JavaEE, &#8230;</a></li><li><a
href="http://pascal.albertyorban.be/permalink/java/spring-open-source-ou-comment-mettre-en-place-un-modele-economique-en-faisant-beaucoup-de-bruit" title="Spring ... Open Source ... ou comment mettre en place un modèle économique en faisant beaucoup de bruit" >Spring &#8230; Open Source &#8230; ou comment mettre en place un modèle économique en faisant beaucoup de bruit</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/09/22/nouvelle-politique-de-maintenance-de-spring-la-tres-perilleuse-route-de-la-monetisation-de-lopen-source/feed/</wfw:commentRss> <slash:comments>21</slash:comments> </item> <item><title>Annonce : ParisJUG reçoit le JCP Mercredi 21</title><link>http://blog.xebia.fr/2008/05/20/annonce-parisjug-recoit-le-jcp-mercredi-21/</link> <comments>http://blog.xebia.fr/2008/05/20/annonce-parisjug-recoit-le-jcp-mercredi-21/#comments</comments> <pubDate>Tue, 20 May 2008 09:48:11 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/05/20/annonce-parisjug-recoit-le-jcp-mercredi-21/</guid> <description><![CDATA[Paris JUG reçoit mercredi à 18h45 Patrick Curran, président du Java Community Process pour une table ronde autour de l&#8217;ouverture du JCP. Des membres français du JCP participeront au débat : Guillaume Laforge (spec lead de la JSR 241: The Groovy Programming Language), Cedric Thomas (CEO d&#8217;OW2 &#8211; ObjectWeb), Eric Samson (CTO de Data Service) [...]]]></description> <content:encoded><![CDATA[<p>Paris JUG reçoit mercredi à 18h45 <a
href="http://blogs.sun.com/pcurran/" title="Patrick Curran">Patrick Curran</a>, président du <a
href="http://jcp.org/" title="Java Community Process">Java Community Process</a> pour une table ronde autour de <strong>l&#8217;ouverture du JCP</strong>.</p><p>Des membres français du JCP participeront au débat : <a
href="http://www.parisjug.org/meetings/20080521/speakers.html#GuillaumeLaforge" title="Guillaume Laforge">Guillaume Laforge</a> (spec lead de la JSR 241: The Groovy Programming Language), <a
href="http://www.parisjug.org/meetings/20080521/speakers.html#CedricThomas" title="Cedric Thomas">Cedric Thomas</a> (CEO d&#8217;OW2 &#8211; ObjectWeb), <a
href="http://www.parisjug.org/meetings/20080521/speakers.html#EricSamson" title="Eric Samson">Eric Samson</a> (CTO de Data Service) et <a
href="http://www.parisjug.org/meetings/20080521/speakers.html#AntonioGoncalves" title="Antonio Goncalves">Antonio Goncalves</a> (membre des JSR Java EE 6, EJB 3.1 et JPA 2.0).</p><p>Deux ans après l&#8217;appel d&#8217;IBM et BEA à ouvrir la plateforme Java, à l&#8217;heure de la controverse OSGI versus Java Module System, du large succès de Flash face à JavaFX, des relations délicates entre Sun et la Fondation Apache et de l&#8217;émergence de SCA/SDO, c&#8217;est l&#8217;occasion de comprendre les enjeux que la plateforme Java rencontre aujourd&#8217;hui et peut être d&#8217;assister à l&#8217;inflexion de la gouvernance de Java.</p><p>Cette table ronde s&#8217;adresse aux experts Java autant qu&#8217;aux managers qui définissent des stratégies de Système d&#8217;Information.</p><p>Tous les détails de la soirée <a
href="http://www.parisjug.org/meetings/20080521/presentation.html" title="Paris JUG - Table ronde : l'ouverture du JCP">Paris JUG &#8211; Table ronde : l&#8217;ouverture du JCP</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/05/20/annonce-parisjug-recoit-le-jcp-mercredi-21/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>SpringSource Application Platform : la brèche dans Java EE</title><link>http://blog.xebia.fr/2008/05/01/springsource-application-platform-la-breche-dans-java-ee/</link> <comments>http://blog.xebia.fr/2008/05/01/springsource-application-platform-la-breche-dans-java-ee/#comments</comments> <pubDate>Thu, 01 May 2008 21:19:07 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/05/01/springsource-application-platform-la-breche-dans-java-ee/</guid> <description><![CDATA[L&#8217;annonce de SpringSource a des allures de schisme. Après des années à critiquer la complexité et le monolithisme de Java Enterprise Edition (Java EE), les équipes de Rod Johnson ont franchi le Rubicon et proposent un serveur d&#8217;applications Java qui ne reposera pas sur la monolithique spécification Java EE. SpringSource Application Platform se limite à [...]]]></description> <content:encoded><![CDATA[<p>L&#8217;<a
href="http://www.springsource.com/web/guest/products/suite/applicationplatform">annonce de SpringSource</a> a des allures de schisme. Après des années à critiquer la complexité et le monolithisme de Java Enterprise Edition (Java EE), les équipes de Rod Johnson ont franchi le Rubicon et proposent un serveur d&#8217;applications Java qui ne reposera pas sur la monolithique spécification Java EE.</p><p>SpringSource Application Platform se limite à quelques fragments de cette spécification (principalement Servlet et JPA) assemblés dans un conteneur OSGI augmenté de quelques particularités Spring. Les applications web ne seront plus assemblées sous forme de WAR avec un fichier web.xml mais sous forme de plusieurs bundles OSGI avec des fichiers de configuration Spring.</p><h3>Révolution ou évolution ?</h3><p>L’utilisation d’OSGI pour assembler des applications Java n’est pas une nouveauté.<br
/> On le retrouve déjà dans les internes des serveurs d&#8217;applications Java (Websphere, Weblogic et maintenant Glassfish). L’ESB Service Mix va même plus loin en nous annonçant que dans sa version 4, nous déploierons nos médiations et transformations sous forme de bundle OSGI : pour la première fois, les développeurs d’informatique de gestion allaient assembler leur code métier avec OSGI.</p><p>Cependant, OSGI restait utilisé dans des domaines pour lesquels les spécifications Java n’avaient pas ‘légiféré’. La grande rupture de SpringSource Application Platform est de proposer OSGI en alternative à un standard utilisé par tous. C’est en cela qu’on peut percevoir cette initiative comme schismatique.</p><h3>La fin des standards ?</h3><p>Le monde unipolaire dans lequel seul le Java Community Process gouverné par Sun décidait des standards de l’écosystème Java a vécu.<br
/> Nous assistons aujourd’hui à l’émergence d’un monde multi-polaire avec l’arrivée d’autres organismes de standardisation incontournables comme OSGI Alliance, Open SOA (SCA) et l’OASIS Group (SOAP, WS-*). On peut voir dans cette évolution l’influence d’IBM et BEA qui ont appelé en vain Sun à partager la gouvernance de Java.</p><p>Cependant, Spring Source a apporté des extensions propriétaires au standard OSGI (problèmes de load-time weaving JPA, etc). La fragmentation qu’apporte Spring Source peut donc causer un recul de la standardisation de l’écosystème Java.</p><h3>Une rupture irréversible avec Java EE ?</h3><p>Les directions prises par Spring Source et Java EE semblent conciliables. Il faudra pour cela que le Java Community Process accorde un rôle de premier ordre à OSGI dans la spécification Java Module System qui définit actuellement l’assemblage de composants de bas niveau. Si on a pu douter de cette reconnaissance, le récent support d’OSGI par Sun dans GlassFish laisse espérer un dénouement rapide.</p><p>On observe par ailleurs que Spring Source veille à ne pas couper les ponts avec le Java Community Process : Rod Johnson participe à plusieurs comités de spécifications Java EE 6 et Spring Source annonce que sa plateforme sera très vraisemblablement conforme à la spécification Java EE 6 Web Profile. On peut voir dans la démarche de Rod Johnson le souhait d’influencer les futures standards Java EE.</p><h3>Un nouveau modèle économique pour Spring Source</h3><p>Le lancement d’un serveur d’application est pour SpringSource un changement sensible de modèle économique.<br
/> L’ancien éditeur proposait une offre difficile à monétiser : un framework à licence open source business-friendly (Apache).<br
/> Aujourd’hui, Spring Source s’engage sur un modèle connu pour être monétisable : un middleware à licence duale (open source business-unfriendly GPL et commerciale) avec du support et des outils d’administration réservés aux clients commerciaux.</p><p>On s’amusera à remarquer que ce modèle ressemble à s’y méprendre au modèle de Marc Fleury et JBoss avec qui SpringSource a des relations tendues.</p><h3>Adopter SpringSource Application Platform immédiatemment ?</h3><p>Le pari de SpringSource est ambitieux,  la plateforme est en version beta, et les équipes de supports sont sans doute encore limitées, il faudra de plus former les équipes de développement.<br
/> Si l’utilisation en production n’est pas pour demain, <a
href="http://www.springsource.com/beta/s2ap/membershipform.php">une phase d’évaluation</a> a tout son sens.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/05/01/springsource-application-platform-la-breche-dans-java-ee/feed/</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>Spring Integration &#8211; L&#8217;avènement des &#8216;lightweight ESB&#8217; ?</title><link>http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/</link> <comments>http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/#comments</comments> <pubDate>Mon, 17 Dec 2007 16:50:10 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[SOA]]></category> <category><![CDATA[ESB]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/</guid> <description><![CDATA[Une nouvelle approche des ESB SpringSource vient d&#8217;annoncer le lancement de Spring Integration, une implémentation légère des Enterprise Integration Patterns. Le lendemain, le projet Apache ActiveMQ annonçait la sortie de sa version 5 qui ajoute le support de ces mêmes Enterprise Integration Patterns grâce à l&#8217;intégration d&#8217;Apache Camel, un framework léger de routage et de [...]]]></description> <content:encoded><![CDATA[<h4>Une nouvelle approche des ESB</h4><p>SpringSource vient d&#8217;annoncer le <a
href="http://blog.interface21.com/main/2007/12/14/spring-integration-a-new-addition-to-the-spring-portfolio/">lancement de Spring Integration</a>, une implémentation légère des <a
href="http://activemq.apache.org/camel/enterprise-integration-patterns.html">Enterprise Integration Patterns</a>. Le lendemain, le projet Apache ActiveMQ <a
href="http://activemq.apache.org/2007/12/15/apache-activemq-500-released.html">annonçait la sortie de sa version 5</a> qui ajoute le support de ces mêmes Enterprise Integration Patterns grâce à l&#8217;intégration d&#8217;<a
href="http://activemq.apache.org/camel/">Apache Camel</a>, un framework léger de routage et de médiations utilisable soit par <a
href="http://activemq.apache.org/camel/spring.html">configuration XML Spring</a>, soit par un <a
href="http://activemq.apache.org/camel/dsl.html">Domain Specific Language (DSL) Java</a>. Ces deux approches open source se caractérisent dans le monde des ESB par :</p><ul><li>Une grande légèreté : on ne parle plus de conteneur, d&#8217;APIs sophistiquées de connecteurs, de registre de services, de structures de données complexes mais de simples messages composés d&#8217;un body souvent sous forme de <a
href="http://en.wikipedia.org/wiki/Plain_Old_XML">Plain Old XML (POX)</a> et de headers en mode clef/valeur.</li><li>L&#8217;éloignement des standards chers aux grand éditeurs (<a
href="http://en.wikipedia.org/wiki/Java_Business_Integration">Java Business Integration &#8211; JBI</a> et <a
href="http://en.wikipedia.org/wiki/Service_component_architecture">Service Component Architecture &#8211; SCA</a>) pour se cantonner à des <a
href="http://en.wikipedia.org/wiki/POJO">Plain Old Java Objects (POJO)</a>. On notera tout de même que ces nouveaux frameworks de routage utilisent massivement les API Java EE pour les connecteurs et les transactions (JDBC, JMS, JCA, JTA, etc).</li></ul><h4>Exemples de configuration de routes avec Apache Camel</h4><p><strong>Camel Route Configuration With Java DSL</strong></p><pre class="brush: java; title: ; notranslate">
from(&quot;file:src/data&quot;)
   .choice()
      .when(xpath(&quot;/person/city = 'London'&quot;))
         .to(&quot;file:target/messages/uk&quot;)
      .otherwise()
         .to(&quot;file:target/messages/others&quot;);
</pre><p><strong>Camel Route Configuration With Spring 2.0 XML Conf</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;beans ...&gt;
   &lt;camel:camelContext id=&quot;camel&quot;&gt;
      &lt;camel:route&gt;
         &lt;camel:from uri=&quot;file:src/data&quot; /&gt;
         &lt;camel:choice&gt;
            &lt;camel:when&gt;
               &lt;camel:xpath&gt;/person/city = 'London'&lt;/camel:xpath&gt;
               &lt;camel:to uri=&quot;file:target/messages/uk&quot; /&gt;
            &lt;/camel:when&gt;
            &lt;camel:otherwise&gt;
               &lt;camel:to uri=&quot;file:target/messages/others&quot; /&gt;
            &lt;/camel:otherwise&gt;
         &lt;/camel:choice&gt;
      &lt;/camel:route&gt;
   &lt;/camel:camelContext&gt;
&lt;/beans&gt;
</pre><h4>Une rupture radicale avec les précédents ESB ?</h4><p>Plus qu&#8217;une rupture, cet allègement s&#8217;inscrit dans une tendance :</p><ul><li>La vague POJO/POX a déjà déferlé sur l&#8217;informatique de gestion en Java (SpringFramework, etc) et on pouvait l&#8217;attendre sur les technologies d&#8217;intégration d&#8217;applications.</li><li>JBI 1.0 a rencontré un succès très limité et les travaux actuels sur la version 2.0 suscitent des doutes (cf <a
href="http://www.infoq.com/news/2007/05/jbi2">InfoQ : JBI 2.0 at JavaOne</a>) :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<a
href="http://servicemix.apache.org/home.html">Apache ServiceMix</a> se détache progressivement de son objectif initial de conteneur JBI pour devenir en version 4 un &laquo;&nbsp;lightweight SOA/ESB container based on OSGI&nbsp;&raquo;.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<a
href="http://mule.mulesource.org/display/MULE/Home">Mule ESB</a> ne s&#8217;intéresse toujours pas à JBI (cf <a
href="http://mule.mulesource.org/display/MULE/JBI">Mule and JBI</a>).</li><li>La banalisation des connecteurs (JCA, JMS, SOAP, etc) et des conteneurs <a
href="http://en.wikipedia.org/wiki/OSGi">OSGI</a> [1] (conteneur d&#8217;assemblage et d&#8217;exécution de composants) a permis de démocratiser le développement des ESB en laissant ces projets se concentrer sur les fonctionnalités de bus.</li><li>L&#8217;essor des Domain Specific Languages et la simplicité d&#8217;utilisation des configurations XML Spring 2 offrent des alternatives et un retour de balancier face à l&#8217;approche du &laquo;&nbsp;tout graphique&nbsp;&raquo; incarnée par <a
href="http://en.wikipedia.org/wiki/BPEL">BPEL</a>.</li></ul><h4>Perspectives pour 2008</h4><p>On peut attendre en 2008 des mouvements autour des <em>lightweight integration frameworks</em> et des standards :</p><ul><li>Les <em>Lightweight Enterprise Integration Patterns Frameworks</em> vont progresser rapidement et garder leurs distances avec les standards JBI et SCA. Le premier enjeu sera de proposer un middleware d&#8217;exécution pour ces frameworks (middleware de message, application server, etc).</li><li>Mule ESB, l&#8217;ESB Open Source &#8216;historique&#8217; devra rattraper son retard en offrant des fonctionnalités spécifiques aux Enterprise Integration Patterns.</li><li>Les grands éditeurs vont continuer leurs investissements sur leurs standards : IBM et BEA sur SCA, Sun sur JBI.</li><li>JBI 2.0 devra trancher deux questions très délicates :<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<a
href="http://jcp.org/en/jsr/detail?id=277">Java Module System</a> &amp; <a
href="http://jcp.org/en/jsr/detail?id=294">Superpackage</a> versus OSGI : Si les premiers sont le standard choisi par Sun, le deuxième, OSGI, fait l&#8217;unanimité dans la communauté des middlewares (commerciaux et open source) qui a déjà décidé de l&#8217;utiliser.<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;SCA : risquer la marginalisation en ignorant ce standard qui rassemble tous les grands de l&#8217;Enterprise Java [2] ou le rejoindre quitte à se faire absorber.</li></ul><h4>Ressources</h4><ul><li><a
href="http://activemq.apache.org/camel/">Apache Camel Project</a></li><li><a
href="http://blog.interface21.com/main/2007/12/14/spring-integration-a-new-addition-to-the-spring-portfolio/">Spring Integration announcement</a></li><li><a
href="http://www4.java.no/presentations/javazone/2007/slides/5521.pdf">Mule 2 and Beyond</a> by Ross Mason, CTO and Co-founder, MuleSource Inc.</li><li><a
href="http://mule.mulesource.org/display/MULE/JBI">Mule and JBI</a> in Mule ESB wiki.</li><li><a
href="http://cwiki.apache.org/confluence/download/attachments/70895/Apache+ServiceMix+4.0.ppt?version=1">ServiceMix V4 presentation</a> by Guillaume Nodet, Apache ServiceMix PMC Chair and IONA Principal Engineer.</li><li><a
href="http://activemq.apache.org/should-i-deploy-enterprise-integration-patterns-in-the-broker-or-another-application.html">Should I deploy Enterprise Integration Patterns in the broker or another application</a> in ActiveMQ wiki.</li><li><a
href="http://www.eweek.com/article2/0,1895,2126646,00.asp">Can JBI 2 succeed where JBI 1 did not ?</a> by Darryl K. Taft</li></ul><p>[1] OSGI est déjà utilisé par Websphere ESB, intégrable dans Spring avec <a
href="http://www.springframework.org/osgi/">Spring Dynamic Modules for OSGi(tm) Service Platforms</a>, prévu dans ServiceMix 4, planifié pour Mule ESB après la v2.<br
/> [2] IBM, BEA, Oracle, SAP, etc</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> </channel> </rss>
