Évaluation du code comme outil de débogage

Messieurs, développeurs d'applications java. Aujourd'hui, on vous présente un moyen simple d'utiliser l'évaluation du code, dont la mise en œuvre permettra d'exécuter du code arbitraire dans une application en cours d'exécution, ce qui à son tour fera gagner beaucoup de temps CI / CD.





Pourquoi en ai-je besoin?

Si vous devez développer dans une architecture de microservices, en particulier dans une grande entreprise, alors vous êtes probablement familier avec la situation où vous pouvez voir comment une application fonctionne "au combat" uniquement sur des stands où il existe des intégrations avec d'autres microservices. Et comme tout ne peut pas être vérifié localement sur les stubs, pour tester une hypothèse particulière, vous devez pousser un nouveau code (pas le fait qu'il fonctionne correctement) dans le référentiel ... l'exécuter via CI / CD ... et seulement ensuite à travers les journaux pour comprendre que quelque part quelque chose s'est mal passé. Et c'est bien si les journaux montrent immédiatement où vous vous êtes trompé, car sinon, ce processus de poussée et d'exécution le long des pipelines peut devenir votre cycle de samsara.





L'exécution de code entré dynamiquement aidera à résoudre ce problème.





Comment ça fonctionne?

Comme nous le savons tous, groovy est un langage de programmation entièrement compatible Java avec une compilation dynamique . Ces deux fonctionnalités de groovy nous aideront à implémenter l'évaluation de code pour les applications java. Vous pouvez facilement découvrir comment ajouter vous-même un support groovy à un projet java. Et je vais donner un exemple de la façon d'implémenter l'évaluation du code (dans un sens, similaire à ce que vous pouvez voir lors du débogage dans votre IDE).





1) Créons une classe groovy, et dans celle-ci une chaîne de modèle dans laquelle nous placerons une classe et un espace réservé pour le code entré dynamiquement. Un exemple d'une telle ligne:





def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
	def get() {
		%s
	}
}
"""
      
      



Remarque: le package doit être le même que la classe dans laquelle vous allez écrire ce code.





La raison pour laquelle nous mettons en œuvre le fournisseur sera décrite ci-dessous.





2) Compilez et chargez dynamiquement cette classe.





REST , code .





def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code)
def supplier = groovyClassLoader.parseClass(finalClassCode)
                                .getDeclaredConstructor()
                                .newInstance() as Supplier<Object>
def result = supplier.get()
      
      



%s .





, . Supplier , . Supplier<Object> .





.





code evaluation

web kubernetes. - , , , CI/CD POD , . , , - NullPointerException.





HTTP , applicationContext, . , CI/CD. . .





web spring boot

groovy java , , , , - evaluator-spring-boot-starter





, , spring boot starter. web http://host:port/eval WEB-UI, , . , . , , curl wget POD, http://host:port/eval/groovy GET POST .





, - readme .





Capture d'écran de l'évaluateur WEB-UI-spring-boot-starter
WEB-UI evaluator-spring-boot-starter

  • Démontré comment l'évaluation du code peut gagner du temps lors du débogage d'une application





  • Démonstration de la mise en œuvre de l'évaluation de code dans un projet Java





  • Démonstration d'une solution prête à l'emploi sous la forme d'un démarreur à ressort.








All Articles