Apache Camel & Entreprise Integration Patterns Raphaël Delaporte BreizhJUG 07.11.2011 1
Speaker CTO Zenika Ouest Consultant et formateur Responsable comité technique Architecture d'entreprise Domaine ESB / BPEL / SOA / Messaging / WebServices Membre comité technique OASIS AMQP Spécifications Votes 2
Petite précision... Apache Camel Framework Java Implémentation des EIP A ne pas confondre avec CAML... # let rec couple l1 l2 = # let match rec (l1, couple l2) l1 with l2 = match ([],_)(l1, (_,[]) l2) with -> [] (a([],_) :: q, b (_,[]) :: p) -> (a, [] b) :: couple q p;; (a :: q, b :: p) -> (a, b) :: couple q p;; 3
Entreprise Integration Patterns Mêmes concepts que les design patterns en conception objet Solutions éprouvées à un problème commun EIP = patterns orientés intégration d'applications Routage de messages Transformation de messages Gestion des messages Type de endpoints / channels 4
Entreprise Integration Patterns 5
Apache Camel Puissant framework Java d'intégration Implémentation des EIP Routage et médiation Création de règles DSL (Domain Specific Language) Configuration XML 6
Apache Camel 10 bonnes raisons d'adopter un chameau Excellent framework d'intégration Open source et gratuit (Apache Software Foundation) Support de 50 EIP Support de plus de 80 types de Endpoint (connecteurs) Création de règles très intuitives Basé sur le framework Spring Léger et puissant Excellente documentation Cycle très court de release Support de 19 langages (pour expressions et prédicats) 7
The Spaghettis Incident? 8
Fonctionnement de Camel Camel permet de relier des endpoints via des routes Statiques Dynamiques Simples Complexes Camel permet de définir des endpoints Associés à des ressources Physiques ou logiques Les endpoints et les routes sont définis dans le CamelContext (moteur Camel) 9
Fonctionnement de Camel Exemple de route DSL from("direct:orig").to("direct:dest"); from("direct:orig").to("direct:dest"); Définition et création du endpoint «direct:orig» Permet de relier les endpoints logiques Camel «direct:orig» au endpoint «direct:dest» Représente une route à part entière 10
Fonctionnement de Camel Une route DSL plus complexe... from("activemq:orig") from("activemq:orig").multicast("http:d1","jms:d2").to("vm:d3").multicast("http:d1","jms:d2").to("direct:d2").to("vm:d3").loop(3).to("direct:d2").loadbalancer().loop(3).loadbalancer().roundrobin().to("bean:d1","irc:d2");.roundrobin().to("bean:d1","irc:d2"); 11
Fonctionnement de Camel Définir les routes en DSL Hériter de la classe org.apache.camel.builder.routebuilder Redéfinir la méthode abstraite configure() Un point d'entrée unique from() pour chaque route import org.apache.camel.builder.routebuilder; import org.apache.camel.builder.routebuilder; public class MaRoute extends RouteBuilder { public class MaRoute extends RouteBuilder { @Override public @Override void configure() throws Exception { public from("direct:origine") void configure() throws Exception {.to("direct:destination"); from("direct:origine") }.to("direct:destination"); } } } 12
Démo 13
Fonctionnement de Camel Création des routes L'appel de la méthode from() (qui doit être unique au sein d'une route) retourne un «processor type» Ce processor est l'action suivante qui doit être effectuée pour poursuivre l'exécution de la route Différents processors existent par défaut (to, filter, etc.) Il est possible de définir ses propres processors 14
Les composants de Camel Camel propose une offre extrêmement complète Plus d'une quarantaine de composants ActiveMQ, AMQP, Atom, CXF, CXFRS, File, Freemarker, FTP, Gmail, HDFS, HTTP, Imap, IRC, JBI, JDBC, JMS, LDAP, Mail, Nagios, Pop, Printer, RMI, Servlet, SFTP, SMTP, SNMP, SQL, TCP, UDP, XMPP, etc. La liste mise à jour régulièrement http://camel.apache.org/component.html 15
Démo 16
Quelques endpoints... Endpoints de type ressource / protocole JMS File HTTP Endpoints logiques direct seda vm timer bean log 17
EIP Routage Simple 1 message à la fois stateless 1 message en sortie n messages en sortie 1 message 0 ou 1 message Parallèle Séquentiel Content based Router Message Filter Recipient List Splitter n messages à la fois statefull Moins de messages en sortie Aggregator Autant de message en sortie Resequencer Composé Parallèle Réparti les messages Composed Message Processor Diffuse les messages Scatter-Gather Prédéterminé, linéaire Routing Slip Séquentiel Possibilités infinies Process Manager 18
EIP Content Based Router Content Based Router Comment traiter une situation où l'implémentation d'une seule fonctionnalité est éparpillée sur plusieurs systèmes physiques? Routage basé sur le contenu Examine le contenu du message (headers ou body) Existence de champs Valeur de champs 19
Camel Content Based Router Content Based Router en Camel Permet de faire des choix basés sur des prédicats (conditions à satisfaire pour valider le test) choice().when(predicate).to(...).otherwise().to(...).end() choice().when(predicate).to(...).otherwise().to(...).end() Exemple from("seda:cbr") from("seda:cbr").choice().choice().when(header("ordertype").isequalto("gadget")).when(header("ordertype").isequalto("gadget")).to("seda:gadgetinventory").to("seda:gadgetinventory").when(header("ordertype").isequalto("widget")).when(header("ordertype").isequalto("widget")).to("seda:widgetinventory").to("seda:widgetinventory").otherwise().otherwise().to("seda:autre").end();.to("seda:autre").end(); 20
Camel Les prédicats Ensemble de conditions à évaluer Résultat binaire vrai ou faux (méthode matches) Très puissant pour créer les critères de routages Support de nombreux langages XPath, XQuery, Python, Groovy, etc. XPath import org.apache.camel.predicate; import import org.apache.camel.builder.xml.namespaces; org.apache.camel.predicate; import org.apache.camel.builder.xml.namespaces; Namespaces ns = new Namespaces("ns", "http://org.breizhjug"); Predicate Namespaces price ns = = new ns.xpath("/ns:order/ns:price/text()='10'"); Namespaces("ns", "http://org.breizhjug"); Predicate price = ns.xpath("/ns:order/ns:price/text()='10'"); 21
Camel Les prédicats La classe PredicateBuilder offre les fonctions élémentaires and, or, not, islessthan, isnull, regex, etc. Construction de prédicats import static org.apache.camel.builder.predicatebuilder.and; import import static static org.apache.camel.builder.xml.xpathbuilder.xpath; org.apache.camel.builder.predicatebuilder.and; import static org.apache.camel.builder.xml.xpathbuilder.xpath; Predicate price = xpath("/order/price/text()='10'"); Predicate Predicate ordertype price = xpath("/order/price/text()='10'"); = header("ordertype").isequalto("widget"); Predicate Predicate body ordertype = body().contains("camel"); = header("ordertype").isequalto("widget"); Predicate Predicate priceordertype body = body().contains("camel"); = and(price,ordertype); Predicate Predicate all priceordertype = and(body,priceordertype); = and(price,ordertype); Predicate all = and(body,priceordertype); 22
Démo 23
EIP Dynamic Router Dynamic Router Commenter éviter les dépendances du routeur sur toutes les destinations possibles, tout en maintenant son efficacité et sa maintenabilité? 24
Camel Dynamic Router Critères de routage calculés dynamiquement via une Expression (basé sur l'implémentation EIP Recipient List) recipientlist(expression) recipientlist(expression) public void configure() throws Exception { public from("seda:dynamicrouter") void configure() throws Exception { from("seda:dynamicrouter").recipientlist(new BeanExpression("dynamicRouter", "route")); }.recipientlist(new BeanExpression("dynamicRouter", "route")); } public String route(@xpath("/order/id") String orderid) { public return String "seda:out" route(@xpath("/order/id") + orderid; String orderid) { } return "seda:out" + orderid; } 25
EIP Possibilités infinies... Simple 1 message à la fois stateless 1 message en sortie n messages en sortie 1 message 0 ou 1 message Parallèle Séquentiel Content based Router Message Filter Recipient List Splitter n messages à la fois statefull Moins de messages en sortie Aggregator Autant de message en sortie Resequencer Composé Parallèle Réparti les messages Composed Message Processor Diffuse les messages Scatter-Gather Prédéterminé, linéaire Routing Slip Séquentiel Possibilités infinies Process Manager 26
Démo 27
EIP encore et encore... Régulateur de débit Temporisateur Répartiteur de charge Diffusion vers n récepteurs Répétition (throttler) (delayer) (loadbalancer) (multicast) (loop) 28
EIP et encore... Transactionnal client 29
Démo 30
Et Spring Integration dans tout ça? Spring Integration a une approche totalement différente Camel est route-oriented SI est composant-oriented (philosophie Spring) Syntaxe SI est 100% XML (pas de DSL) SI est plus fidèle aux définitions des EIP Message Channel Channel Adapter On retrouve les mêmes EIP de routage / transformation Aggregator, Splitter, Resequencer, Dynamic router 31
SI Concepts clés Type de Message channel Pollable channel Subscribable channel Intégration de beans Spring plus intuitive Gateway Service activator Notion native de Bridge Contrôleur de flux 32
Comparaison A fonctionnalités équivalentes SI est plus complexe à mettre en œuvre Moins intuitif Syntaxe XML obligatoire, plus verbeux Camel est plus plug'n'play 33
Démo 34
Questions? Merci! raphael.delaporte@zenika.com http://blog.zenika.com Et n'oubliez pas, nous vous attendons tous à la What's Next 2012 les 14 et 15 juin 35