Initialisation paresseuse dans Spring Boot 2.2


D'après un traducteur: étant donné que le framework Spring est l'un des principaux frameworks sur lesquels nous construisons CUBA , les nouvelles sur les nouvelles fonctionnalités Spring ne passent pas inaperçues de notre part. L'initialisation paresseuse est un moyen de réduire le premier temps de démarrage de l'application, qui à notre époque de l'utilisation généralisée des microservices est une mesure importante. Pour ceux qui préfèrent lire des vidéos, il y a une présentation de 10 minutes de Josh Long sur le sujet de l'article.


La première version jalon récemment annoncée de Spring Boot 2.2 ajoute la prise en charge de l'initialisation paresseuse. Dans cet article, nous examinerons les nouvelles fonctionnalités et expliquerons comment les activer.


Que signifie être paresseux?


Spring Framework prend en charge l'initialisation paresseuse depuis que son code source est passé à git il y a onze ans. Par défaut, lorsque le contexte de l'application est mis à jour, chaque bean est recréé et ses dépendances sont implémentées. En revanche, si un bac est configuré pour l'initialisation paresseuse, il ne sera pas créé et ses dépendances ne seront pas supprimées tant que cela ne sera pas nécessaire.


Activation de l'initialisation paresseuse


Dans n'importe quelle version de Spring Boot, il est possible d'activer l'initialisation paresseuse, si cela ne vous dérange pas de vous salir les mains avec BeanFactoryPostProcessor . Spring Boot 2.2 simplifie simplement ce processus en introduisant une nouvelle propriété - spring.main.lazy-initialization (il existe également des méthodes équivalentes dans SpringApplication et SpringApplicationBuilder ). Lorsque cette propriété est définie sur true , les beans d'application sont configurés pour utiliser l'initialisation différée.


Les avantages d'une initialisation paresseuse


L'initialisation différée peut réduire considérablement l'heure de démarrage de votre application, car à ce stade, moins de classes sont chargées et moins de corbeilles sont créées. Par exemple, une petite application Web qui utilise Actuator et Spring Security démarre généralement 2,5 secondes. Et avec l'initialisation paresseuse, ce processus prend 2 secondes. Les valeurs d'accélération exactes varieront d'une application à l'autre, en fonction de la structure du graphique de dépendance du bac.


Note du traducteur: j'ai exécuté cet exemple , en écrivant Spring Boot 2.2 dans les dépendances, et le temps de démarrage avec l'initialisation paresseuse était de 3 secondes, et sans lui 4. Je pense que sur les applications plus sérieuses, un gain significatif en temps de démarrage en raison de l'utilisation de l'initialisation paresseuse nous ne verrons pas. Mise à jour: sur l'avis de alek_sys, la validation et la mise à jour du schéma de base de données ont été désactivées et l' activation de l'initialisation JPA paresseuse dans les deux cas s'est avérée 2,7 et 3,7 secondes avant l' Started WebApplication in...


Et DevTools?


Spring Boot DevTools fournit une accélération significative du développement. Au lieu de redémarrer la JVM et l'application chaque fois que vous modifiez quelque chose, DevTools effectue un «redémarrage à chaud» de l'application dans la même JVM. Un avantage significatif d'un tel redémarrage est qu'il donne à JIT la possibilité d'optimiser le code qui s'exécute au démarrage de l'application. Après plusieurs redémarrages, le temps initial de 2,5 secondes diminue de près de 80% à 500 ms. Avec une initialisation paresseuse, les choses vont encore mieux. La définition de la propriété spring.main.lazy-initialization affiche le temps de redémarrage directement dans l'EDI égal à 400 ms.


Le revers de l'initialisation paresseuse


Comme indiqué ci-dessus, l'inclusion d'une initialisation paresseuse peut réduire considérablement le temps de lancement de l'application. Et vous aurez peut-être un désir irrésistible de l'utiliser constamment, ou du moins vous vous demanderez pourquoi l'initialisation paresseuse n'est pas activée par défaut. Il y a plusieurs effets négatifs possibles qu'il vaut mieux clarifier immédiatement.


Le fait que les classes ne soient pas chargées et que les bacs ne soient pas créés tant qu'ils ne sont pas nécessaires peut masquer des problèmes qui auraient pu être identifiés plus tôt au stade du lancement de l'application. Par exemple, il peut s'agir de l'absence de la classe requise, d'un débordement de mémoire ou d'une erreur associée à une mauvaise configuration.


Dans les applications Web, les configurations paresseuses peuvent augmenter la latence des requêtes HTTP qui provoquent l'initialisation du bac. Il s'agit généralement de la première demande, mais il peut y avoir des effets indésirables supplémentaires affectant l'équilibrage de charge ou la mise à l'échelle automatique.


Cette chose est-elle incluse?


Si vous ne savez pas exactement comment l'initialisation paresseuse affecte votre application ou si vous voulez vérifier que d'autres aspects du framework vous conviennent et faire ce dont vous avez besoin, il vous sera utile d'utiliser un débogueur pour cela. En définissant un point d'arrêt sur le constructeur du bin, vous pouvez voir à quel moment exact le bin est initialisé. Par exemple, dans une application Web écrite dans Spring Boot et avec l'initialisation paresseuse activée, vous pouvez voir que les @Controller marqués avec l'annotation @Controller ne @Controller pas créés jusqu'à la première demande à DispatcerServlet Spring MVC ou à DispatchHandler Spring WebFlux.


Quand activer l'initialisation paresseuse?


Comme nous l'avons vu ci-dessus, l'initialisation paresseuse offre des améliorations notables lors du lancement de l'application, mais il y a aussi des inconvénients, vous devez donc utiliser cette fonctionnalité très soigneusement.


Le processus de développement d'applications est un domaine où l'initialisation paresseuse peut porter ses fruits (sans presque aucun frais supplémentaire). Pendant que vous écrivez une application, le temps de redémarrage réduit fourni par l'initialisation paresseuse en combinaison avec DevTools peut vous faire gagner beaucoup de temps.


Où pouvez-vous obtenir les avantages de l'initialisation paresseuse - c'est dans les tests d'intégration. Vous utilisez peut-être déjà des tests de «découpage» pour réduire le temps d'exécution en limitant le nombre de beans initialisés dans certains types de tests. L'initialisation paresseuse offre une autre possibilité d'obtenir le même résultat. Si vous n'êtes pas en mesure de modifier la structure de l'application pour les tests de «découpage», ou pour vos tests spécifiques, il n'y a pas de «découpage» approprié, alors l'inclusion d'une initialisation paresseuse limitera le nombre de bacs à ceux qui ne sont utilisés que dans votre test. Cela réduira le temps d'exécution des tests, en particulier s'ils s'exécutent dans un environnement isolé pendant le développement.


Activez l'initialisation paresseuse sur la dernière prod. Et, si vous décidez de le faire, faites-le avec prudence. Pour les applications Web, le gestionnaire de conteneurs peut s'appuyer sur le point d'entrée /health , qui répond généralement assez rapidement, mais gardez à l'esprit que, potentiellement, les premiers appels peuvent prendre plus de temps que d'habitude. Vous devez également vous souvenir de la taille de la mémoire allouée à la machine virtuelle Java afin de ne pas rencontrer de débordement lorsque tous les composants sont initialisés.

Source: https://habr.com/ru/post/fr445592/


All Articles