Möglichkeiten, eine Spring-Anwendung auf der Azure Cloud zu betreiben

Auf Azure gibt es unzählige Möglichkeiten, eine Java Anwendung zu betreiben. In diesem Artikel möchte ich anhand eines Beispiels vier verschiedene Methoden zeigen, wie man eine Spring Boot Applikation auf Microsoft Azure deployen kann.

“as a Service”

Bestimmt hast du den Ausdruck „as a Service“ auch schon mal gehört. Genau um das geht es in diesem Blogpost. Ich werde IaaS, CaaS, PaaS und FaaS anhand eines Beispiels erklären.  As a Service bedeutet, dass du etwas als einen Service bei einem Anbieter konsumieren kannst, ohne dabei etwas lokal installiert zu haben. Sprich, du betreibst deine Applikation nicht mehr bei dir selbst, sondern überlässt dies beispielsweise Azure und gibst dadurch auch die Verantwortung ab. Somit kann sich ein Entwickler auch wirklich auf das Essentielle konzentrieren und muss nicht mehr viel Zeit aufwenden für das Deployment und die IT Infrastruktur.

Infrastructure as a Service

IaaS ist für Informatiker wohl am einfachsten zu verstehen. Das bedeutet eigentlich nichts anderes, als eine komplett virtuelle Maschine auf einer Cloud zu mieten. Vorteil davon ist wohl, dass man nur wenig Neues lernen muss, um es aufzusetzen und es passiert auch wenig „Magie“ im Hintergrund, also hat man auch mehr Kontrolle. Nachteil ist aber, dass man für die Wartung der VM selber verantwortlich ist und auch, dass das Deployen von neuen Versionen deines Code mühsamer ist, als bei anderen Varianten.


Um eine Spring-Anwendung auf IaaS zu betreiben, erstellt man sich eine VM unter dem Azure Service „Virtual machines“. Um darauf Java laufen zu lassen, muss zunächst noch die JRE manuell installiert werden. Danach muss man den Code oder die Jar-Datei der Anwendung noch irgendwie auf die VM laden. Dies ist beispielsweise mit einem Git Repository oder mit einer SSH Connection möglich. Erst dann kann man die Spring Boot-Anwendung wie gewohnt laufen lassen. Aber vergiss nicht, in den VM Einstellungen die Ports freizuschalten, welche deine Anwendung braucht, beispielsweise für Internetzugang oder Datenbankverbindung.

Container as a Service

CaaS bedeutet, dass man die Applikation als Container (z. B. als Docker Container) in die Cloud hochlädt, und die Cloud betreibt dann diesen Container. Also Azure kümmert sich rein um das Hosting der Container-Instanzen. Um das zu realisieren, muss das Projekt zunächst “dockerisiert” werden. Anleitungen wie man eine Spring Anwendung in Docker verpackt, gibt es genügend im Internet, daher werde ich darauf nicht eingehen. Azure verlangt eine Image Registry, von der es die Images beziehen kann, um einen Container laufen zu lassen. Docker-Hub wäre ein bekanntes Beispiel, welches man hier verwenden könnte. Aber man kann auch eigene Registries oder Azure Registries verbinden. Man kann sich selbst eine Azure Registry erstellen unter dem Service „Container registries“. Danach lädt man das lokale Docker Image mit dem docker push Befehl auf die Azure Registry hoch. Um dieses Image dann laufen zu lassen, erstellt man einen „Container instances“ Service und wählt dort das Image aus der Azure Registry. Aber auch hier muss man die Ports noch manuell öffnen in den Einstellungen des „Container instances“ und im Dockerfile. Und schon läuft deine Container-Instanz in der Cloud. Man muss jedoch beachten, dass Azure hier kein automatisiertes Skalieren oder Load Balancing macht. Falls dich das Thema CaaS auf Azure interessiert, mein Kollege Oliver hat eine sehr detaillierte Anleitung geschrieben, wie man eine Spring Boot Applikation mit Docker auf Azure laufen lässt.

Platform as a Service

Bei einer Platform as a Service ist man noch eine Abstraktionsschicht tiefer. Einfach gesagt will man bei diesem Prinzip nicht mehr ganze Container hochladen, sondern man gibt der Plattform einfach den programmierten Code und die soll dann selbst wissen, was damit anzufangen ist. Azure unterstützt dies mit vielen gängigen Programmiersprachen wie Java, .NET, Python, Node.js und noch weitere. Wenn man also Java Code hochlädt, dann weiss die Azure Cloud, wie es das bereitstellen kann und macht das automatisiert. Azure übernimmt hier auch automatisch die Skalierung des Apps und schaut, dass es jederzeit verfügbar ist. Das nimmt dem Entwickler viel Arbeit ab. Dieser Service heisst auf Azure „App Services“. Um unsere Spring Boot Applikation auf einen App Service zu deployen, benötigt es ein Gradle Plugin namens „azurewebapp“. Mit dem wird das Repository mit der Azure Cloud verbunden. Nun kann man den Code mit dem Befehl „./gradlew jar azureWebAppDeploy“ hochladen. Als Antwort auf diesen Befehl erhält man auch die Adresse, unter welcher man die Applikation erreichen kann.

Function as a Service

Und zuletzt werde ich noch die Möglichkeit FaaS zeigen. Die Idee hinter FaaS ist, dass man nur noch einzelne Funktionen als Services hat, welche kurzlebig sind. Sprich, sie werden hochgefahren wenn sie gebraucht werden und danach wieder automatisch beendet. Azure übernimmt bei diesem Service auch die Skalierung komplett. Also ist es egal, ob nur 5 Aufrufe pro Stunde oder 10‘000 Aufrufe pro Sekunde kommen, das wird alles automatisch geregelt und läuft immer problemlos. Bei dem Service wird nur die reine Laufzeit bezahlt, was in vielen Fällen billiger ist, als andere Services. Jedoch mit dem Nachteil, dass die Reaktionszeit u. U. länger ist, da die Instanz extra gestartet werden muss bei einer Anfrage. Azure bietet diesen Service unter dem Namen „Azure Function App“ an. Dabei kann man direkt Code definieren, der in der Funktion ausgeführt werden soll, oder es gibt die Möglichkeit, ein Docker Image anzugeben. Das Docker Image kann man wie auch bei CaaS von einer Registry auswählen. Ich konnte hier wieder das gleiche Image von vorhin aus der Azure Registry auswählen und so den Service aufsetzen. Die Reaktionszeit bei einer Anfrage ist erstaunlicherweise trotzdem recht schnell mit ca. 1 bis 1.5 Sekunden. Selbst wenn die Funktion mehrere Tage nicht aufgerufen wurde, ist sie noch so schnell. Das hat damit zu tun, dass Azure hier einen guten Caching-Mechanismus eingebaut hat. Daher eignet sich dieser Service auch durchaus für produktive Sachen.

Fazit

Grundsätzlich ist es recht einfach, eine Spring-Boot Anwendung auf Azure zu betreiben. Je nach Anwendungsfall muss man sich dann halt für einen bestimmten Service entscheiden. Wenn man keine Ahnung von Cloud Technologien hat und sich das auch nicht beibringen will, dann ist wohl IaaS am einfachsten, um etwas zum Laufen zu bringen. Ansonsten würde ich eher zu den anderen Services tendieren, da diese mehr Vorteile von der Cloud bringen. FaaS eignet sich beispielsweise perfekt für wiederkehrende Jobs, die immer zu einem gewissen Zeitpunkt ausgeführt werden müssen. Meiner Meinung nach aber hat die Platform as a Service im Grossen und Ganzen die meisten Vorteile. Es nimmt dem Entwickler viel Arbeit ab, ist unkompliziert zum Aufsetzen und übernimmt automatisch die Skalierung und das Load Balancing für dich. So kann man das volle Potential der Cloud nutzen und sich auf die wichtige Arbeit konzentrieren: das Programmieren.

Short URL for this post: https://wp.me/p4nxik-3IW
This entry was posted in Java Runtimes - VM, Appserver & Cloud and tagged , , . Bookmark the permalink.

Leave a Reply