Spring Native Beta Release

Das Spring-Portierungsteam für GraalVM hat kürzlich seine erste Hauptversion veröffentlicht, die Spring Native Beta. Zusammen mit den Entwicklern von GraalVM konnten sie viele Fehler sowohl im Compiler selbst als auch im Frühjahr beheben. Jetzt hat das Projekt offizielle Unterstützung, einen eigenen Veröffentlichungszyklus und Sie können es fühlen.






Das wichtigste Hindernis beim Portieren von Code von JVM in Binärdateien ist das Problem der Verwendung von Chips, die nur in Java enthalten sind - Reflexion, Arbeiten mit dem Klassenpfad, dynamisches Laden von Klassen usw. 





Gemäß der Dokumentation sind die Hauptunterschiede zwischen einer regulären JVM und einer nativen Implementierung wie folgt:





  • Die statische Analyse der gesamten Anwendung wird zur Erstellungszeit durchgeführt.





  • Nicht verwendete Komponenten werden bei der Montage entfernt.





  • Reflexion, Ressourcen und dynamische Proxys können nur mit zusätzlichen Konfigurationen konfiguriert werden.





  • Zur Erstellungszeit sind alle Komponenten im Klassenpfad festgelegt.





  • Kein verzögertes Laden der Klasse: Beim Laden wird alles, was in den ausführbaren Dateien enthalten ist, in den Speicher geladen. Damit der Aufruf von Class.forName ("myClass") ordnungsgemäß funktioniert, muss myClass beispielsweise in der Konfigurationsdatei enthalten sein. Wenn in der Konfigurationsdatei keine Klasse gefunden wird, die zum dynamischen Laden der Klasse angefordert wird, wird eine ClassNotFoundException ausgelöst





  • Ein Teil des Codes wird zur Erstellungszeit ausgeführt, um die Komponenten ordnungsgemäß zu verknüpfen. Zum Beispiel Tests.





, , , - .





Spring AOT, Graal VM .





Spring AOT native-image.properties



, reflection-config.json



, proxy-config.json



resource-config.json



.





Graal VM , META-INF/native-image







, Spring AOT. maven spring-aot-maven-plugin



, gradle - spring-aot-gradle-plugin.



, gradle :





plugins {id 'org.springframework.experimental.aot' version '0.9.0'}







, , .





, , . , .





, WebClient



org.springframework.nativex.hint



, :





@TypeHint(types = Data.class, typeNames = "com.example.webclient.Data$SuperHero")
@SpringBootApplication
public class WebClientApplication {
	// ...
}
      
      



, Data



, SuperHero



. , .





graavlvm , java.lang.reflect.Proxy



@ProxyHint



.





, , :





@ProxyHint(types = {
     org.hibernate.Session.class,
     org.springframework.orm.jpa.EntityManagerProxy.class
})
      
      



- ,  @ResourceHint.



, :





@ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties")
      
      



/ , @InitializationHint:







@InitializationHint(types = org.h2.util.Bits.class,
								    initTime = InitializationTime.BUILD)
      
      



, @NativeHint



:





@Repeatable(NativeHints.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeHint
      
      



, , :





@NativeHint(
    trigger = Driver.class,
    options = "--enable-all-security-services",
    types = @TypeHint(types = {
       FailoverConnectionUrl.class,
       FailoverDnsSrvConnectionUrl.class,
       // ...
    }), resources = {
	@ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties"),
	@ResourceHint(patterns = "com.mysql.cj.LocalizedErrorMessages",
                      isBundle = true)
})
      
      



, , classpath .





Graal VM Spring AOT. 





Spring Native , start.spring.io. JPA spring , CRUD . Graal VM , BP_NATIVE_IMAGE_BUILD_ARGUMENTS



Spring AOT, Buildpacks, “<buildArgs>



pom.xml



, native-image-maven-plugin



.





Tatsächlich führen wir die Befehle mvn spring-boot aus: build-image oder gradle bootBuildImage



- und der Build des Images beginnt. Es ist zu beachten, dass der Kollektor mehr als 7 GB Speicher benötigt, damit die Baugruppe erfolgreich abgeschlossen wurde. Auf meinem Computer dauerte die Montage zusammen mit dem Herunterladen der Bilder nicht länger als 5 Minuten. Gleichzeitig erwies sich das Bild als sehr kompakt, nur 60 MB. Die Anwendung wurde in 0,022 Sekunden gestartet! Das ist ein unglaubliches Ergebnis. Angesichts der Tatsache, dass immer mehr Unternehmen auf K8 umsteigen und eine Anwendung starten und die verwendeten Ressourcen in der modernen Welt sehr wichtig sind, ermöglicht diese Technologie Spring, das Framework Nummer eins für alle Arten von Mikrodiensten zu schaffen, selbst für FaaS-Implementierungen. wo kalte Geschwindigkeit sehr wichtig ist.








All Articles