Viele Unternehmen wollen ihre Services in der Cloud zur Verfügung stellen. Dabei spielt die Anbindung an verschiedene Systeme eine enorm grosse Rolle. Will man beispielsweise in seiner App Kunden einen bestimmten Produktvorschlag machen, weil dieses Produkt gerade vergünstigt angeboten wird, so muss man Daten aus einer Recommendation Engine lesen, diese mit Daten aus einem SAP System anreichern und letztendlich in einer bestimmten Form der App zur Verfügung stellen. Bevor der Benutzer aber überhaupt auf diese Daten zugreifen kann, muss er natürlich authentisiert und authorisiert sein.
Genau bei diesen Aufgaben soll uns Apache Camel, als Integration Platform helfen und daher will ich euch heute die Vor- und auch die Nachteile von Apache Camel aufzeigen. Da ich aber das Thema Cloud mit aufgreifen will, stelle ich euch am Ende ausserdem Apache Camel K vor. Damit ist es möglich Camel Applikation direkt native im Kubernetes Cluster laufen zu lassen.
Vorher aber wie immer erstmal ein paar Fakten über Apache Camel. Das initiale Release von Camel ist im Juni 2007 erschienen. Somit ist Camel wohl das älteste Projekt, welches wir bis jetzt in unserer TechUp Reihe vorgestellt haben. Das Framework wurde von der Apache Software Foundation entwickelt und ist in Java und XML geschrieben. Aufgebaut wurde das Tool auf den von den beiden Autoren Gregor Hohpe und Bobby Woolf geschriebenen Buch Enterprise Integration Pattern, welche speziell für den Entwurf von Enterprise Application Integration und Message Oriented Middleware basierte Systeme geschaffen wurden.
Was ist Apache Camel
Die EIPs (Enterprise Integration Pattern) zeigen uns, dass wir bei der Kommunikation zwischen Komponenten ausschliesslich Messages sowohl als Input, als auch als Output verwenden sollen. Es gibt einen vollständigen Satz von Mustern, aus denen wir auswählen und in unsere verschiedenen Komponenten implementieren können, die dann zusammen das gesamte System bilden.
Apache Camel bietet Schnittstellen für die EIPs, die Basisobjekte, häufig benötigte Implementierungen, Debugging-Tools, ein Konfigurationssystem und viele andere Helfer, die uns eine Menge Zeit sparen, wenn man eine Lösung nach den EIPs implementieren möchten. Es ist also ein vollständig produktionsreifes Framework für Entwickler, die ihre Lösungen nach den EIPs implementieren möchten.
Apache Camel Architektur
Figure: Quelle: https://camel.apache.org/manual/architecture.html
Camel Context
Apache Camel besteht aus einem Herzstück, genannt CamelContext. Dies ist im Prinzip die Runtime, die alles andere zusammenhält. Über den Camel Context hat man Zugriff auf die wichtigsten Services, Komponenten, Type Converters, Registry, Endpoints, Routes, Data Formats und Languages.
Routes
In einer Camel-Route wird der Integration Flow definiert. Um beispielsweise zwei Systeme zu integrieren, kann eine Camel-Route codiert werden, welche angibt, wie diese Systeme integriert werden. Will man zum Beispiel Daten von einer Url laden und diese in eine Datei schreiben, so würde man die folgende Route definieren. Dabei ist zu beachten, dass Routen mit einer der DSLs von Camel definiert werden. Wir nutzen in unseren Beispielen ausschliesslich die Java DSL. Aber auch hierunterscheidet man zwischen der Standard Route Builder Java DSL und der Enpoint Route Builder Java DSL. Letztere von beiden bietet uns typsicherheit, wie wir im folgenden Beispiel sehen können. Ich bevorzuge daher ganz klar die Enpoint Route Builder Variante.
Standard Route Builder Java DSL
|
|
Endpoint Route Builder Java DSL
|
|
Processors
Prozessoren werden verwendet, um Nachrichten während des Routings zu transformieren und zu manipulieren. Müssen wir beispielsweise Daten, welche wir von einer Url laden erstmal modifizieren bevor wir diese weitergeben, können wir dafür einen Processor nutzen. Warum ich “können” schreibe, erkläre ich in einem späteren Schritt, wenn wir uns Beans anschauen.
Components
Komponenten beschreiben in Camel die Erweiterungspunkte. Dadurch können wir Konnektivität zu anderen Systemen hinzufügen. Diese Komponenten stellen anderen Camel Resourcen eine Schnittstelle zur Verfügung, damit diese die Komponente nutzen können.
Apache Camel in der Praxis
Um zu verstehen, was genau Apache Camel macht, erstellen wir uns nun ein Beispielprojekt, welches Daten von einem Rest Endpunkt entgegennimmt, diese aufbereitet und anreichert. Danach werden die Daten an einem Rest-Endpunkt wieder zur Verfügung.
Um ein Camel Projekt zu erstellen, gibt es verschiedene Möglichkeiten. Wir wollen heute eine Spring Boot Applikation erstellen. Ich gehe nicht weiter auf das Setup von Camel Spring Boot ein. Dieses wird in der offiziellen Doku beschrieben.
Um lokale Testdaten zu haben, nutze ich einen Json Mock Server. Dazu wird einfach eine Datei db.json im Projekt erstellt und der Json Server dann mit dieser gestartet. Dieser Server erstellt uns damit 2 Endpunkte (todos und todo-details) die uns die Daten als Json zurückgeben.
|
|
RestRoute
Als erstes wollen wir uns nun um den Endpunkt kümmern, welcher vom Benutzer aufgerufen wird. Es gibt also eine Schnittstelle /todos
welcher uns alle ToDos mit allen Informationen zurückliefert. Wir erstellen uns also erstmal den Endpoint.
|
|
Zeile 6: Registrierung unserer Route als Component. Die Route wird damit automatisch beim Starten der Applikation hinzugefügt.
Zeile 7: Wir erstellen unsere Route basierend auf dem EndpointRestBuilder
Zeile 11: Setzen des Host und Ports für unsere Rest API
Zeile 13-16: Anlegen eines Rest Endpoint auf den Pfad /todos
, welcher JSON erwartet und JSON auch wieder ausgibt. Wir schreiben den Aufruf erstmal als Information ins Log.
Wir können nun die Applikation erstmal starten und sollten dann das folgend Log erhalten.
|
|
In Zeile 14 können wir sehen, dass die Route registriert wurde. Wir können nun also die Route einmal via curl aufrufen und sehen im Log dann wie erwartet die Info Message.
|
|
|
|
ToDo Route
Nun wollen wir uns die Route erstellen, welche uns die Daten vom Backend-Service abruft und entsprechend aufbereitet. Dazu erstellen wir uns eine neue Klasse ToDoRoute
. In dieser definieren wir unsere zweite Route.
|
|
Zeile 15:
Wir starten unsere Route mit einem direkten Einstiegspunkt, welchen wir später in unserer RestRoute angeben.
Zeile 16:
Wir löschen alle Header. Es gibt einen Fehler bei jedem zweiten Aufruf an den Upstream, da irgendein E-Tag ausgewertet wird.
Zeile 17 + 18:
Wir definieren die Header für den Call zum Upstream
Zeile 19:
Hier wird der definitive Aufruf zum Upstream gemacht
Zeile 20:
Wir loggen uns den Body
Nun da wir untere ToDoRoute erstellt haben, wollen wir diese noch in unserer RestRoute aufrufen. Dazu ändern wir die folgende Zeile in der Rest Route folgendermassen ab.
|
|
Nun müssen wir die Applikation einmal neu starten und können erneut einen curl absetzen. Wie wir sehen können erhalten wir als Ausgabe das Json des todos
endpoint unseres Backend Rest Services.
|
|
Nun wollen wir uns noch die Detailinformationen des Todo’s mit ausgeben lassen. Wir wollen also die Informationen des einen Backend-Service mit den Informationen des zweiten Backend-Service anreichern. Camel bietet uns hierfür einen enricher
an, welcher genau für diesen Zweck gemacht wurde, nämlich Content anzureichern. Dazu erweitern wir unsere ToDo Route folgendermassen:
|
|
Zeile 29-50:
Wir definieren unseren Enricher und machen etwas Java-Stream Magic damit wir die eine Liste mit den Daten der anderen Liste anreichern können.
Zeile 64:
Hier wandeln wir die Response von dem ersten Call zum Upstream in eine Liste von ToDo Items
Zeile 65:
Wir nutzen die enrich Komponente um die erste Liste mit einem Call auf den zweiten Backend-Endpoint anzureichern.
Zeile 66:
Nun machen wir aus der Liste wieder einen String, den wir an den Consumer ausgeben.
Schauen wir uns das Ergebnis nach einem Neustart des Servers an.
|
|
Wie wir sehen können sind unsere Daten aus beiden Systemen nun aggregiert.
Wir haben in diesem TechUp nur an der Oberfläche von Apache Camel gekratzt, um zu zeigen, wie effektiv man Endpoints für Consumer bauen kann, welche Daten aus mehreren Backends aggregieren und aufbereiten müssen. Will man also mit einem etablierten Framework und wenig Code eine schnelle Integration zaubern, so ist Apache Camel die richtige Wahl.