BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Actualités Convertir Les Applications Spring Boot En GraalVM Avec Spring Native Beta

Convertir Les Applications Spring Boot En GraalVM Avec Spring Native Beta

Favoris

Spring a publié un nouvel outil, Spring Native Beta, pour convertir les applications Spring Boot, écrites en Java ou Kotlin, en images natives GraalVM. L'objectif est de prendre en charge les applications Spring Boot sur Spring Native. Les images natives GraalVM sont petites, optimisées et démarrent rapidement. Les compromis, cependant, sont des temps de construction plus longs et moins d'optimisations d'exécution par rapport à la JVM.

Travaillant avec l'équipe GraalVM au cours des 18 derniers mois, Spring Native agit comme un pont pour s'assurer que GraalVM comprend le code Spring Boot traditionnel. Vojin Jovanovic, directeur de recherche chez Oracle Labs, parlant de leur collaboration avec Spring, a déclaré :

C'est une grande joie de collaborer avec l'équipe Spring sur la création de l'écosystème JVM natif : leurs connaissances techniques approfondies, enveloppées d'une touche sensible pour la communauté, conduisent toujours aux meilleures solutions. La dernière version de Spring Native et ses nombreuses utilisations dans l'écosystème JVM ouvrent la voie à une large adoption de la compilation native.

Sous le capot, les plugins ahead-of-time (AOT), fournis par Maven et Gradle, sont utilisés pour transformer une application Spring Boot en code natif. Ces plugins génèrent une configuration native GraalVM pour tous les éléments Spring qui ne sont pas pris en charge par GraalVM tels que la réflexion et les proxies. La configuration résultante est stockée dans le fichier reflect-config.json. Par exemple, chaque classe annotée avec @Service est configurée dans le fichier JSON.

Les fichiers de configuration Spring Native sont détectables en supposant qu'ils résident dans le dossier META-INF/native-image. Des Native hints sont disponibles pour configurer les éléments que Spring Native ne prend pas en charge (encore), comme la configuration du pilote MySQL.

La dépendance Spring Native est disponible dans Spring Initializr lors de la création d'un nouveau projet.

Certaines dépendances, telles que Spring Data JPA, nécessitent une configuration supplémentaire pour prendre en charge GraalVM. L'équipe Spring fournit ces configurations supplémentaires via des plugins. Après l'ajout de la dépendance Spring Data JPA dans Intitializr, par exemple, deux plugins Maven supplémentaires, spring-aot-maven-plugin et hibernate-enhancement-maven-plugin, y compris leur configuration sont ajoutés au fichier pom.xml.

Toutes les dépendances ne sont pas prises en charge par Spring Native pour le moment. Si une dépendance non prise en charge est incluse dans le projet Spring généré par Intializr, le fichier HELP.md la listera.

Comme toute autre application Spring Boot, Initializr crée automatiquement la classe de point d'entrée appropriée pour exécuter l'application :

@SpringBootApplication
public class NativeApplication {

	public static void main(String[] args) {
		SpringApplication.run(NativeApplication.class, args);
	}
}

Ensuite, fournissez un contrôleur REST pour tester l'application :

@Controller
public class NativeEndpoint {

    @GetMapping("/native")
    public String nativeCall() {
        return "Native";
    }
}

À l'exception des dépendances standard de Spring Boot, une nouvelle dépendance a été ajoutée par Initializr pour la prise en charge de Spring Native :

<dependency>
	<groupId>org.springframework.experimental</groupId>
	<artifactId>spring-native</artifactId>
	<version>${spring-native.version}</version>
</dependency>

Le spring-boot-maven-plugin possède une configuration supplémentaire pour générer l'image native :

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<image>
			<builder>paketobuildpacks/builder:tiny</builder>
			<env>
				<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
			</env>
		</image>
	</configuration>
</plugin>

Maven peut être utilisé pour générer l'image native avec une compilation ahead-of-time. L'exécutable résultant comprend toutes les classes nécessaires et le code natif lié statiquement à partir du JDK. Substrate VM est utilisé comme système d'exécution au lieu de la machine virtuelle Java «normale».

$ ./mvnw spring-boot:build-image

La construction de l'image prend un certain temps pendant que le code est compilé et optimisé. Cette étape est exécutée dans une image Docker et nécessite beaucoup de mémoire. Les paramètres de mémoire de Docker doivent être augmentés si l'erreur suivante se produit :

Exception in thread "native-image pid watcher" java.lang.OutOfMemoryError: 
   GC overhead limit exceeded

La sortie de l'exécution de la commande Maven ci-dessus montre l'image Docker résultante qui contient l'image native GraalVM :

Successfully built image 'docker.io/library/native:0.0.1-SNAPSHOT'

L'image résultante fait environ 82 Mo et contient tout pour exécuter l'application :

$ docker images
native  0.0.1-SNAPSHOT ... 81.9MB

Le conteneur Docker est démarré sur le port 8080 :

$ docker run -p 8080:8080 native:0.0.1-SNAPSHOT

Après le démarrage du conteneur, l'application est presque instantanément disponible pour les tests :

$ curl localhost:8080/native --silent
Native

Plus de détails peuvent être trouvés dans la documentation Spring Native, y compris une alternative à l'installation de GraalVM avec Docker.

L'équipe Spring a fourni de nombreux exemples sur la façon d'utiliser Spring Native en conjonction avec d'autres projets Spring. Des présentations à QCon et SpringOne avec des informations plus détaillées sur les performances de GraalVM et l'intégration de Spring Boot avec des images natives GraalVM, respectivement, sont également disponibles.

 

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT