Spring Native

Ein Java-Weg in die Cloud

Pia Diedam
Matthias Kutz

Motivation

Wege in die Cloud

Spring Native

Motivation

Java is still here

Java ist seit vielen Jahren eine der verbreitesten Programmiersprachen1

Spring hat sich über die letzten Jahrzehnte als de-facto-Standard für die Enterprise-Entwicklung etabliert

Java im Betrieb

  • In ganz klassicher Weise auf Applikationsservern
  • Spring Boot bündelt Deployment-Artefakte + Applikationsserver

Java im Betrieb

  • In ganz klassicher Weise auf Applikationsservern
  • Spring Boot bündelt Deployment-Artefakte + Applikationsserver

Aber ...

  • ... Anwendungen können monolithisch werden
  • ... die Skalierung kann aufwendig sein

Java im Betrieb

  • In ganz klassicher Weise auf Applikationsservern
  • Spring Boot bündelt Deployment-Artefakte + Applikationsserver

Aber ...

  • ... Anwendungen können monolithisch werden
  • ... die Skalierung kann aufwendig sein

Und ...

  • ... die Cloud macht einiges anders

Die Cloud und ihre Anforderungen

  • Container und Kubernetes setzen auf Microservices
  • Anwendungen sollten effizient mit Neustarts umgehen
  • Ressourcen werden je nach Verbrauch abgerechnet

Java + Cloud = Challenge?

  • Relevante Teile der Kompilierung geschehen erst zur Laufzeit: Just in Time (JIT)
  • Vergleichsweise hoher Speicherverbrauch zur Laufzeit
  • Bestimmte Features, wie beispielsweise Reflection, erhöhen die Startup-Time

Wie lösen wir das Problem?

🤔

Wege in die Cloud

Microservice-Standards für Java

Alternative Frameworks

Quarkus

Micronaut

Spring Cloud

  • Spring Sub-Projekt für den Cloud-Betrieb
  • Features wie Function-as-a-Service (FaaS)

Coordinated Restore at Checkpoint (CRaC)

  • Mechanismus, um einen Snapshot seiner laufenden Java-Anwendung zu erzeugen
  • Durch Wiederherstellung des Snapshots soll die Start-Up-Time eingespart werden
  • Unterstützung für Spring Boot, Quarkus und Micronaut
  • Befindet sich im frühen experimentellen Stadium

Was macht diese Lösungen unattraktiv?


Entweder ...

  • ... Framework-Migration bei vorhandenen Systemen
  • ... Umbau der Architektur
  • ... schafft es einen möglichen Vendor-Lock-In
  • ... sie sind noch nicht ausgereift genug

Spring Native

Native Images

  • Extrem schnelle Startzeiten
  • Minimaler Speicherverbrauch
  • Kurze Antwortzeiten

Ahead of Time (AOT) Compilation

  • Der Classpath ist zum Zeitpunkt des Bauens fest definiert
  • Die Anwendung kann zur Laufzeit nicht mehr verändert werden
  • Generierung von:
    • Java Source Code
    • Bytecode
    • GraalVM JSON Dateien, zur Laufzeitkonfiguration

Was bisher geschah...

Was bisher geschah...

Spring Native stand als experimentelles Feature zur Verfügung.


					
						org.springframework.experimental
						spring-native
						0.12.0
					
				

Was bisher geschah...

Die Konfiguration von Spring Native war dementsprechend aufwendig.


					

Vgl.: https://github.com/viadee/spring-native-demo

Was bisher geschah...

Regelmäßige Änderungen und ein aufwendiges Setup waren für produktiven Einsatz schwer nutzbar.

November 2022:

Release Spring 6 und Spring Boot 3

Spring Boot 3

  • Offizielle Unterstützung nativer Images
  • Integrierter Build-Prozess

Demo

Vorteile

Startzeiten

JVM


						

Native Image


						

Vorteile

Arbeitsspeicher

Vorteile

Imagegröße

Build-Prozess

  • Maven (und Gradle) Goals verfügbar
  • Native Images können direkt in Docker-Containern gebaut werden

Einschränkungen

Native Images unterscheiden sich fundamental von der gewohnten JVM-Laufzeitumgebung.

Einschränkungen

Build-Prozess

  • Der Build-Prozess verlängert sich signifikant.

💡

  • Buildpacks zur Optimierung des Prozesses
  • Organisatorische Entzerrung des Entwicklungsprozesses

Einschränkungen

Nicht unterstützte Spring-Features

  • Profiles
  • Veränderbare Properties werden nicht unterstützt (z.B. @ConditionalOnProperty)

💡

  • Im Detail zu prüfen (Profiles können bspw. zum Build-Zeitpunkt festgelegt werden)

Einschränkungen

Third Party Libraries

  • Bibliotheken werden möglicherweise nicht unterstützt

💡

  • Tracing Agent ermittelt alle zu konfigurierenden Klassen
  • Laufende Aktualisierung der unterstützen Bibliotheken
  • Community entwickelt sich laufend

Fazit

Spring Native: Ein Java-Weg in die Cloud

Pia Diedam
Matthias Kutz

Quellen

1: https://www.tiobe.com/tiobe-index/