© Studio_G/Shutterstock.com
Wenn Java EE und MicroProfile auf Kubernetes und Istio treffen …

Ein Cloud-Native-Starter-Projekt


Nicht jede neue Anwendung muss als Microservices-Architektur „cloud-native“ entwickelt werden, aber das Thema Cloud-native hat mittlerweile sicherlich den Hypestatus überwunden und sich als feste Größe in der Anwendungsentwicklung etabliert. Allerdings bedeutet der Umstieg auf Cloud-native, dass man viel Neues lernen und alte Gewohnheiten aufgeben muss. Das kann schon viel auf einmal sein, wie wir selbst erfahren haben.

Anfang des Jahres haben wir in unserem Team entschieden, dass wir uns mit dem Thema Java EE und Container beschäftigen wollen. Java EE, weil es immer noch die meistverwendete Sprache im Enterprise-Umfeld ist, und Container, da sie praktisch unumgänglich sind, wenn es um Cloud-native-Anwendungen geht. Cloudtechnologie ist ja auch ein wichtiger Baustein für die Themen Digitalisierung und Anwendungsmodernisierung im genannten Enterprise-Umfeld. Unser Ziel war es, herauszufinden, ob man für Anforderungen an Ausfallsicherheit, Testing, Monitoring usw. besser die Funktionen einer Plattform wie Istio [1] verwendet oder die Funktionen eines Frameworks wie MicroProfile [2]. Dabei stellten wir fest, dass es im Internet dafür zwar viele Beispiele gibt, diese aber entweder nur einzelne Aspekte betrachten, auf proprietären Produkten basieren oder so komplex waren, dass sie auf einem typischen Notebook nicht installierbar wären. Deshalb entstand unser Cloud-Native-Starter-Projekt, das komplett auf Open Source basiert, selbst Open Source und mit Hilfe von Skripten für jeden einfach installierbar ist, und von uns auf GitHub veröffentlicht wurde [3]. Wir wollten dabei alle (oder zumindest die meisten) Aspekte abdecken, die einen Anwendungsentwickler im Enterprise-Umfeld zum Thema Cloud-native interessieren könnten:

  • Java und REST APIs

  • Traffic Routing (Dark Launches, Canary Deployments)

  • Resiliency (Verhalten der Anwendung im Fehlerfall)

  • Authentication, Authorization

  • Verteiltes Logging und Monitoring

  • Health Checks

  • Konfiguration

  • Persistenz mit Java Persistence API

Zusätzlich wollten wir es auf möglichst vielen Umgebungen realisieren – im Moment haben wir Skripte für:

  • Minikube

  • IBM Cloud Kubernetes Service

  • Minishift

  • OpenShift auf der IBM Cloud

Im GitHub-Projekt sind momentan weit über 20 Blogartikel verlinkt, die wir zu einzelnen Themenbereichen geschrieben haben. Einige davon zitiere ich in diesem Artikel, und es ist zusätzlich ein kompletter Hands-on-Workshop zum Thema Cloud-native Applications enthalten [4].

Grundlagen

Nachfolgend die Definition für Cloud-native auf der Seite der Cloud Native Computing Foundation [5] (in meiner Übersetzung):

„Cloud-native Computing verwendet einen Open-Source-Softwarestack, um Anwendungen als Sammlung von Microservices zu deployen, jeden einzelnen Microservice in einen eigenen Container zu packen und diese Container dynamisch zu orchestrieren, um die Ressourcenauslastung zu optimieren. Die nativen Cloudtechnologien ermöglichen es Softwareentwicklern, tolle Produkte schneller zu erstellen.“

In anderen Worten: Statt als einen einzigen Monolith entwickeln wir unsere Cloud-native-Anwendung aus einzelnen Microservices. Diese werden als Container (Docker) Images in Containern deployt. Um das Orchestrieren der Container kümmert sich Kubernetes, da es mittlerweile der De-facto-Standard für Containerorchestrierung und außerdem Open Source ist.

Basis für die Microservices sind besagte Docker Images, die mit Hilfe von Dockerfiles gebaut werden. Alle Java-basierten Microservices von Cloud Native Starter verwenden diesen Open-Source-Stack:

  • OpenJ9, die Open Source JVM von IBM [6]

  • OpenJDK, kann OpenJ9 als JVM verwenden [7]

  • MicroProfile als Java EE Framework [2]

  • Open Liberty als Server Runtime und MicroProfile-Implementierung [8]

Im Dockerfile sieht das dann einfach so aus:

FROM open-liberty:microProfile2-java11

Hier stellt sich vielleicht die Frage: Java und Microservices? Ernsthaft? Ja, der Anspruch von MicroProfile ist es, Enterprise Java für eine Microservices-Architektur zu optimieren, und das funktioniert auch.

Die Cloud-Native-Starter-Anwendung

Unsere Beispielanwendung ist eine einfache Microservices-Architektur. Sie besteht aus einem Frontend, das im Browser aufgerufen wird und in Node.js mit dem Vue.js Framework geschrieben ist. Sie zeigt eine Liste unserer Blogeinträge an, für jeden Eintrag den Titel, den Autor und als Details das Twitter Handle und den Link zum Blog (Abb. 1).

uebele_java_istio_1.tif_fmt1.jpgAbb. 1: Clou...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang