Meine Herren, Entwickler von Java-Anwendungen. Heute wird Ihnen eine einfache Möglichkeit zur Verwendung der Code-Auswertung vorgestellt, deren Implementierung die Ausführung von beliebigem Code in einer laufenden Anwendung ermöglicht, was wiederum viel CI / CD-Zeit spart.
Warum brauche ich es?
Wenn Sie sich in einer Microservice-Architektur entwickeln müssen, insbesondere in einem großen Unternehmen, sind Sie höchstwahrscheinlich mit der Situation vertraut, in der Sie sehen können, wie eine Anwendung "im Kampf" nur an Ständen funktioniert, an denen Integrationen mit anderen Microservices vorhanden sind. Und da nicht alle Dinge lokal auf Stubs überprüft werden können, müssen Sie zum Testen einer bestimmten Hypothese neuen Code (nicht die Tatsache, dass er ordnungsgemäß funktioniert) in das Repository verschieben ... ihn über CI / CD ausführen ... und erst dann durch Protokolle zu verstehen, dass irgendwo etwas schief gelaufen ist. Und es ist gut, wenn die Protokolle sofort zeigen, wo Sie sich geirrt haben, denn sonst kann dieser Prozess des Drückens und Laufens entlang der Pipelines zu Ihrem Zyklus von Samsara werden.
Die Ausführung von dynamisch eingegebenem Code hilft, dieses Problem zu lösen.
Wie es funktioniert?
Wie wir alle wissen, ist groovy eine vollständig Java-kompatible Programmiersprache mit dynamischer Kompilierung . Diese beiden Funktionen von groovy helfen uns bei der Implementierung der Code-Auswertung für Java-Anwendungen. Sie können leicht herausfinden, wie Sie einem Java-Projekt selbst groovige Unterstützung hinzufügen können. Und ich werde ein Beispiel geben, wie die Code-Evaluierung implementiert wird (in gewissem Sinne ähnlich wie beim Debuggen in Ihrer IDE).
1) Erstellen wir eine groovige Klasse und darin eine Vorlagenzeichenfolge, in die wir eine Klasse und einen Platzhalter für den dynamisch eingegebenen Code einfügen. Ein Beispiel für eine solche Zeile:
def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
def get() {
%s
}
}
"""
Hinweis: Das Paket muss mit der Klasse identisch sein, in die Sie diesen Code schreiben.
Warum wir den Lieferanten implementieren, wird unten beschrieben.
2) Kompilieren und laden Sie diese Klasse dynamisch.
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 .
Demonstriert, wie die Code-Auswertung beim Debuggen einer Anwendung Zeit sparen kann
Demonstriert, wie die Code-Auswertung in einem Java-Projekt implementiert wird
Demonstrierte eine fertige Lösung in Form eines Federstiefels.