Enterprise Application Integration mit

Apache Camel

22.02.2018

rutz.mario@guj.de --- @basis42

Camel Logo - https://github.com/fi-

Über mich

  • Application Architect - Gruner + Jahr DVS
  • Java / PHP
  • Javascript / CSS
  • MOS 6502 Assembler
  • ...

Agenda

  • Motivation
  • Enterprise Application Integration
  • Apache Camel
  • Real-life Beispiel
  • Lessons learned
  • Ausblick

Motivation

Wie sind wir aufs Kamel gekommen?

Anbindung eines weiteren CRM Systems an ein Magento-basiertes Online-Shopsystem

Naiver Ansatz

Das machen wir so wie immer!

Das bestehende CRM als Blueprint

Vorgehen hinterfragt

Das kann man meist besser machen!

(Micro) Services vs. Monolith?

PHP?

Best Practices / Tools?

Enterprise Application Integration

Integration ist nichts neues!
"Enterprise application integration (EAI) is the use of technologies and services across an enterprise to enable the integration of software applications and hardware systems."

Enterprise Integration Patterns

Muster erkennen und anwenden

"Integrationsbibel" von Gregor Hohpe and Bobby Woolf

dokumentieren 65 Integrationspattern

http://www.enterpriseintegrationpatterns.com

Enterprise Integration Patterns

Beispiel

Onix File in einzelne Produkte aufteilen

Integrationslösungen

Welche haben wir betrachtet?
  • Mule von MuleSoft
    • quasi ein kommerzielles Produkt
  • Spring Integration
    • Open Source Apache 2.0 Licence
  • Apache Camel
    • Open Source Apache 2.0 Licence

Apache Camel

And the winner is ...
  • Erster commit vor knapp 11 Jahren(Mai 2007)
  • Version 1.0 Code läuft unverändert auf aktuellem Release 2.20.2
  • Apache Camel implementiert die meisten EIPs
  • 4 DSLs für Routen(Java, XML, Scala, Goovy)

Architektur

Blick aus der Vogelperspektive

Components

Über 200 Components / Integrations

AHC AHC-WS AMQP APNS Atmosphere-Websocket Atom Avro AWS-CW AWS-DDB AWS-DDBSTREAM AWS-EC2 AWS-SDB AWS-SES AWS-SNS AWS-SQS AWS-SWF AWS-S3 Bean Beanstalk Bean Validator Box BraintreeBrowse Cache Cassandra Class Chronicle Engine Chunk CMIS Cometd Consul Context ControlBus CouchDB Crypto (Digital Signatures) CXF CXF Bean CXFRS DataFormat DataSet Direct Direct-VM DNS Disruptor Docker Dozer Dropbox EJB Ehcache ElasticSearch Etcd Spring Event EventAdmin Exec Facebook File Flatpack Flink FOP FreeMarker FTP FTPS Ganglia Gauth GHttp Git Github Glogin Gtask Google Calendar Google Drive Google Mail Gmail Gora Grape Geocoder Google Guava EventBus Hazelcast Hbase HDFS HDFS2 Hipchat HL7 Infinispan HTTP HTTP4 iBATIS Ignite IMAP IMAPS IRC IronMQ JavaSpace jBPM jcache jcloudsJCR JDBC Jetty Jgroups JIRA JMS JMX JPA JOLT Jsch JT/400 Kafka Kestrel Krati Kubernetes Kura Language LDAP LinkedIn Log Lucene Lumberjack Metrics MINA MINA2 Mock MLLP MongoDB MongoDB GridFS MQTT MSV Mustache MVEL MyBatis Nagios NATS Netty Netty4 Netty HTTP Netty4 HTTP Olingo2 Openshift OptaPlanner Paho Pax-Logging PDF POP3 POP3S PrinterProperties Quartz Quartz2 Quickfix RabbitMQ Ref Rest Restlet REST Swagger RMI RNC RNG Routebox RSS Salesforce SAP NetWeaver Scheduler schematron SEDA ServiceNow SERVLET SFTP Sip SIPS SJMS SJMS Batch Slack SMTP SMPP SMPPS SNMP Solr Apache Spark Spark-rest Splunk SpringBatch SpringIntegration Spring LDAP Spring Redis Spring Web Services SQL SQL Stored Procedure SSH component StAX Stream Stomp StringTemplate Stub Telegram Test Timer Twitter Undertow Validation Velocity Vertx VM Weather Websocket XML Security XMPP Xquery XSLT Yammer Zookeeper

AHC AHC-WS AMQP APNS Atmosphere-Websocket Atom Avro AWS-CW AWS-DDB AWS-DDBSTREAM AWS-EC2 AWS-SDB AWS-SES AWS-SNS AWS-SQS AWS-SWF AWS-S3 Bean Beanstalk Bean Validator Box BraintreeBrowse Cache Cassandra Class Chronicle Engine Chunk CMIS Cometd Consul Context ControlBus CouchDB Crypto (Digital Signatures) CXF CXF Bean CXFRS DataFormat DataSet Direct Direct-VM DNS Disruptor Docker Dozer Dropbox EJB Ehcache ElasticSearch Etcd Spring Event EventAdmin Exec Facebook File Flatpack Flink FOP FreeMarker FTP FTPS Ganglia Gauth GHttp Git Github Glogin Gtask Google Calendar Google Drive Google Mail Gmail Gora Grape Geocoder Google Guava EventBus Hazelcast Hbase HDFS HDFS2 Hipchat HL7 Infinispan HTTP HTTP4 iBATIS Ignite IMAP IMAPS IRC IronMQ JavaSpace jBPM jcache jcloudsJCR JDBC Jetty Jgroups JIRA JMS JMX JPA JOLT Jsch JT/400 Kafka Kestrel Krati Kubernetes Kura Language LDAP LinkedIn Log Lucene Lumberjack Metrics MINA MINA2 Mock MLLP MongoDB MongoDB GridFS MQTT MSV Mustache MVEL MyBatis Nagios NATS Netty Netty4 Netty HTTP Netty4 HTTP Olingo2 Openshift OptaPlanner Paho Pax-Logging PDF POP3 POP3S PrinterProperties Quartz Quartz2 Quickfix RabbitMQ Ref Rest Restlet REST Swagger RMI RNC RNG Routebox RSS Salesforce SAP NetWeaver Scheduler schematron SEDA ServiceNow SERVLET SFTP Sip SIPS SJMS SJMS Batch Slack SMTP SMPP SMPPS SNMP Solr Apache Spark Spark-rest Splunk SpringBatch SpringIntegration Spring LDAP Spring Redis Spring Web Services SQL SQL Stored Procedure SSH component StAX Stream Stomp StringTemplate Stub Telegram Test Timer Twitter Undertow Validation Velocity Vertx VM Weather Websocket XML Security XMPP Xquery XSLT Yammer Zookeeper

Ein kleines Beispiel

Achtung: Mitmach-Aufgabe :-)

Finde Twitter Tweets mit dem Hashtag #gujtechtalk und generiere mit dem neuesten Tweet eine HTML Seite die via Amazon-S3 CDN ausgeliefert wird.

Apache Camel als Framework

Auch einzelne Funktionen können hilfreich sein

						ProducerTemplate template = exchange.getContext().createProducerTemplate();

						// you can cast the response directly
						String ret = template.requestBody("", String.class);

						// or specify the endpoint directly
						String ret = template.requestBody("aws-s3://rutz2-camel-talk?accessKey=...", "...", String.class);
					

Error Handling

Anything that can go wrong will go wrong

  • Retry by default
  • Custom Redrive-Policies
  • Hystrix Integration

Real-Life Beispiel

So einfach ist es dann doch nicht

Produktimport für https://www.egmont-shop.de

Lessons learned

  • syncrone, zeitkritische Prozesse sind problematisch
  • Business Logic außerhalb Camel
  • EASI als Gesamtsystem wächst schnell
  • Modularisierung wird schnell zum Thema
  • XML DSL ist problematisch
  • Message Tracing via Greylog nicht immer einfach

Ausblick

  • Unabhängig deploybare Module
  • Horizontale Skalierbarkeit
  • Kubernetes Cluster
  • Message Tracing

Dankeschön!

rutz.mario@guj.de --- @basis42 --- www.basis42.de