Bei Serverless Computing [1] werden Server zur Ausführung des Programmcodes genutzt, genau wie bei klassischem Deployment auf Bare Metal, bei einer der diversen Virtualisierungslösungen oder bei Containern. Alle Aspekte der Server-Infrastruktur, wie Skalierung, Patching, Load-Balancing und Kapazitätsplanung, werden jedoch vom Cloud-Anbieter übernommen und vor der Anwendungsentwicklung wegabstrahiert.
Auch wenn der Betrieb der Server-Infrastruktur in der Verantwortung der Cloud-Provider liegt, in unserem Fall bei Amazon Web Services (AWS), müssen die für die Anwendung benötigten Komponenten der Infrastruktur, seien es Datenbanken, Message Queues, API-Gateways oder Funktionsaufrufe, beschrieben und verwaltet werden. Hier bietet AWS für seine Cloud die AWS Management Console und das AWS Command Line Interface (CLI).
Für uns als Entwicklerinnen und Entwickler ist allerdings IaC eine effektive Methodik. Dabei werden die Infrastrukturkomponenten durch Code definiert und konfiguriert. Vorteile dieser Praxis sehen wir unter anderem in der Automatisierung der Bereitstellung von Infrastrukturkomponenten.
Ein weiterer Vorteil ist die Möglichkeit der Nachverfolgung von Änderungen sowie die Option für Rollbacks. Zudem wird die Dokumentation durch die Versionierung der Infrastrukturbeschreibung neben dem Anwendungscode verbessert. Schließlich werden durch diese Praxis auch die Wiederholbarkeit und Konsistenz bei der Nutzung in verschiedenen Umgebungen (z. B. Entwicklung, Test, Produktion) gewährleistet.
Hier bietet das Amazon Web Service Cloud Development Kit (AWS CDK [2]) einen interessanten Ansatz, der uns Java-Entwicklerinnen und -Entwicklern einen Schritt näherkommt und den Einstieg erleichtert. Anders als die deklarative Beschreibung in YAML oder JSON können die Infrastrukturressourcen in Java beschrieben werden und AWS CDK ist damit deutlich entwicklerfreundlicher.
In Java können auch Funktionen [3], bei AWS Lambdas genannt, implementiert werden. Diese werden, anders als im klassischen Deployment, nur eventgetrieben ausgeführt. Da keine durchgehend laufende Anwendung vorhanden ist, kann in vielen Fällen unter anderem Geld gespart werden, da die Anbieter nur die tatsächlich genutzten Ressourcen, die tatsächliche Ausführungszeit, in Rechnung stellen.
Für die Anwendung, die wir als Fallbeispiel in diesem Artikel nutzen, haben wir uns für das Framework Quarkus [4] zur Implementierung der Fachlogik entschieden. Quarkus wurde speziell für die Entwicklung von Cloud-nativen und containerisierten Anwendungen optimiert. Mit schnellen Startzeiten und geringem Speicherverbrauch eignet es sich auch gut für die Entwicklung von Serverless-Anwendungen.
Durch die Verwendung von Standards und verbreiteten Libraries, einschließlich MicroProfile, Hibernate und RESTEasy, sowie einer ausführlichen Dokumentation ist der Einstieg in die Anwendungsentwicklung mit Quarkus sehr niederschwellig und bietet eine effiziente und angenehme Entwicklungserfahrung.
Schöne neue Welt – aber was ist mit Java?
Für uns liegt der besondere Charme in der Nutzung von AWS CDK im Zusammenspiel mit Quarkus darin, dass wir sowohl beim Entwickeln der Anwendungslogik als auch bei der Beschreibung der Infrastruktur Java einsetzen können, und somit auf jeglichen Sprachwechsel verzichten.
Wir können sowohl in der Anwendung als auch bei der Infrastrukturbeschreibung auf bekannte Architekturmuster und Patterns zurückgreifen. So haben wir uns bei der Quarkus-Beispielanwendung an der Onion-Architektur angelehnt. Außerdem nutzt das AWS CDK zur Beschreibung der Infrastruktur und dessen Komponenten häufig das objektorientierte Builder-Pattern. Somit können wir mit bewährten Praktiken der Java-Entwicklung in der Cloud fortsetzen.
Serverless Swag – Hoodies aus der Cloud
Als Fallbeispiel einer Cloud-native Anwendung betrachten wir einen realen Bestellprozess. Mit diesem können Mitarbeiterinnen und Mitarbeiter der viadee Unternehmensberatung AG Bekleidung mit viadee-Branding beziehen. Durch die Auswahl von Größe, Farbe, Typ usw. sowie die Angabe von optionalen Eigenschaften, wie Name und Slogan, kann ein individuelles Kleidungsstück bestellt werden. Exemplarisch ist in Abbildung 1 ein Hoody abgebildet, der mit diesem Prozess bestellt werden kann.
Abb. 1: Beispiel für individuelles Kleidungsstück