Evaluación de código como herramienta de depuración

Señores, desarrolladores de aplicaciones java. Hoy, se le presenta una forma sencilla de utilizar la evaluación de código, cuya implementación permitirá que se ejecute código arbitrario en una aplicación en ejecución, lo que a su vez ahorrará mucho tiempo de CI / CD.





¿Por qué lo necesito?

Si tienes que desarrollar en una arquitectura de microservicios, especialmente en una gran empresa, lo más probable es que estés familiarizado con la situación cuando puedas ver cómo funciona una aplicación "en combate" solo en stands donde hay integraciones con otros microservicios. Y dado que no todas las cosas se pueden verificar localmente en stubs, para probar una hipótesis en particular, debe insertar un nuevo código (no el hecho de que funcione correctamente) en el repositorio ... ejecutarlo a través de CI / CD ... y solo entonces a través de los registros para comprender que algo salió mal. Y es bueno si los registros muestran inmediatamente dónde se equivocó, porque de lo contrario este proceso de empujar y correr a lo largo de las tuberías puede convertirse en su ciclo del samsara.





La ejecución de código ingresado dinámicamente ayudará a resolver este problema.





¿Cómo funciona?

Como todos sabemos, groovy es un lenguaje de programación totalmente compatible con Java con compilación dinámica . Estas dos características de groovy nos ayudarán a implementar la evaluación de código para aplicaciones java. Puede descubrir fácilmente cómo agregar soporte maravilloso a un proyecto java usted mismo. Y daré un ejemplo de cómo implementar la evaluación de código (en cierto sentido, similar a lo que puede ver durante la depuración en su IDE).





1) Creemos una clase maravillosa, y en ella una cadena de plantilla en la que colocaremos una clase y un marcador de posición para el código ingresado dinámicamente. Un ejemplo de tal línea:





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



Nota: el paquete debe ser el mismo que la clase en la que escribirá este código.





Por qué estamos implementando Proveedor se describirá a continuación.





2) Compile y cargue dinámicamente esta clase.





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 .





Captura de pantalla de WEB-UI evaluator-spring-boot-starter
WEB-UI evaluator-spring-boot-starter

  • Demostró cómo la evaluación de código puede ahorrar tiempo al depurar una aplicación.





  • Demostró cómo implementar la evaluación de código en un proyecto java.





  • Demostró una solución preparada en forma de arrancador de arranque de primavera.








All Articles